Unverified Commit a25c190c authored by Kevin Di Lallo's avatar Kevin Di Lallo Committed by GitHub
Browse files

Merge pull request #156 from dilallkx/kd_sp45_dev_metrics

Configurable GitHub & GitLab OAuth providers + Session Metrics
parents 596a71d7 5f40dd57
Loading
Loading
Loading
Loading
+33 −11
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

version: 1.5.9
version: 1.5.10
repo:
  name: AdvantEDGE

@@ -33,7 +33,7 @@ repo:
      # host name
      host: my-platform-fqdn
      # enable https only (redirect http requests to https port)
      https-only: true
      https-only: false
      # bind to host ports (true) or node ports (false)
      host-ports: true
      # http port number
@@ -47,15 +47,37 @@ repo:

    # authentication & authorization config
    auth:
      session:
        # session encryption key k8s secret (data: encryption-key)
      session-key-secret: meep-session
      # Github OAuth k8s secret (data: client-id, secret)
      github-secret: meep-oauth-github
      # Github OAuth k8s secret (data: client-id, secret)
      gitlab-secret: meep-oauth-gitlab
        key-secret: meep-session
        # maximum simultaneous sessions
        max-sessions: 10
      # GitHub OAuth provider config
      github:
        # enable GitHub OAuth
        enabled: true
        # authorization url
        auth-url: https://github.com/login/oauth/authorize
        # access token url
        token-url: https://github.com/login/oauth/access_token
        # OAuth redirect URI
        redirect-uri: https://my-platform-fqdn/platform-ctrl/v1/authorize

        # OAuth k8s secret (data: client-id, secret)
        secret: meep-oauth-github
      # GitLab OAuth provider config
      gitlab:
        # enable GitLab OAuth
        enabled: true
        # authorization url
        auth-url: https://gitlab.com/oauth/authorize
        # access token url
        token-url: https://gitlab.com/oauth/token
        # OAuth redirect URI
        redirect-uri: https://my-platform-fqdn/platform-ctrl/v1/authorize
        # GitLab api url
        # api-url: https://gitlab.com
        # OAuth k8s secret (data: client-id, secret)
        secret: meep-oauth-gitlab

  #------------------------------
  #  Core Subsystem
+9 −1
Original line number Diff line number Diff line
@@ -25,7 +25,15 @@ image:
  pullPolicy: Always
  env:
    MEEP_MAX_SESSIONS: "10"
    MEEP_OAUTH_REDIRECT_URI: "https://<my-platform-fqdn>/platform-ctrl/v1/authorize"
    MEEP_OAUTH_GITHUB_ENABLED: "false"
    MEEP_OAUTH_GITHUB_AUTH_URL: ""
    MEEP_OAUTH_GITHUB_TOKEN_URL: ""
    MEEP_OAUTH_GITHUB_REDIRECT_URI: ""
    MEEP_OAUTH_GITLAB_ENABLED: "false"
    MEEP_OAUTH_GITLAB_AUTH_URL: ""
    MEEP_OAUTH_GITLAB_TOKEN_URL: ""
    MEEP_OAUTH_GITLAB_REDIRECT_URI: ""
    MEEP_OAUTH_GITLAB_API_URL: ""
  envSecret:
    MEEP_SESSION_KEY:
      name: meep-session
