Loading go-apps/meep-dai/sbi/dai-sbi.go +231 −53 Original line number Diff line number Diff line Loading @@ -17,7 +17,10 @@ package sbi import ( "errors" "strconv" "sync" //"time" //dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" Loading Loading @@ -306,65 +309,82 @@ func processActiveScenarioUpdate() { } } /*func startRefreshTicker() { log.Info("Starting refresh loop") sbi.refreshTicker = time.NewTicker(1000 * time.Millisecond) go func() { for range sbi.refreshTicker.C { _ = refreshAppList() } }() // ETSI GS MEC 016 V2.2.1 (2020-04) Clause 7.3.3.1 GET func GetApplicationListAppList(appNames []string, appProviders []string, appSoftVersions []string, vendorIds []string, serviceConts []string) (appListSbi *map[string]*tm.AppInfoList, err error) { log.Debug(">>> GetApplicationListAppList: ", appNames) appListSbi, err = GetAllListAppList() if err != nil { log.Error(err.Error()) return nil, err } func stopRefreshTicker() { if sbi.refreshTicker != nil { sbi.refreshTicker.Stop() sbi.refreshTicker = nil log.Info("Refresh loop stopped") // Apply criteria if len(appNames) != 0 { filteredAppListSbi := filterAppNames(appNames, appListSbi) log.Debug("GetApplicationListAppList: After appName, filteredAppListSbi: ", filteredAppListSbi) if len(appProviders) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppProviders(appProviders, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appProvider, filteredAppListSbi: ", filteredAppListSbi) } if len(appSoftVersions) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppSoftVersion(appSoftVersions, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // refreshAppList - Update AppList data struct func refreshAppList() error { sbi.mutex.Lock() defer sbi.mutex.Unlock() log.Info("Update AppList data struct") // Build the list of all application appInfo, err := sbi.daiMgr.GetAllAppList() if err != nil { log.Error(err.Error()) return err // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } log.Debug("appContextMap: ", appInfo) // Store it into Redis log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } else if len(appProviders) != 0 { filteredAppListSbi := filterAppProviders(appProviders, appListSbi) log.Debug("GetApplicationListAppList: After appProvider, filteredAppListSbi: ", filteredAppListSbi) if len(appSoftVersions) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppSoftVersion(appSoftVersions, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } return nil }*/ log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } else if len(appSoftVersions) != 0 { filteredAppListSbi := filterAppSoftVersions(appSoftVersions, appListSbi) // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // ETSI GS MEC 016 V2.2.1 (2020-04) Clause 7.3.3.1 GET func GetApplicationListAppList(appNames []string) (appListSbi *map[string]*tm.AppInfoList, err error) { log.Debug(">>> GetApplicationListAppList: ", appNames) log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil // FIXME } else if len(vendorIds) != 0 { } else if len(serviceConts) != 0 { filteredAppListSbi := filterServiceConts(serviceConts, appListSbi) appListSbi, err = GetAllListAppList() if err != nil { log.Error(err.Error()) return nil, err log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } // Apply criteria if len(appNames) == 0 { log.Debug("<<< GetApplicationListAppList: ", appListSbi) return appListSbi, nil } func filterAppNames(appNames []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appName := range appNames { log.Debug("filterAppNames: Processing appName: ", appName) // Remove quotes if appName != "" { appName = appName[1 : len(appName) - 1] // Remove quotes } log.Debug("filterAppNames: After removing quotes: appName: ", appName) // Search for the entry for _, item := range *appListSbi { if item.AppName == appName { Loading @@ -373,8 +393,135 @@ func GetApplicationListAppList(appNames []string) (appListSbi *map[string]*tm.Ap } // End of 'for' statement } // End of 'for' statement log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil return filteredAppListSbi } func filterAppProviders(appProviders []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appProvider := range appProviders { log.Debug("filterAppProviders: Processing appProvider: ", appProvider) // Remove quotes if appProvider != "" { appProvider = appProvider[1 : len(appProvider) - 1] // Remove quotes } log.Debug("filterAppProviders: After removing quotes: appSoftVersion: ", appProvider) // Search for the entry for _, item := range *appListSbi { if item.AppProvider == appProvider { filteredAppListSbi[item.AppName] = item } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterAppSoftVersions(appSoftVersions []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appSoftVersion := range appSoftVersions { log.Debug("filterAppSoftVersions: Processing appSoftVersion: ", appSoftVersion) // Remove quotes if appSoftVersion != "" { appSoftVersion = appSoftVersion[1 : len(appSoftVersion) - 1] // Remove quotes } log.Debug("filterAppSoftVersions: After removing quotes: appSoftVersion: ", appSoftVersion) // Search for the entry for _, item := range *appListSbi { if item.AppSoftVersion == appSoftVersion { filteredAppListSbi[item.AppName] = item } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterServiceConts(serviceConts []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, serviceCount := range serviceConts { log.Debug("filterServiceConts: Processing serviceCount: ", serviceCount) // Remove quotes if serviceCount != "" { serviceCount = serviceCount[1 : len(serviceCount) - 1] // Remove quotes } log.Debug("filterServiceConts: After removing quotes: appSoftVersion: ", serviceCount) svcCount, _ := strconv.ParseUint(serviceCount, 10, 32) svcCount32 := uint32(svcCount) // Search for the entry for _, item := range *appListSbi { if len(item.AppCharcs) != 0 { for _, sc := range item.AppCharcs { if sc.ServiceCont != nil && *sc.ServiceCont == svcCount32 { filteredAppListSbi[item.AppName] = item break } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterExcludeAppProviders(appProviders []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, appProvider := range appProviders { log.Debug("filterExcludeAppProviders: Processing appProvider: ", appProvider) // Remove quotes if appProvider != "" { appProvider = appProvider[1 : len(appProvider) - 1] // Remove quotes } log.Debug("filterExcludeAppProviders: After removing quotes: appProvider: ", appProvider) // Search for the entry for _, item := range *filteredAppListSbi { if item.AppProvider != appProvider { log.Debug("filterExcludeAppProviders: Removing entry: ", item.AppName) delete(*filteredAppListSbi, item.AppName) } } // End of 'for' statement } // End of 'for' statement } func filterExcludeAppSoftVersion(appSoftVersions []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, appSoftVersion := range appSoftVersions { log.Debug("GetApplicationListAppList: Processing appProvider: ", appSoftVersion) // Remove quotes if appSoftVersion != "" { appSoftVersion = appSoftVersion[1 : len(appSoftVersion) - 1] // Remove quotes } log.Debug("GetApplicationListAppList: After removing quotes: appSoftVersion: ", appSoftVersion) // Search for the entry for _, item := range *filteredAppListSbi { if item.AppSoftVersion != appSoftVersion { log.Debug("GetApplicationListAppList: Removing entry: ", appSoftVersion) delete(*filteredAppListSbi, item.AppName) } } // End of 'for' statement } // End of 'for' statement } func filterExcludeServiceConts(serviceConts []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, serviceCount := range serviceConts { log.Debug("filterExcludeServiceConts: Processing serviceCount: ", serviceCount) // Remove quotes if serviceCount != "" { serviceCount = serviceCount[1 : len(serviceCount) - 1] // Remove quotes } log.Debug("filterExcludeServiceConts: After removing quotes: serviceCount: ", serviceCount) svcCount, _ := strconv.ParseUint(serviceCount, 10, 32) svcCount32 := uint32(svcCount) // Search for the entry for _, item := range *filteredAppListSbi { if len(item.AppCharcs) != 0 { for _, sc := range item.AppCharcs { if sc.ServiceCont != nil && *sc.ServiceCont != svcCount32 { log.Debug("filterExcludeServiceConts: Removing entry: ", item.AppName) delete(*filteredAppListSbi, item.AppName) break } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement } func GetAllListAppList() (appListSbi *map[string]*tm.AppInfoList, err error) { Loading @@ -386,30 +533,23 @@ func GetAllListAppList() (appListSbi *map[string]*tm.AppInfoList, err error) { return nil, err } appListSbi = &appInfoList log.Debug("appListSbi: ", appListSbi) log.Debug("len(appListSbi): ", len(*appListSbi)) //sbi.updateAppInfoCB(appListSbi) return appListSbi, nil } func CreateAppContext(appContextSbi *tm.AppContext) (appContextSbi_ *tm.AppContext, err error) { log.Debug(">>> CreateAppContext: ", appContextSbi) appContextSbi_, err = sbi.daiMgr.CreateAppContext(appContextSbi) if err != nil { log.Error(err.Error()) return nil, err } log.Debug("CreateAppContext: *appContextSbi_.ContextId: ", *appContextSbi_.ContextId) log.Debug("CreateAppContext: appContextSbi_.AppInfo: ", appContextSbi_.AppInfo) log.Debug("CreateAppContext: appContextSbi_.AppInfo.UserAppInstanceInfo: ", appContextSbi_.AppInfo.UserAppInstanceInfo) return appContextSbi_, nil } func DeleteAppContext(contextId string) (err error) { log.Debug(">>> DeleteAppContext: ", contextId) err = sbi.daiMgr.DeleteAppContext(contextId) if err != nil { Loading @@ -421,8 +561,6 @@ func DeleteAppContext(contextId string) (err error) { } func PutAppContext(appContextSbi tm.AppContext) (err error) { log.Debug(">>> PutAppContext: ", appContextSbi) log.Debug(">>> PutAppContext: ", *appContextSbi.ContextId) err = sbi.daiMgr.PutAppContext(appContextSbi) if err != nil { Loading @@ -433,6 +571,46 @@ func PutAppContext(appContextSbi tm.AppContext) (err error) { return nil } func PosApplicationLocationAvailability(applicationLocationAvailabilitySbi *tm.ApplicationLocationAvailability) (applicationLocationAvailability_ *tm.ApplicationLocationAvailability, err error) { log.Debug(">>> PosApplicationLocationAvailability: ", applicationLocationAvailabilitySbi) // Retrieve the AppInfo data for the specified application var appNames = []string{strconv.Quote(applicationLocationAvailabilitySbi.AppInfo.AppName)} var appProviders = []string{strconv.Quote(applicationLocationAvailabilitySbi.AppInfo.AppProvider)} var appSoftVersions []string if applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion != nil { appSoftVersions = []string{strconv.Quote(*applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion)} } var vendorIds []string // FIXME To be done var serviceConts []string // FIXME To be done appListSbi, err := GetApplicationListAppList(appNames, appProviders, appSoftVersions, vendorIds, serviceConts) if err != nil { log.Error(err.Error()) return nil, err } if len(*appListSbi) == 0 { err = errors.New("No application found for " + applicationLocationAvailabilitySbi.AppInfo.AppName) log.Error(err.Error()) return nil, err } applicationLocationAvailability_ = applicationLocationAvailabilitySbi for _, item := range *appListSbi { if item.AppName != applicationLocationAvailabilitySbi.AppInfo.AppName { err = errors.New("Wrong application found for " + applicationLocationAvailabilitySbi.AppInfo.AppName + "- " + item.AppName) log.Error(err.Error()) return nil, err } applicationLocationAvailability_.AppInfo.AvailableLocations = make(tm.AvailableLocations, 1) applicationLocationAvailability_.AppInfo.AvailableLocations[0].AppLocation = new(tm.LocationConstraints) *applicationLocationAvailability_.AppInfo.AvailableLocations[0].AppLocation = item.AppLocation break } // End of 'for' statement return applicationLocationAvailability_, nil } /*func notifyAppContextDeletion(appContextSbi tm.AppContext) (err error) { log.Debug(">>> notifyAppContextDeletion: ", appContextSbi) log.Debug(">>> notifyAppContextDeletion: ", *appContextSbi.ContextId) Loading go-apps/meep-dai/server/convert.go +9 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,15 @@ func convertApplicationListToJson(obj *ApplicationList) string { return string(jsonInfo) } func convertApplicationLocationAvailabilityToJson(applicationLocationAvailability *ApplicationLocationAvailability) string { jsonInfo, err := json.Marshal(*applicationLocationAvailability) if err != nil { log.Error(err.Error()) return "" } return string(jsonInfo) } func convertProblemDetailstoJson(probdetails *ProblemDetails) string { jsonInfo, err := json.Marshal(*probdetails) if err != nil { Loading go-apps/meep-dai/server/dai.go +99 −6 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import ( "os" "strconv" "strings" //"sync" "time" Loading Loading @@ -386,7 +387,6 @@ func Init() (err error) { sbiCfg := sbi.SbiCfg{ ModuleName: moduleName, SandboxName: sandboxName, MepName: mepName, RedisAddr: redisAddr, PostgisHost: postgresHost, PostgisPort: postgresPort, Loading @@ -396,6 +396,9 @@ func Init() (err error) { NotifyAppContextDeletion: notifyAppContextDeletion, CleanUpCb: cleanUp, } if mepName != defaultMepName { sbiCfg.MepName = mepName } err = sbi.Init(sbiCfg) if err != nil { log.Fatal("Failed initialize SBI. Error: ", err) Loading Loading @@ -591,14 +594,20 @@ func meAppListGET(w http.ResponseWriter, r *http.Request) { u, _ := url.Parse(r.URL.String()) log.Info("url: ", u) q := u.Query() appName := q["appName"] //q.Get("appName") // if appName != "" { // appName = appName[1 : len(appName)-1] // Remove quotes // } appName := q["appName"] appProvider := q["appProvider"] appSoftVersion := q["appSoftVersion"] vendorId := q["vendorId"] serviceCont := q["serviceCont"] log.Debug("meAppListGET: appName: ", appName) log.Debug("meAppListGET: appProvider: ", appProvider) log.Debug("meAppListGET: appSoftVersion: ", appSoftVersion) log.Debug("meAppListGET: vendorId: ", vendorId) log.Debug("meAppListGET: serviceCont: ", serviceCont) // Get the ApplicationList appInfoList, err := sbi.GetApplicationListAppList(appName) appInfoList, err := sbi.GetApplicationListAppList(appName, appProvider, appSoftVersion, vendorId, serviceCont) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) Loading Loading @@ -870,7 +879,91 @@ func devAppContextPUT(w http.ResponseWriter, r *http.Request) { } func appLocationAvailabilityPOST(w http.ResponseWriter, r *http.Request) { log.Debug(">>> appLocationAvailabilityPOST: ", r.Body) // Retrive the AppContext message body var applicationLocationAvailability ApplicationLocationAvailability bodyBytes, _ := ioutil.ReadAll(r.Body) err := json.Unmarshal(bodyBytes, &applicationLocationAvailability) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } log.Info("appLocationAvailabilityPOST: ", applicationLocationAvailability) // Sanity checks if applicationLocationAvailability.AppInfo == nil { err = errors.New("AppInfo mismatch") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } if applicationLocationAvailability.AppInfo.AppPackageSource == "" { // Check presence of the filed AppPackageSource in te request err = errors.New("AppPackageSource mismatch") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } var applicationLocationAvailabilitySbi meepdaimgr.ApplicationLocationAvailability applicationLocationAvailabilitySbi.AppInfo = new(meepdaimgr.ApplicationLocationAvailabilityAppInfo) applicationLocationAvailabilitySbi.AppInfo.AppName = applicationLocationAvailability.AppInfo.AppName applicationLocationAvailabilitySbi.AppInfo.AppProvider = applicationLocationAvailability.AppInfo.AppProvider applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion = new(string) *applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion = applicationLocationAvailability.AppInfo.AppSoftVersion applicationLocationAvailabilitySbi.AppInfo.AppDVersion = applicationLocationAvailability.AppInfo.AppDVersion applicationLocationAvailabilitySbi.AppInfo.AppDescription = applicationLocationAvailability.AppInfo.AppDescription applicationLocationAvailabilitySbi.AppInfo.AppPackageSource = new(meepdaimgr.Uri) *applicationLocationAvailabilitySbi.AppInfo.AppPackageSource = meepdaimgr.Uri(applicationLocationAvailability.AppInfo.AppPackageSource) // FIXME Should AvailableLocations field bet set ? applicationLocationAvailabilitySbi.AssociateDevAppId = applicationLocationAvailability.AssociateDevAppId applicationLocationAvailabilitySbi_, err := sbi.PosApplicationLocationAvailability(&applicationLocationAvailabilitySbi) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } // Build response: only update AvailableLocations field log.Debug("devAppContextsPOST: applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations: ", applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations) log.Debug("devAppContextsPOST: len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations): ", len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations)) applicationLocationAvailability.AppInfo.AvailableLocations = make([]ApplicationLocationAvailabilityAppInfoAvailableLocations, len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations)) if len(applicationLocationAvailability.AppInfo.AvailableLocations) != 0 { for i, item := range applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations { fmt.Printf("Type of item.AppLocation: %T\n", (*item.AppLocation)[0]) applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation = new(LocationConstraints) if (*item.AppLocation)[0].Area != nil { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.Area.Coordinates = (*item.AppLocation)[0].Area.Coordinates } if (*item.AppLocation)[0].CivicAddressElement != nil { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement = make([]LocationConstraintsCivicAddressElement, len(*(*item.AppLocation)[0].CivicAddressElement)) for j, cv := range *(*item.AppLocation)[0].CivicAddressElement { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement[j].CaType = cv.CaType applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement[j].CaValue = cv.CaValue } // End of 'for' statement } if (*item.AppLocation)[0].CountryCode != nil { log.Debug("devAppContextsPOST: *(*item.AppLocation)[0].CountryCode: ", *(*item.AppLocation)[0].CountryCode) fmt.Printf("Type of item.AppLocation: %T\n", *(*item.AppLocation)[0].CountryCode) applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CountryCode = *(*item.AppLocation)[0].CountryCode } log.Debug("devAppContextsPOST: applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation: ", applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation) } // End of 'for' statement } log.Debug("devAppContextsPOST: applicationLocationAvailability.AppInfo.AvailableLocations: ", applicationLocationAvailability.AppInfo.AvailableLocations) // Build the response var jsonResponse string = convertApplicationLocationAvailabilityToJson(&applicationLocationAvailability) log.Info("json response: ", jsonResponse) w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusCreated) fmt.Fprintf(w, string(jsonResponse)) w.WriteHeader(http.StatusOK) } Loading go-apps/meep-dai/server/dai_test.go +209 −17 File changed.Preview size limit exceeded, changes collapsed. Show changes go-packages/meep-dai-mgr/exec.go +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ func cmdExec(cli string) (appExecEntry AppExecEntry, err error) { if err == nil { fmt.Println("process terminated normally for pid ", appExecEntry.cmd.Process.Pid) } else { fmt.Println("iperf terminated abnormally for pid :", appExecEntry.cmd.Process.Pid, ", ", err) fmt.Println("process terminated abnormally for pid :", appExecEntry.cmd.Process.Pid, ", ", err) } }() Loading Loading
go-apps/meep-dai/sbi/dai-sbi.go +231 −53 Original line number Diff line number Diff line Loading @@ -17,7 +17,10 @@ package sbi import ( "errors" "strconv" "sync" //"time" //dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" Loading Loading @@ -306,65 +309,82 @@ func processActiveScenarioUpdate() { } } /*func startRefreshTicker() { log.Info("Starting refresh loop") sbi.refreshTicker = time.NewTicker(1000 * time.Millisecond) go func() { for range sbi.refreshTicker.C { _ = refreshAppList() } }() // ETSI GS MEC 016 V2.2.1 (2020-04) Clause 7.3.3.1 GET func GetApplicationListAppList(appNames []string, appProviders []string, appSoftVersions []string, vendorIds []string, serviceConts []string) (appListSbi *map[string]*tm.AppInfoList, err error) { log.Debug(">>> GetApplicationListAppList: ", appNames) appListSbi, err = GetAllListAppList() if err != nil { log.Error(err.Error()) return nil, err } func stopRefreshTicker() { if sbi.refreshTicker != nil { sbi.refreshTicker.Stop() sbi.refreshTicker = nil log.Info("Refresh loop stopped") // Apply criteria if len(appNames) != 0 { filteredAppListSbi := filterAppNames(appNames, appListSbi) log.Debug("GetApplicationListAppList: After appName, filteredAppListSbi: ", filteredAppListSbi) if len(appProviders) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppProviders(appProviders, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appProvider, filteredAppListSbi: ", filteredAppListSbi) } if len(appSoftVersions) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppSoftVersion(appSoftVersions, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // refreshAppList - Update AppList data struct func refreshAppList() error { sbi.mutex.Lock() defer sbi.mutex.Unlock() log.Info("Update AppList data struct") // Build the list of all application appInfo, err := sbi.daiMgr.GetAllAppList() if err != nil { log.Error(err.Error()) return err // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } log.Debug("appContextMap: ", appInfo) // Store it into Redis log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } else if len(appProviders) != 0 { filteredAppListSbi := filterAppProviders(appProviders, appListSbi) log.Debug("GetApplicationListAppList: After appProvider, filteredAppListSbi: ", filteredAppListSbi) if len(appSoftVersions) != 0 && len(filteredAppListSbi) != 0 { filterExcludeAppSoftVersion(appSoftVersions, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } return nil }*/ log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } else if len(appSoftVersions) != 0 { filteredAppListSbi := filterAppSoftVersions(appSoftVersions, appListSbi) // FIXME if len(vendorIds) != 0 && len(filteredAppListSbi) != 0 { if len(serviceConts) != 0 && len(filteredAppListSbi) != 0 { filterExcludeServiceConts(serviceConts, &filteredAppListSbi) log.Debug("GetApplicationListAppList: After appSoftVersion, filteredAppListSbi: ", filteredAppListSbi) } // ETSI GS MEC 016 V2.2.1 (2020-04) Clause 7.3.3.1 GET func GetApplicationListAppList(appNames []string) (appListSbi *map[string]*tm.AppInfoList, err error) { log.Debug(">>> GetApplicationListAppList: ", appNames) log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil // FIXME } else if len(vendorIds) != 0 { } else if len(serviceConts) != 0 { filteredAppListSbi := filterServiceConts(serviceConts, appListSbi) appListSbi, err = GetAllListAppList() if err != nil { log.Error(err.Error()) return nil, err log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil } // Apply criteria if len(appNames) == 0 { log.Debug("<<< GetApplicationListAppList: ", appListSbi) return appListSbi, nil } func filterAppNames(appNames []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appName := range appNames { log.Debug("filterAppNames: Processing appName: ", appName) // Remove quotes if appName != "" { appName = appName[1 : len(appName) - 1] // Remove quotes } log.Debug("filterAppNames: After removing quotes: appName: ", appName) // Search for the entry for _, item := range *appListSbi { if item.AppName == appName { Loading @@ -373,8 +393,135 @@ func GetApplicationListAppList(appNames []string) (appListSbi *map[string]*tm.Ap } // End of 'for' statement } // End of 'for' statement log.Debug("<<< GetApplicationListAppList: ", filteredAppListSbi) return &filteredAppListSbi, nil return filteredAppListSbi } func filterAppProviders(appProviders []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appProvider := range appProviders { log.Debug("filterAppProviders: Processing appProvider: ", appProvider) // Remove quotes if appProvider != "" { appProvider = appProvider[1 : len(appProvider) - 1] // Remove quotes } log.Debug("filterAppProviders: After removing quotes: appSoftVersion: ", appProvider) // Search for the entry for _, item := range *appListSbi { if item.AppProvider == appProvider { filteredAppListSbi[item.AppName] = item } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterAppSoftVersions(appSoftVersions []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, appSoftVersion := range appSoftVersions { log.Debug("filterAppSoftVersions: Processing appSoftVersion: ", appSoftVersion) // Remove quotes if appSoftVersion != "" { appSoftVersion = appSoftVersion[1 : len(appSoftVersion) - 1] // Remove quotes } log.Debug("filterAppSoftVersions: After removing quotes: appSoftVersion: ", appSoftVersion) // Search for the entry for _, item := range *appListSbi { if item.AppSoftVersion == appSoftVersion { filteredAppListSbi[item.AppName] = item } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterServiceConts(serviceConts []string, appListSbi *map[string]*tm.AppInfoList) (map[string]*tm.AppInfoList) { filteredAppListSbi := make(map[string]*tm.AppInfoList) for _, serviceCount := range serviceConts { log.Debug("filterServiceConts: Processing serviceCount: ", serviceCount) // Remove quotes if serviceCount != "" { serviceCount = serviceCount[1 : len(serviceCount) - 1] // Remove quotes } log.Debug("filterServiceConts: After removing quotes: appSoftVersion: ", serviceCount) svcCount, _ := strconv.ParseUint(serviceCount, 10, 32) svcCount32 := uint32(svcCount) // Search for the entry for _, item := range *appListSbi { if len(item.AppCharcs) != 0 { for _, sc := range item.AppCharcs { if sc.ServiceCont != nil && *sc.ServiceCont == svcCount32 { filteredAppListSbi[item.AppName] = item break } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement return filteredAppListSbi } func filterExcludeAppProviders(appProviders []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, appProvider := range appProviders { log.Debug("filterExcludeAppProviders: Processing appProvider: ", appProvider) // Remove quotes if appProvider != "" { appProvider = appProvider[1 : len(appProvider) - 1] // Remove quotes } log.Debug("filterExcludeAppProviders: After removing quotes: appProvider: ", appProvider) // Search for the entry for _, item := range *filteredAppListSbi { if item.AppProvider != appProvider { log.Debug("filterExcludeAppProviders: Removing entry: ", item.AppName) delete(*filteredAppListSbi, item.AppName) } } // End of 'for' statement } // End of 'for' statement } func filterExcludeAppSoftVersion(appSoftVersions []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, appSoftVersion := range appSoftVersions { log.Debug("GetApplicationListAppList: Processing appProvider: ", appSoftVersion) // Remove quotes if appSoftVersion != "" { appSoftVersion = appSoftVersion[1 : len(appSoftVersion) - 1] // Remove quotes } log.Debug("GetApplicationListAppList: After removing quotes: appSoftVersion: ", appSoftVersion) // Search for the entry for _, item := range *filteredAppListSbi { if item.AppSoftVersion != appSoftVersion { log.Debug("GetApplicationListAppList: Removing entry: ", appSoftVersion) delete(*filteredAppListSbi, item.AppName) } } // End of 'for' statement } // End of 'for' statement } func filterExcludeServiceConts(serviceConts []string, filteredAppListSbi *map[string]*tm.AppInfoList) { for _, serviceCount := range serviceConts { log.Debug("filterExcludeServiceConts: Processing serviceCount: ", serviceCount) // Remove quotes if serviceCount != "" { serviceCount = serviceCount[1 : len(serviceCount) - 1] // Remove quotes } log.Debug("filterExcludeServiceConts: After removing quotes: serviceCount: ", serviceCount) svcCount, _ := strconv.ParseUint(serviceCount, 10, 32) svcCount32 := uint32(svcCount) // Search for the entry for _, item := range *filteredAppListSbi { if len(item.AppCharcs) != 0 { for _, sc := range item.AppCharcs { if sc.ServiceCont != nil && *sc.ServiceCont != svcCount32 { log.Debug("filterExcludeServiceConts: Removing entry: ", item.AppName) delete(*filteredAppListSbi, item.AppName) break } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement } func GetAllListAppList() (appListSbi *map[string]*tm.AppInfoList, err error) { Loading @@ -386,30 +533,23 @@ func GetAllListAppList() (appListSbi *map[string]*tm.AppInfoList, err error) { return nil, err } appListSbi = &appInfoList log.Debug("appListSbi: ", appListSbi) log.Debug("len(appListSbi): ", len(*appListSbi)) //sbi.updateAppInfoCB(appListSbi) return appListSbi, nil } func CreateAppContext(appContextSbi *tm.AppContext) (appContextSbi_ *tm.AppContext, err error) { log.Debug(">>> CreateAppContext: ", appContextSbi) appContextSbi_, err = sbi.daiMgr.CreateAppContext(appContextSbi) if err != nil { log.Error(err.Error()) return nil, err } log.Debug("CreateAppContext: *appContextSbi_.ContextId: ", *appContextSbi_.ContextId) log.Debug("CreateAppContext: appContextSbi_.AppInfo: ", appContextSbi_.AppInfo) log.Debug("CreateAppContext: appContextSbi_.AppInfo.UserAppInstanceInfo: ", appContextSbi_.AppInfo.UserAppInstanceInfo) return appContextSbi_, nil } func DeleteAppContext(contextId string) (err error) { log.Debug(">>> DeleteAppContext: ", contextId) err = sbi.daiMgr.DeleteAppContext(contextId) if err != nil { Loading @@ -421,8 +561,6 @@ func DeleteAppContext(contextId string) (err error) { } func PutAppContext(appContextSbi tm.AppContext) (err error) { log.Debug(">>> PutAppContext: ", appContextSbi) log.Debug(">>> PutAppContext: ", *appContextSbi.ContextId) err = sbi.daiMgr.PutAppContext(appContextSbi) if err != nil { Loading @@ -433,6 +571,46 @@ func PutAppContext(appContextSbi tm.AppContext) (err error) { return nil } func PosApplicationLocationAvailability(applicationLocationAvailabilitySbi *tm.ApplicationLocationAvailability) (applicationLocationAvailability_ *tm.ApplicationLocationAvailability, err error) { log.Debug(">>> PosApplicationLocationAvailability: ", applicationLocationAvailabilitySbi) // Retrieve the AppInfo data for the specified application var appNames = []string{strconv.Quote(applicationLocationAvailabilitySbi.AppInfo.AppName)} var appProviders = []string{strconv.Quote(applicationLocationAvailabilitySbi.AppInfo.AppProvider)} var appSoftVersions []string if applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion != nil { appSoftVersions = []string{strconv.Quote(*applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion)} } var vendorIds []string // FIXME To be done var serviceConts []string // FIXME To be done appListSbi, err := GetApplicationListAppList(appNames, appProviders, appSoftVersions, vendorIds, serviceConts) if err != nil { log.Error(err.Error()) return nil, err } if len(*appListSbi) == 0 { err = errors.New("No application found for " + applicationLocationAvailabilitySbi.AppInfo.AppName) log.Error(err.Error()) return nil, err } applicationLocationAvailability_ = applicationLocationAvailabilitySbi for _, item := range *appListSbi { if item.AppName != applicationLocationAvailabilitySbi.AppInfo.AppName { err = errors.New("Wrong application found for " + applicationLocationAvailabilitySbi.AppInfo.AppName + "- " + item.AppName) log.Error(err.Error()) return nil, err } applicationLocationAvailability_.AppInfo.AvailableLocations = make(tm.AvailableLocations, 1) applicationLocationAvailability_.AppInfo.AvailableLocations[0].AppLocation = new(tm.LocationConstraints) *applicationLocationAvailability_.AppInfo.AvailableLocations[0].AppLocation = item.AppLocation break } // End of 'for' statement return applicationLocationAvailability_, nil } /*func notifyAppContextDeletion(appContextSbi tm.AppContext) (err error) { log.Debug(">>> notifyAppContextDeletion: ", appContextSbi) log.Debug(">>> notifyAppContextDeletion: ", *appContextSbi.ContextId) Loading
go-apps/meep-dai/server/convert.go +9 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,15 @@ func convertApplicationListToJson(obj *ApplicationList) string { return string(jsonInfo) } func convertApplicationLocationAvailabilityToJson(applicationLocationAvailability *ApplicationLocationAvailability) string { jsonInfo, err := json.Marshal(*applicationLocationAvailability) if err != nil { log.Error(err.Error()) return "" } return string(jsonInfo) } func convertProblemDetailstoJson(probdetails *ProblemDetails) string { jsonInfo, err := json.Marshal(*probdetails) if err != nil { Loading
go-apps/meep-dai/server/dai.go +99 −6 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import ( "os" "strconv" "strings" //"sync" "time" Loading Loading @@ -386,7 +387,6 @@ func Init() (err error) { sbiCfg := sbi.SbiCfg{ ModuleName: moduleName, SandboxName: sandboxName, MepName: mepName, RedisAddr: redisAddr, PostgisHost: postgresHost, PostgisPort: postgresPort, Loading @@ -396,6 +396,9 @@ func Init() (err error) { NotifyAppContextDeletion: notifyAppContextDeletion, CleanUpCb: cleanUp, } if mepName != defaultMepName { sbiCfg.MepName = mepName } err = sbi.Init(sbiCfg) if err != nil { log.Fatal("Failed initialize SBI. Error: ", err) Loading Loading @@ -591,14 +594,20 @@ func meAppListGET(w http.ResponseWriter, r *http.Request) { u, _ := url.Parse(r.URL.String()) log.Info("url: ", u) q := u.Query() appName := q["appName"] //q.Get("appName") // if appName != "" { // appName = appName[1 : len(appName)-1] // Remove quotes // } appName := q["appName"] appProvider := q["appProvider"] appSoftVersion := q["appSoftVersion"] vendorId := q["vendorId"] serviceCont := q["serviceCont"] log.Debug("meAppListGET: appName: ", appName) log.Debug("meAppListGET: appProvider: ", appProvider) log.Debug("meAppListGET: appSoftVersion: ", appSoftVersion) log.Debug("meAppListGET: vendorId: ", vendorId) log.Debug("meAppListGET: serviceCont: ", serviceCont) // Get the ApplicationList appInfoList, err := sbi.GetApplicationListAppList(appName) appInfoList, err := sbi.GetApplicationListAppList(appName, appProvider, appSoftVersion, vendorId, serviceCont) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) Loading Loading @@ -870,7 +879,91 @@ func devAppContextPUT(w http.ResponseWriter, r *http.Request) { } func appLocationAvailabilityPOST(w http.ResponseWriter, r *http.Request) { log.Debug(">>> appLocationAvailabilityPOST: ", r.Body) // Retrive the AppContext message body var applicationLocationAvailability ApplicationLocationAvailability bodyBytes, _ := ioutil.ReadAll(r.Body) err := json.Unmarshal(bodyBytes, &applicationLocationAvailability) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } log.Info("appLocationAvailabilityPOST: ", applicationLocationAvailability) // Sanity checks if applicationLocationAvailability.AppInfo == nil { err = errors.New("AppInfo mismatch") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } if applicationLocationAvailability.AppInfo.AppPackageSource == "" { // Check presence of the filed AppPackageSource in te request err = errors.New("AppPackageSource mismatch") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } var applicationLocationAvailabilitySbi meepdaimgr.ApplicationLocationAvailability applicationLocationAvailabilitySbi.AppInfo = new(meepdaimgr.ApplicationLocationAvailabilityAppInfo) applicationLocationAvailabilitySbi.AppInfo.AppName = applicationLocationAvailability.AppInfo.AppName applicationLocationAvailabilitySbi.AppInfo.AppProvider = applicationLocationAvailability.AppInfo.AppProvider applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion = new(string) *applicationLocationAvailabilitySbi.AppInfo.AppSoftVersion = applicationLocationAvailability.AppInfo.AppSoftVersion applicationLocationAvailabilitySbi.AppInfo.AppDVersion = applicationLocationAvailability.AppInfo.AppDVersion applicationLocationAvailabilitySbi.AppInfo.AppDescription = applicationLocationAvailability.AppInfo.AppDescription applicationLocationAvailabilitySbi.AppInfo.AppPackageSource = new(meepdaimgr.Uri) *applicationLocationAvailabilitySbi.AppInfo.AppPackageSource = meepdaimgr.Uri(applicationLocationAvailability.AppInfo.AppPackageSource) // FIXME Should AvailableLocations field bet set ? applicationLocationAvailabilitySbi.AssociateDevAppId = applicationLocationAvailability.AssociateDevAppId applicationLocationAvailabilitySbi_, err := sbi.PosApplicationLocationAvailability(&applicationLocationAvailabilitySbi) if err != nil { log.Error(err.Error()) errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError) return } // Build response: only update AvailableLocations field log.Debug("devAppContextsPOST: applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations: ", applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations) log.Debug("devAppContextsPOST: len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations): ", len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations)) applicationLocationAvailability.AppInfo.AvailableLocations = make([]ApplicationLocationAvailabilityAppInfoAvailableLocations, len(applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations)) if len(applicationLocationAvailability.AppInfo.AvailableLocations) != 0 { for i, item := range applicationLocationAvailabilitySbi_.AppInfo.AvailableLocations { fmt.Printf("Type of item.AppLocation: %T\n", (*item.AppLocation)[0]) applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation = new(LocationConstraints) if (*item.AppLocation)[0].Area != nil { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.Area.Coordinates = (*item.AppLocation)[0].Area.Coordinates } if (*item.AppLocation)[0].CivicAddressElement != nil { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement = make([]LocationConstraintsCivicAddressElement, len(*(*item.AppLocation)[0].CivicAddressElement)) for j, cv := range *(*item.AppLocation)[0].CivicAddressElement { applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement[j].CaType = cv.CaType applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CivicAddressElement[j].CaValue = cv.CaValue } // End of 'for' statement } if (*item.AppLocation)[0].CountryCode != nil { log.Debug("devAppContextsPOST: *(*item.AppLocation)[0].CountryCode: ", *(*item.AppLocation)[0].CountryCode) fmt.Printf("Type of item.AppLocation: %T\n", *(*item.AppLocation)[0].CountryCode) applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation.CountryCode = *(*item.AppLocation)[0].CountryCode } log.Debug("devAppContextsPOST: applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation: ", applicationLocationAvailability.AppInfo.AvailableLocations[i].AppLocation) } // End of 'for' statement } log.Debug("devAppContextsPOST: applicationLocationAvailability.AppInfo.AvailableLocations: ", applicationLocationAvailability.AppInfo.AvailableLocations) // Build the response var jsonResponse string = convertApplicationLocationAvailabilityToJson(&applicationLocationAvailability) log.Info("json response: ", jsonResponse) w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusCreated) fmt.Fprintf(w, string(jsonResponse)) w.WriteHeader(http.StatusOK) } Loading
go-apps/meep-dai/server/dai_test.go +209 −17 File changed.Preview size limit exceeded, changes collapsed. Show changes
go-packages/meep-dai-mgr/exec.go +1 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ func cmdExec(cli string) (appExecEntry AppExecEntry, err error) { if err == nil { fmt.Println("process terminated normally for pid ", appExecEntry.cmd.Process.Pid) } else { fmt.Println("iperf terminated abnormally for pid :", appExecEntry.cmd.Process.Pid, ", ", err) fmt.Println("process terminated abnormally for pid :", appExecEntry.cmd.Process.Pid, ", ", err) } }() Loading