Commit 223226dc authored by Yann Garcia's avatar Yann Garcia
Browse files

Move demo4-ue as external application

parent 43163815
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -20,4 +20,6 @@ cd $BASEDIR
#find . -name "*.go" -type f -exec golangci-lint run {} \;
go build -o $BINDIR/demo-server .

cp -Rp ./api $BINDIR
cp -Rp ./api/  $BINDIR
mv $BINDIR/api/swagger.yaml $BINDIR/api/MEC\ Demo\ 4\ API
cp $BINDIR/api/* $BINDIR/user-api
 No newline at end of file
+0 −4
Original line number Diff line number Diff line
@@ -9,11 +9,9 @@ require (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics 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
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client v0.0.0-20211214133749-f203f7ab4f1c
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client v0.0.0-20211214133749-f203f7ab4f1c
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr v0.0.0
	github.com/google/uuid v1.1.2
	github.com/gorilla/handlers v1.5.1
	github.com/gorilla/mux v1.8.0
@@ -27,9 +25,7 @@ replace (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger => ../../../../../go-packages/meep-http-logger
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../../../../go-packages/meep-logger
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics => ../../../../../go-packages/meep-metrics
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq => ../../../../../go-packages/meep-mq
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../../../../go-packages/meep-redis
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client => ../../../../../go-packages/meep-sandbox-ctrl-client
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client => ../../../../../go-packages/meep-service-mgmt-client
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr => ../../../../../go-packages/meep-swagger-api-mgr
)
+1 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ func main() {
		if err != nil {
			log.Fatal("Failed to initalize Demo 4 ", err)
		}
		log.Info("main: server.Init done")

		// Channel sync pass channel listen for app termination
		server.Run(done)
+78 −132
Original line number Diff line number Diff line
@@ -16,27 +16,22 @@
package server

import (
	//"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
	//"net/url"
	"os"
	"strconv"
	"strings"
	"sync"
	//"time"

	"github.com/AdvantEDGE/examples/demo4-ue/src/demo-server/backend/util"
	asc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client"
	dai "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-dai-client"
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
	sbx "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client"
	smc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client"
	sam "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr"

	uuid "github.com/google/uuid"
	//"github.com/gorilla/mux"
)
@@ -67,19 +62,9 @@ var daiServiceName string
var svcSubscriptionSent bool
var appTerminationSent bool
var serviceRegistered bool
var amsSubscriptionSent bool
var amsServiceCreated bool
var terminated bool
var terminateNotification bool
var appEnablementEnabled bool

// mq
var mqLocal *mq.MsgQueue
var handlerId int
var redisAddr string = "meep-redis-master.default.svc.cluster.local:6379"

// Swagger
var apiMgr *sam.SwaggerApiMgr
var appEnabled bool

// Config fields
var mecUrl string
@@ -87,6 +72,7 @@ var localPort string
var localUrl string
var environment string
var callBackUrl string
var nodeName string

// App service & discovered service
var mecServicesMap = make(map[string]string)
@@ -102,7 +88,7 @@ const defaultConsumedLocalOnly = true

// Demo models
var demoAppInfo ApplicationInstance
var appActivityLogs []string
var appActivityLogs []string = []string{}
var subscriptions ApplicationInstanceSubscriptions
var appEnablementServiceId string
var amsSubscriptionId string
@@ -127,20 +113,17 @@ func Init(envPath string, envName string) (port string, err error) {
	}
	log.Info("Config.Mode: ", config.Mode)
	log.Info("Config.SandboxUrl: ", config.SandboxUrl)
	log.Info("Config.NodeName: ", config.NodeName)
	log.Info("Config.HttpsOnly: ", config.HttpsOnly)
	log.Info("Config.MecPlatform: ", config.MecPlatform)
	log.Info("Config.SandboxName: ", config.SandboxName)
	log.Info("Config.AppInstanceId: ", config.AppInstanceId)
	log.Info("Config.Localurl: ", config.Localurl)
	log.Info("Config.Port: ", config.Port)
	log.Info("Config.ExternalPort: ", config.ExternalPort)
	log.Info("Config.AppName: ", config.AppName)
	log.Info("Config.NodeName: ", config.NodeName)
	config.NodeName = "10.10.20.01" // FIXME Not loaded by config

	// Retrieve environment
	// Sandbox config is set by user
	// AdvantEDGE config is set by env. variable in scenario description
	// AdvantEDGE config is set by default
	if config.Mode == "sandbox" {
		environment = "sandbox"
		// mecUrl is url of the sandbox system
@@ -165,7 +148,6 @@ func Init(envPath string, envName string) (port string, err error) {

		localPort = config.Port
		localUrl = config.Localurl

	} else if config.Mode == "advantedge" {
		environment = "advantedge"
		localPort = config.Port
@@ -174,7 +156,7 @@ func Init(envPath string, envName string) (port string, err error) {
		log.Fatal("Missing field for mode, should be set to advantedge or sandbox")
	}

	// Retrieve mec demo4 url & port
	// Retrieve mec demo3 url & port
	if !strings.HasPrefix(localPort, ":") {
		localPort = ":" + localPort
	}
@@ -185,38 +167,49 @@ func Init(envPath string, envName string) (port string, err error) {
		localUrl = strings.TrimSuffix(localUrl, "/")
	}

	// Retrieve UE application instance
	// Retrieve UE application instance/node name
	instanceName = config.AppInstanceId
	mep = config.NodeName
	log.Info("Init: environment= ", environment, "/localPort= ", localPort, "/localUrl= ", localUrl)
	log.Info("Init: mep= ", mep, "/instanceName= ", instanceName)
	//instanceName = uuid.New().String()
	nodeName = config.NodeName
	log.Info("Init: environment= ", environment, "-  localPort= ", localPort, "-  localUrl= ", localUrl)
	log.Info("Init: nodeName= ", nodeName, " - instanceName= ", instanceName)
	log.Info("Init: mecUrl= ", mecUrl, "-  mep= ", mep)

	// Prepend url & mapped port into callbackurl
	callBackUrl = localUrl + config.ExternalPort
	callBackUrl = localUrl + localPort
	log.Info("callBackUrl: ", callBackUrl)

	// Register UE application into sandbox controller
	// If demo4-ue starts on advantedge then get resource node name from sbx controller
	if environment == "advantedge" {
		sandBoxClientCfg := sbx.NewConfiguration()
		sandBoxClientCfg.BasePath = sbxCtrlUrl + "/sandbox-ctrl/v1"
	log.Info("Init: sandBoxClientCfg= ", sandBoxClientCfg)
		sandBoxClient = sbx.NewAPIClient(sandBoxClientCfg)
	var appInfo = sbx.ApplicationInfo{instanceName, config.AppName, mep, "USER", false}
	appInfo, err = setApplicationInfo(appInfo)
		if sandBoxClient == nil {
			return "", errors.New("Failed to create Sandbox Controller REST API client")
		}
		appInfo, err := getApplicationInfo(instanceName)
		if err != nil {
		log.Fatal("Failed to set UE application resource ", appInfo)
			return "", errors.New("Failed to retrieve mec application resource")
		}
		mep = appInfo.NodeName
		log.Info("Init: mep: ", mep)
	}

	// Setup application support client & service management client
	appSupportClientCfg := asc.NewConfiguration()
	srvMgmtClientCfg := smc.NewConfiguration()
	if environment == "advantedge" {
		appSupportClientCfg.BasePath = localUrl + "/" + config.SandboxUrl + "/mec_app_support/v1"
		srvMgmtClientCfg.BasePath = localUrl + "/" + config.SandboxUrl + "/mec_service_mgmt/v1"
		if config.MecPlatform != "" {
			appSupportClientCfg.BasePath = "http://" + mep + "-meep-app-enablement" + "/mec_app_support/v1"
			srvMgmtClientCfg.BasePath = "http://" + mep + "-meep-app-enablement" + "/mec_service_mgmt/v1"
		} else {
			appSupportClientCfg.BasePath = "http://meep-app-enablement/mec_app_support/v1"
			srvMgmtClientCfg.BasePath = "http://meep-app-enablement/mec_service_mgmt/v1"
		}
	} else {
		appSupportClientCfg.BasePath = mecUrl + "/mec_app_support/v1"
		srvMgmtClientCfg.BasePath = mecUrl + "/mec_service_mgmt/v1"
	}
	log.Info("Init: appSupportClientCfg: ", appSupportClientCfg)

	// Create app enablement client
	appSupportClient = asc.NewAPIClient(appSupportClientCfg)
@@ -224,32 +217,12 @@ func Init(envPath string, envName string) (port string, err error) {
	if appSupportClient == nil {
		return "", errors.New("Failed to create App Enablement App Support REST API client")
	}
	log.Info("appSupportClient: ", appSupportClient, "/appSupportClientPath: ", appSupportClientPath)
	// Create service management client
	srvMgmtClient = smc.NewAPIClient(srvMgmtClientCfg)
	srvMgmtClientPath = srvMgmtClientCfg.BasePath
	if srvMgmtClient == nil {
		return "", errors.New("Failed to create App Enablement Service Management REST API client")
	}
	log.Info("srvMgmtClient: ", srvMgmtClient, "/srvMgmtClientPath: ", srvMgmtClientPath)

	// Create message queue
	mqLocal, err = mq.NewMsgQueue(mq.GetLocalName(config.SandboxUrl), moduleName, config.SandboxUrl, redisAddr)
	if err != nil {
		log.Error("Failed to create Message Queue with error: ", err)
		return "", err
	}
	log.Info("Message Queue created")

	// Create Swagger API Manager
	os.Setenv("MEEP_HOST_URL", callBackUrl)
	os.Setenv("MEEP_SVC_PATH", "/"+moduleName)
	apiMgr, err = sam.NewSwaggerApiMgr_1(moduleName, mepName, mqLocal, callBackUrl, "/"+moduleName)
	if err != nil {
		log.Error("Failed to create Swagger API Manager. Error: ", err)
		return "", err
	}
	log.Info("Swagger API Manager created")

	// Initialize demo4 app info
	demoAppInfo.Config = envName
@@ -262,54 +235,60 @@ func Init(envPath string, envName string) (port string, err error) {
	return localPort, nil
}

func setApplicationInfo(appInfo sbx.ApplicationInfo) (appInfoRes sbx.ApplicationInfo, err error) {
	log.Info(">>> setApplicationInfo: ", appInfo)
	appInfoRes, resp, err := sandBoxClient.ApplicationsApi.ApplicationsPOST(context.TODO(), appInfo)
// func setApplicationInfo(appInfo sbx.ApplicationInfo) (appInfoRes sbx.ApplicationInfo, err error) {
// 	log.Info(">>> setApplicationInfo: ", appInfo)
// 	appInfoRes, resp, err := sandBoxClient.ApplicationsApi.ApplicationsPOST(context.TODO(), appInfo)
// 	if err != nil {
// 		log.Error(err.Error())
// 		return appInfoRes, err
// 	}
// 	log.Debug("setApplicationInfo: Receive confirmation acknowlegement ", resp.Status)

// 	return appInfoRes, nil
// }

func getApplicationInfo(appId string) (appInfo sbx.ApplicationInfo, err error) {
	log.Info(">>> getApplicationInfo: ", appId)
	appInfo, resp, err := sandBoxClient.ApplicationsApi.ApplicationsAppInstanceIdGET(context.TODO(), appId)
	if err != nil {
		log.Error(err.Error())
		return appInfoRes, err
		log.Info("Failed to retrieve mec application resource ", err)
		return appInfo, err
	}
	log.Debug("setApplicationInfo: Receive confirmation acknowlegement ", resp.Status)
	log.Debug("getApplicationInfo: Receive confirmation acknowlegement ", resp.Status)
	log.Debug("getApplicationInfo: appInfo: ", appInfo)

	return appInfoRes, nil
	return appInfo, nil
}

// func getAllApplicationInfo() (appInfo []sbx.ApplicationInfo, err error) {
// 	log.Info(">>> getAllApplicationInfo")
// 	appInfo, resp, err := sandBoxClient.ApplicationsApi.ApplicationsGET(context.TODO(), nil)
// 	if err != nil {
// 		log.Info("Failed to retrieve mec application resource ", err)
// 		return appInfo, err
// 	}
// 	log.Debug("getAllApplicationInfo: Receive confirmation acknowlegement ", resp.Status)
// 	log.Debug("getAllApplicationInfo: appInfo: ", appInfo)

// 	return appInfo, nil
// }

func demo4Register() (err error) {
	log.Info(">>> demo4Register: ", appEnablementEnabled)
	log.Info(">>> demo4Register: ", appEnabled)

	mutex.Lock()
	defer mutex.Unlock()

	// Start Swagger API Manager (provider)
	err = apiMgr.Start(true, false)
	if err != nil {
		log.Error("Failed to start Swagger API Manager with error: ", err.Error())
		return err
	}
	log.Info("Swagger API Manager started")

	// Add module Swagger APIs
	err = apiMgr.AddApis()
	if err != nil {
		log.Error("Failed to add Swagger APIs with error: ", err.Error())
		return err
	}
	log.Info("Swagger APIs successfully added")

	// Register Message Queue handler
	handler := mq.MsgHandler{Handler: msgHandler, UserData: nil}
	handlerId, err = mqLocal.RegisterHandler(handler)

	// Start app registeration
	if !appEnablementEnabled {
	if !appEnabled {

		// If app is restarted, clean app activity, AMS terminal devices, discovered services
		// If app is restarted, clean app activity, discovered services
		appActivityLogs = []string{}
		//terminalDevices = make(map[string]string)
		demoAppInfo.DiscoveredServices = []ApplicationInstanceDiscoveredServices{}

		// Send confirm ready
		err := sendReadyConfirmation(instanceName)
		err = sendReadyConfirmation(instanceName)
		if err != nil {
			// Add to activity log for error indicator
			appActivityLogs = append(appActivityLogs, "=== Register Demo4 MEC Application [501]")
@@ -406,8 +385,8 @@ func demo4Register() (err error) {
		appActivityLogs = append(appActivityLogs, "daiClient instance created")

		demoAppInfo.Subscriptions = &subscriptions
		appEnablementEnabled = true
		//startTicker()

		appEnabled = true
	}

	return nil
@@ -415,27 +394,14 @@ func demo4Register() (err error) {

// Channel sync consume channel listen for app termination
func Run(msg chan bool) {
	log.Info(">>> run")
	log.Info(">>> run: ", appEnabled)

	err := demo4Register()
	if err != nil {
		log.Fatal(err.Error())
	}
	done = msg
		log.Fatal("Failed to register demo4-ue: ", err.Error())
	}

// Message Queue handler
func msgHandler(msg *mq.Msg, userData interface{}) {
	switch msg.Message {
	case mq.MsgScenarioActivate:
		log.Debug("RX MSG: ", mq.PrintMsg(msg))
	case mq.MsgScenarioUpdate:
		log.Debug("RX MSG: ", mq.PrintMsg(msg))
	case mq.MsgScenarioTerminate:
		log.Debug("RX MSG: ", mq.PrintMsg(msg))
	default:
		log.Trace("Ignoring unsupported message: ", mq.PrintMsg(msg))
	}
	done = msg
}

// Terminate by deleting all resources allocated on MEC platform & mec app
@@ -443,10 +409,9 @@ func Terminate() {
	log.Info(">>> Terminate: ", terminated)

	// Only invoke graceful termination if not terminated (triggerd by mec platform)

	if !terminated {

		if appEnablementEnabled {
		if appEnabled {
			//intervalTicker.Stop()
			log.Info("De-register Demo4 MEC Application")
			appActivityLogs = append(appActivityLogs, "=== De-register Demo4 MEC Application [200]")
@@ -508,25 +473,6 @@ func Terminate() {

	}

	if mqLocal != nil {
		mqLocal.UnregisterHandler(handlerId)
	}

	if apiMgr != nil {
		// Remove APIs
		err := apiMgr.RemoveApis()
		if err != nil {
			log.Error("Failed to remove APIs with err: ", err.Error())
		}
	}

}

// RESP API delete application by deleting all resources
func demo4Deregister(w http.ResponseWriter, r *http.Request) {
	Terminate()
	appEnablementEnabled = false
	w.WriteHeader(http.StatusOK)
}

// REST API handle service subscription callback notification
+2 −3
Original line number Diff line number Diff line
@@ -7,15 +7,14 @@ import (
type Config struct {
	Mode          string `mapstructure:"mode"`
	SandboxUrl    string `mapstructure:"sandbox"`
	SandboxName   string `mapstructure:"sandboxname"`
	NodeName      string `mapstructure:"nodename"`
	HttpsOnly     bool   `mapstructure:"https"`
	MecPlatform   string `mapstructure:"mecplatform"`
	SandboxName   string `mapstructure:"sandboxname"`
	AppInstanceId string `mapstructure:"appid"`
	Localurl      string `mapstructure:"localurl"`
	Port          string `mapstructure:"port"`
	ExternalPort  string `mapstructure:"externalport"`
	AppName       string `mapstructure:"appname"`
	NodeName      string `mapstructure:"nodename"`
}

func LoadConfig(path string, name string) (config Config, err error) {
Loading