+2 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ require (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0
@@ -28,6 +29,7 @@ replace (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr => ../../go-packages/meep-data-key-mgr
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model => ../../go-packages/meep-data-model
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store => ../../go-packages/meep-metric-store
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model => ../../go-packages/meep-model
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq => ../../go-packages/meep-mq
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis
+2 −0
Original line number Diff line number Diff line
@@ -141,6 +141,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e h1:txQltCyjXAqVVSZDArPEhUTg35hKwVIuXwtQo7eAMNQ=
github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+8 −85
Original line number Diff line number Diff line
@@ -23,18 +23,16 @@ import (
	"io/ioutil"
	"math/rand"
	"net/http"
	"os"
	"strconv"
	"time"

	"github.com/gorilla/mux"
	"github.com/roymx/viper"
	"golang.org/x/oauth2"

	couch "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-couch"
	dkm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr"
	dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model"
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
	ms "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store"
	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
@@ -58,6 +56,7 @@ type PlatformCtrl struct {
	sessionMgr    *sm.SessionMgr
	sandboxStore  *ss.SandboxStore
	userStore     *users.Connector
	metricStore   *ms.MetricStore
	mqGlobal      *mq.MsgQueue
	maxSessions   int
	uri           string
@@ -94,12 +93,6 @@ func Init() (err error) {
	// Create new Platform Controller
	pfmCtrl = new(PlatformCtrl)

	// Retrieve maximum session count from environment variable
	if maxSessions, err := strconv.ParseInt(os.Getenv("MEEP_MAX_SESSIONS"), 10, 0); err == nil {
		pfmCtrl.maxSessions = int(maxSessions)
	}
	log.Info("MEEP_MAX_SESSIONS: ", pfmCtrl.maxSessions)

	// Create message queue
	pfmCtrl.mqGlobal, err = mq.NewMsgQueue(mq.GetGlobalName(), moduleName, moduleNamespace, redisDBAddr)
	if err != nil {
@@ -159,28 +152,12 @@ func Init() (err error) {
	}
	log.Info("Connected to Sandbox Store")

	// Connect to Session Manager
	pfmCtrl.sessionMgr, err = sm.NewSessionMgr(moduleName, "", redisDBAddr, redisDBAddr)
	if err != nil {
		log.Error("Failed connection to Session Manager: ", err.Error())
		return err
	}
	log.Info("Connected to Session Manager")

	// Connect to User Store
	pfmCtrl.userStore, err = users.NewConnector(moduleName, postgisUser, postgisPwd, "", "")
	// Initialize OAuth
	err = initOAuth()
	if err != nil {
		log.Error("Failed connection to User Store: ", err.Error())
		log.Error("Failed OAuth Init: ", err.Error())
		return err
	}
	_ = pfmCtrl.userStore.CreateTables()
	log.Info("Connected to User Store")

	// Set endpoint authorization permissions
	setPermissions()

	// Initialize OAuth
	initOAuth()

	log.Info("Platform Controller initialized")
	return nil
@@ -189,10 +166,10 @@ func Init() (err error) {
// Run Starts the Platform Controller
func Run() (err error) {

	// Start Session Watchdog
	err = pfmCtrl.sessionMgr.StartSessionWatchdog(sessionTimeoutCb)
	// Start OAuth
	err = runOAuth()
	if err != nil {
		log.Error("Failed start Session Watchdog: ", err.Error())
		log.Error("Failed to start OAuth: ", err.Error())
		return err
	}

@@ -200,60 +177,6 @@ func Run() (err error) {
	return nil
}

func setPermissions() {

	// Flush old permissions
	ps := pfmCtrl.sessionMgr.GetPermissionStore()
	ps.Flush()

	// Read & apply API permissions from file
	permissionsFile := "/permissions.yaml"
	permissions := viper.New()
	permissions.SetConfigFile(permissionsFile)
	err := permissions.ReadInConfig()
	if err != nil {
		log.Warn("Failed to read permissions from file")
		log.Warn("Granting full API access for all roles by default")
		_ = ps.SetDefaultPermission(&sm.Permission{Mode: sm.ModeAllow})
		return
	}

	// Loop through services
	for service := range permissions.GetStringMap(permissionsRoot) {
		// Default permissions
		if service == "default" {
			permissionsRoute := permissionsRoot + ".default"
			permission := new(sm.Permission)
			permission.Mode = permissions.GetString(permissionsRoute + ".mode")
			permission.RolePermissions = make(map[string]string)
			for role, access := range permissions.GetStringMapString(permissionsRoute + ".roles") {
				permission.RolePermissions[role] = access
			}
			_ = ps.SetDefaultPermission(permission)
		} else {
			// Service route names
			permissionsService := permissionsRoot + "." + service
			for name := range permissions.GetStringMap(permissionsService) {
				permissionsRoute := permissionsService + "." + name
				permission := new(sm.Permission)
				permission.Mode = permissions.GetString(permissionsRoute + ".mode")
				permission.RolePermissions = make(map[string]string)
				for role, access := range permissions.GetStringMapString(permissionsRoute + ".roles") {
					permission.RolePermissions[role] = access
				}
				_ = ps.Set(service, name, permission)
			}
		}
	}
}

func sessionTimeoutCb(session *sm.Session) {
	log.Info("Session timed out. ID[", session.ID, "] Username[", session.Username, "]")

	// Destroy session sandbox
	deleteSandbox(session.Sandbox)
}

// Create a new scenario in the scenario store
// POST /scenario/{name}
func pcCreateScenario(w http.ResponseWriter, r *http.Request) {
Loading