Commit ed058a70 authored by Yann Garcia's avatar Yann Garcia
Browse files

Bug fixed in demo6; enhance services GET endpoint implementation

parent b1111193
Loading
Loading
Loading
Loading
+5 −2
Changes for examples/demo6/golang/main.go: 5 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ type UeContext struct {
var (
	dir                       string
	fileName                  string
	provider                  string = "github" //"Jupyter2024"
	provider                  string = "Jupyter2024" //"github"
	run                       bool   = true
	done                      chan bool
	cfg                       *client.Configuration = nil
@@ -1029,7 +1029,7 @@ func mec40_get_services_list(choice string) (body []byte, response *http.Respons
	}

	// Set URL
	url := mecUrl + "/" + sandboxName + "/" + mecPlateform + "systems/" + choice + "/services"
	url := mecUrl + "/" + sandboxName + "/" + mecPlateform + "/fed_enablement/v1/fed_resources/systems/" + choice + "/services"
	fmt.Println("mec40_get_services_list: url: " + url)
	// Send request and await response
	body, response, err = send_mec_service_request(http.MethodGet, url, nil, nil, nil, nil)
@@ -1396,6 +1396,9 @@ func process_choice(choice []string) string {
		}
		message = fmt.Sprintf("response body:  %s", string(body))
	} else if strings.Compare(choice[0], MEC040_FED_SRV_GET) == 0 {
		if len(choice) == 1 {
			return fmt.Sprintf("System ID is not set")
		}
		body, _, err := mec40_get_services_list(choice[1])
		if err != nil {
			return err.Error()
+2 −0
Changes for go-apps/meep-federation/go.mod: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ require (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr v0.0.0
	github.com/antihax/optional v1.0.0 // indirect
	github.com/google/uuid v1.2.0
	github.com/gorilla/handlers v1.5.1
	github.com/gorilla/mux v1.8.0
	github.com/prometheus/client_golang v1.9.0
	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
)

replace (
+33 −5
Changes for go-apps/meep-federation/sbi/federation-sbi.go: 33 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package sbi

import (
	"context"
	"encoding/json"
	"errors"
	"sync"
@@ -25,6 +26,7 @@ import (
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
	smc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client"
	sam "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr"
)

@@ -42,7 +44,7 @@ type SbiCfg struct {
	InfluxAddr     string
	Locality       []string
	ScenarioNameCb func(string)
	FedNotify      func(msg string)
	FedNotify      func(msg string, systemId string)
	CleanUpCb      func()
}

@@ -64,7 +66,7 @@ type FedSbi struct {
	federationMgr        *fm.FederationMgr
	messageBrokerStarted bool
	updateScenarioNameCB func(string)
	fedNotify            func(string)
	fedNotify            func(string, string)
	cleanUpCB            func()
	mutex                sync.Mutex
}
@@ -79,6 +81,8 @@ type SystemInfo struct { // MEC Federation implementation of sharing MEC Platefo
	Host           string
}

var localSystemInfo SystemInfo

var sbi *FedSbi

// Init - V2XI Service SBI initialization
@@ -217,7 +221,7 @@ func Stop() (err error) {

	// Delete FED Manager
	if sbi.federationMgr != nil {
		err = sbi.federationMgr.DeleteFederationMgr()
		err = sbi.federationMgr.DeleteFederationMgr(localSystemInfo.SystemId)
		if err != nil {
			log.Error(err.Error())
			return err
@@ -293,13 +297,14 @@ func RegisterSystemInfo(requestData SystemInfo) (responseData SystemInfo, err er
		log.Error(err)
		return responseData, err
	}
	err = sbi.federationMgr.PublishMessageOnMessageBroker(s)
	err = sbi.federationMgr.PublishMessageOnMessageBroker(s, requestData.SystemId)
	if err != nil {
		log.Error("Failed to publish message broker server: ", err)
		return responseData, err
	}

	responseData = requestData
	localSystemInfo = requestData

	return responseData, nil
}
@@ -307,7 +312,7 @@ func RegisterSystemInfo(requestData SystemInfo) (responseData SystemInfo, err er
func DeregisterSystemInfo(systemId string) (err error) {
	log.Info(">>> DeregisterSystemInfo: ", systemId)

	err = sbi.federationMgr.DeleteFederationMgr()
	err = sbi.federationMgr.DeleteFederationMgr(systemId)
	if err != nil {
		log.Error(err)
		return err
@@ -316,6 +321,29 @@ func DeregisterSystemInfo(systemId string) (err error) {
	return nil
}

func GetMecServices(host string) (svcs []smc.ServiceInfo, err error) {
	log.Info(">>> GetMecServices: ", host)

	// Create App Info client
	srvMgmtClientCfg := smc.NewConfiguration()
	srvMgmtClientCfg.BasePath = host + "/mec_service_mgmt/v1"
	svcMgmtClient := smc.NewAPIClient(srvMgmtClientCfg)
	if svcMgmtClient == nil {
		err = errors.New("Failed to create App Enablement Service Management REST API client")
		log.Info(err.Error())
		return svcs, err
	}
	log.Info("GetMecServices: Create App Enablement Service Management REST API client")

	svcs, _, err = svcMgmtClient.MecServiceMgmtApi.ServicesGET(context.TODO(), nil)
	if err != nil {
		log.Info(err.Error())
		return svcs, err
	}

	return svcs, nil
}

func convertSystemInfotoJson(systemInfo *SystemInfo) string {
	jsonInfo, err := json.Marshal(*systemInfo)
	if err != nil {
+93 −10
Changes for go-apps/meep-federation/server/federation.go: 93 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -811,7 +811,7 @@ func systeminfoPOST(w http.ResponseWriter, r *http.Request) {
		TransportTypes: "HTTP",
		Protocol:       "REST_HTTP",
		SerializerType: "JSON",
		Host:           hostUrl.String(),
		Host:           hostUrl.String() + "/" + sandboxName + "/" + mepName,
	}
	responseData, err := sbi.RegisterSystemInfo(s)
	if err != nil {
@@ -880,30 +880,113 @@ func servicesGET(w http.ResponseWriter, r *http.Request) {
	log.Debug("servicesGET: systemIdParamStr: ", systemIdParamStr)

	val, ok := systemInfopMap[systemIdParamStr]
	var services []smc.ServiceInfo
	var err error
	if len(systemInfopMap) == 0 || !ok {
		w.WriteHeader(http.StatusNotFound)
		err := errors.New("servicesGET: Unknown system ID: " + val.SystemId)
		log.Debug(err.Error())
		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
		return
	} else if localSystemInfo.SystemId == systemIdParamStr { // Local request
		log.Debug("servicesGET: Local request: ", systemIdParamStr)
		services, err := getMecServices()
		services, err = getMecServices()
		if err != nil {
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Debug("servicesGET: ", services)
	} else { // Forward to peer MEF
		// FIME FSCOM To do
		err := errors.New("servicesGET: Unknown system ID: " + val.SystemId)
		log.Debug(err.Error())
		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
		services, err = sbi.GetMecServices(val.Host)
		if err != nil {
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
	}
	log.Debug("servicesGET: ", services)

	// Prepare & send response
	if len(services) == 0 {
		w.WriteHeader(http.StatusNotFound)
		return
	}
	// Convert into FedServiceInfo list
	var fedServiceInfos = []FedServiceInfo{}
	for _, v := range services {
		var f = FedServiceInfo{
			SystemId: val.SystemId,
			MecHostInformation: &MecHostInformation{
				HostName: val.Host,
				HostId:   "",
			},
			ServiceInfo: &ServiceInfo{
				SerName: v.SerName,
				Version: v.Version,
			},
		}
		f.ServiceInfo = &ServiceInfo{
			SerName: v.SerName,
			Version: v.Version,
		}
		if v.SerCategory != nil {
			f.ServiceInfo.SerCategory = &CategoryRef{
				Href:    v.SerCategory.Href,
				Id:      v.SerCategory.Id,
				Name:    v.SerCategory.Name,
				Version: v.SerCategory.Version,
			}
		}
		if v.TransportInfo != nil {
			f.ServiceInfo.TransportsSupported = []TransportsSupported{}
			var ts = TransportsSupported{}
			// Transport field
			ts.Transport = &TransportDescriptor{
				Name:        v.TransportInfo.Name,
				Description: v.TransportInfo.Description,
				Protocol:    v.TransportInfo.Protocol,
				//Security *SecurityInfo
				//Type_ *TransportTypes `json:"type"`
				Version:          v.TransportInfo.Version,
				ImplSpecificInfo: v.TransportInfo.ImplSpecificInfo,
			}
			if v.TransportInfo.Security != nil {
				ts.Transport.Security = &SecurityInfo{
					// 		OAuth2Info: v.TransportInfo.Security.OAuth2Info,
				}
			}
			if v.TransportInfo.Type_ != nil && *v.TransportInfo.Type_ == "REST_HTTP" {
				ts.Transport.Type_ = new(TransportTypes)
				*ts.Transport.Type_ = REST_HTTP
			}

			// // Serializers field
			ts.Serializers = []SerializerType{}
			ts.Serializers = append(ts.Serializers, JSON)

			// Add it to the list
			f.ServiceInfo.TransportsSupported = append(f.ServiceInfo.TransportsSupported, ts)
		}
		fedServiceInfos = append(fedServiceInfos, f)
	} // End of 'for' statement

	jsonResponse, err := json.Marshal(fedServiceInfos)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	fmt.Fprint(w, string(jsonResponse))
	w.WriteHeader(http.StatusOK)
}

func fedNotify(msg string) {
	log.Debug(">>> fedNotify: ", msg)
func fedNotify(msg string, systemId string) {
	log.Debug(">>> fedNotify: msg: ", msg)
	log.Debug(">>> fedNotify: systemId: ", systemId)

	if msg == "" { // A MEC system de-registered
		log.Debug("fedNotify: Delete Mes system : ", systemId)
		delete(systemInfopMap, systemId)
		return
	}

	// A MEC system registered or updated its registration
	var systemInfo sbi.SystemInfo
	err := json.Unmarshal([]byte(msg), &systemInfo)
	if err != nil {
+15 −8
Changes for go-packages/meep-federation-mgr/federation-mgr.go: 15 added lines, 8 removed lines.
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ type FederationMgr struct {
	namespace      string
	broker         string
	topic          string
	fed_notify     func(string)
	fed_notify     func(string, string)
	connected      bool
	mutex          sync.Mutex
	message_broker message_broker_interface
@@ -53,7 +53,7 @@ func init() {
}

// NewFederationMgr - Creates and initializes a new FED Federation Manager
func NewFederationMgr(name string, namespace string, broker string, topic string, fed_notify func(msg string)) (fm *FederationMgr, err error) {
func NewFederationMgr(name string, namespace string, broker string, topic string, fed_notify func(msg string, systemId string)) (fm *FederationMgr, err error) {
	if name == "" {
		err = errors.New("Missing connector name")
		return nil, err
@@ -76,7 +76,16 @@ func NewFederationMgr(name string, namespace string, broker string, topic string
}

// DeleteFederationMgr -
func (fm *FederationMgr) DeleteFederationMgr() (err error) {
func (fm *FederationMgr) DeleteFederationMgr(systemId string) (err error) {
	log.Info("DeleteFederationMgr: systemId: ", systemId)

	if systemId != "" {
		err := fm.PublishMessageOnMessageBroker("", systemId) // Empty messaeg to remove retain message
		if err != nil {
			log.Error(err.Error())
			//return err
		}
	}

	fm.StopFedMessageBrokerServer()

@@ -84,12 +93,11 @@ func (fm *FederationMgr) DeleteFederationMgr() (err error) {
}

/*
 * PublishMessageOnMessageBroker publish the provided FED message (e.g. CA message) on brocker server (e.g. MQTT)
 * PublishMessageOnMessageBroker publish the provided FED SystemInfo messages on brocker server (e.g. MQTT)
 * @param {string} msgContent The message to publish
 * @return {struct} nil on success, error otherwise
 * @see ETSI GS MEC 030 V3.1.1 (2023-03) Annex D (informative): State-of-the-art of using a Message Broker as FED Message Distribution Server for exchanging non-session based FED messages
 */
func (fm *FederationMgr) PublishMessageOnMessageBroker(msgContent string) (err error) {
func (fm *FederationMgr) PublishMessageOnMessageBroker(msgContent string, systemId string) (err error) {
	log.Info("PublishMessageOnMessageBroker: brokerRunning: ", brokerRunning)

	if !brokerRunning {
@@ -97,13 +105,12 @@ func (fm *FederationMgr) PublishMessageOnMessageBroker(msgContent string) (err e
		log.Error(err.Error())
		return err
	}
	return fm.message_broker.Send(fm, msgContent)
	return fm.message_broker.Send(fm, msgContent, systemId)
}

/*
 * StartFedMessageBrokerServer start the brocker server (e.g. MQTT)
 * @return {struct} nil on success, error otherwise
 * @see ETSI GS MEC 030 V3.1.1 (2023-03) Annex D (informative): State-of-the-art of using a Message Broker as FED Message Distribution Server for exchanging non-session based FED messages
 */
func (fm *FederationMgr) StartFedMessageBrokerServer() (err error) {
	log.Info("StartFedMessageBrokerServer: fm.broker: ", fm.broker)
Loading