X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=capifcore%2Finternal%2Fprovidermanagement%2Fprovidermanagement.go;h=ea1f1e6d3e0dfbcb4ebf5e1c027db7c8c5a436a1;hb=45b9a16b4777575dccd217d0b1fa42e913072101;hp=82d833ff57e7e89106412212ea2e25c69586d9fc;hpb=c9e08b2a2f647f9f870040570c5e71305f0fb5d2;p=nonrtric%2Fplt%2Fsme.git diff --git a/capifcore/internal/providermanagement/providermanagement.go b/capifcore/internal/providermanagement/providermanagement.go index 82d833f..ea1f1e6 100644 --- a/capifcore/internal/providermanagement/providermanagement.go +++ b/capifcore/internal/providermanagement/providermanagement.go @@ -21,6 +21,7 @@ package providermanagement import ( + "fmt" "net/http" "path" "strings" @@ -36,26 +37,27 @@ import ( //go:generate mockery --name ServiceRegister type ServiceRegister interface { - IsFunctionRegistered(aefId string) bool + IsFunctionRegistered(functionId string) bool + GetAefsForPublisher(apfId string) []string } type ProviderManager struct { - onboardedProviders map[string]provapi.APIProviderEnrolmentDetails - lock sync.Mutex + registeredProviders map[string]provapi.APIProviderEnrolmentDetails + lock sync.Mutex } func NewProviderManager() *ProviderManager { return &ProviderManager{ - onboardedProviders: make(map[string]provapi.APIProviderEnrolmentDetails), + registeredProviders: make(map[string]provapi.APIProviderEnrolmentDetails), } } -func (pm *ProviderManager) IsFunctionRegistered(aefId string) bool { +func (pm *ProviderManager) IsFunctionRegistered(functionId string) bool { registered := false out: - for _, provider := range pm.onboardedProviders { + for _, provider := range pm.registeredProviders { for _, registeredFunc := range *provider.ApiProvFuncs { - if *registeredFunc.ApiProvFuncId == aefId { + if *registeredFunc.ApiProvFuncId == functionId { registered = true break out } @@ -65,6 +67,27 @@ out: return registered } +func (pm *ProviderManager) GetAefsForPublisher(apfId string) []string { + for _, provider := range pm.registeredProviders { + for _, registeredFunc := range *provider.ApiProvFuncs { + if *registeredFunc.ApiProvFuncId == apfId && registeredFunc.ApiProvFuncRole == provapi.ApiProviderFuncRoleAPF { + return getExposedFuncs(provider.ApiProvFuncs) + } + } + } + return nil +} + +func getExposedFuncs(providerFuncs *[]provapi.APIProviderFunctionDetails) []string { + exposedFuncs := []string{} + for _, registeredFunc := range *providerFuncs { + if registeredFunc.ApiProvFuncRole == provapi.ApiProviderFuncRoleAEF { + exposedFuncs = append(exposedFuncs, *registeredFunc.ApiProvFuncId) + } + } + return exposedFuncs +} + func (pm *ProviderManager) PostRegistrations(ctx echo.Context) error { var newProvider provapi.APIProviderEnrolmentDetails err := ctx.Bind(&newProvider) @@ -76,13 +99,7 @@ func (pm *ProviderManager) PostRegistrations(ctx echo.Context) error { return sendCoreError(ctx, http.StatusBadRequest, "Provider missing required ApiProvDomInfo") } - pm.lock.Lock() - defer pm.lock.Unlock() - - newProvider.ApiProvDomId = pm.getDomainId(newProvider.ApiProvDomInfo) - - pm.registerFunctions(newProvider.ApiProvFuncs) - pm.onboardedProviders[*newProvider.ApiProvDomId] = newProvider + pm.prepareNewProvider(&newProvider) uri := ctx.Request().Host + ctx.Request().URL.String() ctx.Response().Header().Set(echo.HeaderLocation, ctx.Scheme()+`://`+path.Join(uri, *newProvider.ApiProvDomId)) @@ -95,43 +112,51 @@ func (pm *ProviderManager) PostRegistrations(ctx echo.Context) error { return nil } -func (pm *ProviderManager) DeleteRegistrationsRegistrationId(ctx echo.Context, registrationId string) error { +func (pm *ProviderManager) prepareNewProvider(newProvider *provapi.APIProviderEnrolmentDetails) { pm.lock.Lock() defer pm.lock.Unlock() - log.Debug(pm.onboardedProviders) - if _, ok := pm.onboardedProviders[registrationId]; ok { - log.Debug("Deleting provider", registrationId) - delete(pm.onboardedProviders, registrationId) + newProvider.ApiProvDomId = pm.getDomainId(newProvider.ApiProvDomInfo) + + pm.registerFunctions(newProvider.ApiProvFuncs) + pm.registeredProviders[*newProvider.ApiProvDomId] = *newProvider +} + +func (pm *ProviderManager) DeleteRegistrationsRegistrationId(ctx echo.Context, registrationId string) error { + + log.Debug(pm.registeredProviders) + if _, ok := pm.registeredProviders[registrationId]; ok { + pm.deleteProvider(registrationId) } return ctx.NoContent(http.StatusNoContent) } -func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, registrationId string) error { - registeredProvider, ok := pm.onboardedProviders[registrationId] - if !ok { - return sendCoreError(ctx, http.StatusBadRequest, "Provider must be onboarded before updating it") +func (pm *ProviderManager) deleteProvider(registrationId string) { + log.Debug("Deleting provider", registrationId) + pm.lock.Lock() + defer pm.lock.Unlock() + delete(pm.registeredProviders, registrationId) +} +func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, registrationId string) error { + errMsg := "Unable to update provider due to %s." + registeredProvider, err := pm.checkIfProviderIsRegistered(registrationId, ctx) + if err != nil { + return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err)) } - var updatedProvider provapi.APIProviderEnrolmentDetails - err := ctx.Bind(&updatedProvider) + updatedProvider, err := getProviderFromRequest(ctx) if err != nil { - return sendCoreError(ctx, http.StatusBadRequest, "Invalid format for provider") + return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err)) } - for _, function := range *updatedProvider.ApiProvFuncs { - if function.ApiProvFuncId == nil { - function.ApiProvFuncId = pm.getFuncId(function.ApiProvFuncRole, function.ApiProvFuncInfo) - registeredFuncs := *registeredProvider.ApiProvFuncs - newFuncs := append(registeredFuncs, function) - registeredProvider.ApiProvFuncs = &newFuncs - pm.onboardedProviders[*registeredProvider.ApiProvDomId] = registeredProvider - } + err = pm.updateProvider(updatedProvider, registeredProvider) + if err != nil { + return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err)) } - err = ctx.JSON(http.StatusOK, registeredProvider) + err = ctx.JSON(http.StatusOK, *registeredProvider) if err != nil { // Something really bad happened, tell Echo that our handler failed return err @@ -140,6 +165,76 @@ func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, regi return nil } +func (pm *ProviderManager) checkIfProviderIsRegistered(registrationId string, ctx echo.Context) (*provapi.APIProviderEnrolmentDetails, error) { + registeredProvider, ok := pm.registeredProviders[registrationId] + if !ok { + return nil, fmt.Errorf("provider not onboarded") + } + return ®isteredProvider, nil +} + +func getProviderFromRequest(ctx echo.Context) (provapi.APIProviderEnrolmentDetails, error) { + var updatedProvider provapi.APIProviderEnrolmentDetails + err := ctx.Bind(&updatedProvider) + if err != nil { + return provapi.APIProviderEnrolmentDetails{}, fmt.Errorf("invalid format for provider") + } + return updatedProvider, nil +} + +func (pm *ProviderManager) updateProvider(updatedProvider provapi.APIProviderEnrolmentDetails, registeredProvider *provapi.APIProviderEnrolmentDetails) error { + pm.lock.Lock() + defer pm.lock.Unlock() + + updateDomainInfo(&updatedProvider, registeredProvider) + + funcsAfterUpdate, err := updateFuncs(updatedProvider.ApiProvFuncs, registeredProvider.ApiProvFuncs) + if err == nil { + registeredProvider.ApiProvFuncs = funcsAfterUpdate + + pm.registeredProviders[*registeredProvider.ApiProvDomId] = *registeredProvider + return nil + } + return err +} + +func updateDomainInfo(updatedProvider, registeredProvider *provapi.APIProviderEnrolmentDetails) { + if updatedProvider.ApiProvDomInfo != nil { + registeredProvider.ApiProvDomInfo = updatedProvider.ApiProvDomInfo + } +} + +func updateFuncs(updatedFuncs, registeredFuncs *[]provapi.APIProviderFunctionDetails) (*[]provapi.APIProviderFunctionDetails, error) { + addedFuncs := []provapi.APIProviderFunctionDetails{} + changedFuncs := []provapi.APIProviderFunctionDetails{} + for _, function := range *updatedFuncs { + if function.ApiProvFuncId == nil { + function.ApiProvFuncId = getFuncId(function.ApiProvFuncRole, function.ApiProvFuncInfo) + addedFuncs = append(addedFuncs, function) + } else { + registeredFunction, ok := getApiFunc(*function.ApiProvFuncId, registeredFuncs) + if !ok { + return nil, fmt.Errorf("function with ID %s is not registered for the provider", *function.ApiProvFuncId) + } + if function.ApiProvFuncInfo != nil { + registeredFunction.ApiProvFuncInfo = function.ApiProvFuncInfo + } + changedFuncs = append(changedFuncs, function) + } + } + modifiedFuncs := append(changedFuncs, addedFuncs...) + return &modifiedFuncs, nil +} + +func getApiFunc(funcId string, apiFunctions *[]provapi.APIProviderFunctionDetails) (provapi.APIProviderFunctionDetails, bool) { + for _, function := range *apiFunctions { + if *function.ApiProvFuncId == funcId { + return function, true + } + } + return provapi.APIProviderFunctionDetails{}, false +} + func (pm *ProviderManager) ModifyIndApiProviderEnrolment(ctx echo.Context, registrationId string) error { return ctx.NoContent(http.StatusNotImplemented) } @@ -149,7 +244,7 @@ func (pm *ProviderManager) registerFunctions(provFuncs *[]provapi.APIProviderFun return } for i, provFunc := range *provFuncs { - (*provFuncs)[i].ApiProvFuncId = pm.getFuncId(provFunc.ApiProvFuncRole, provFunc.ApiProvFuncInfo) + (*provFuncs)[i].ApiProvFuncId = getFuncId(provFunc.ApiProvFuncRole, provFunc.ApiProvFuncInfo) } } @@ -158,7 +253,7 @@ func (pm *ProviderManager) getDomainId(domainInfo *string) *string { return &idAsString } -func (pm *ProviderManager) getFuncId(role provapi.ApiProviderFuncRole, funcInfo *string) *string { +func getFuncId(role provapi.ApiProviderFuncRole, funcInfo *string) *string { var idPrefix string switch role { case provapi.ApiProviderFuncRoleAPF: