X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=capifcore%2Finternal%2Fprovidermanagement%2Fprovidermanagement.go;h=82dfba2189d484a73866240642a788caf90c6f6d;hb=c58285c8b76f7833877e328f94e947b0384c4a86;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..82dfba2 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,7 +37,8 @@ import ( //go:generate mockery --name ServiceRegister type ServiceRegister interface { - IsFunctionRegistered(aefId string) bool + IsFunctionRegistered(functionId string) bool + GetAefsForPublisher(apfId string) []string } type ProviderManager struct { @@ -50,12 +52,12 @@ func NewProviderManager() *ProviderManager { } } -func (pm *ProviderManager) IsFunctionRegistered(aefId string) bool { +func (pm *ProviderManager) IsFunctionRegistered(functionId string) bool { registered := false out: for _, provider := range pm.onboardedProviders { 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.onboardedProviders { + 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) @@ -109,35 +132,95 @@ func (pm *ProviderManager) DeleteRegistrationsRegistrationId(ctx echo.Context, r } func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, registrationId string) error { + pm.lock.Lock() + defer pm.lock.Unlock() + + registeredProvider, shouldReturn, returnValue := pm.checkIfProviderIsRegistered(registrationId, ctx) + if shouldReturn { + return returnValue + } + + updatedProvider, shouldReturn1, returnValue1 := getProviderFromRequest(ctx) + if shouldReturn1 { + return returnValue1 + } + + if updatedProvider.ApiProvDomInfo != nil { + registeredProvider.ApiProvDomInfo = updatedProvider.ApiProvDomInfo + } + + shouldReturn, returnValue = pm.updateFunctions(updatedProvider, registeredProvider, ctx) + if shouldReturn { + return returnValue + } + + err := ctx.JSON(http.StatusOK, pm.onboardedProviders[registrationId]) + if err != nil { + // Something really bad happened, tell Echo that our handler failed + return err + } + + return nil +} + +func (pm *ProviderManager) checkIfProviderIsRegistered(registrationId string, ctx echo.Context) (provapi.APIProviderEnrolmentDetails, bool, error) { registeredProvider, ok := pm.onboardedProviders[registrationId] if !ok { - return sendCoreError(ctx, http.StatusBadRequest, "Provider must be onboarded before updating it") - + return provapi.APIProviderEnrolmentDetails{}, true, sendCoreError(ctx, http.StatusBadRequest, "Provider must be onboarded before updating it") } + return registeredProvider, false, nil +} +func getProviderFromRequest(ctx echo.Context) (provapi.APIProviderEnrolmentDetails, bool, error) { var updatedProvider provapi.APIProviderEnrolmentDetails err := ctx.Bind(&updatedProvider) if err != nil { - return sendCoreError(ctx, http.StatusBadRequest, "Invalid format for provider") + return provapi.APIProviderEnrolmentDetails{}, true, sendCoreError(ctx, http.StatusBadRequest, "Invalid format for provider") } + return updatedProvider, false, nil +} +func (pm *ProviderManager) updateFunctions(updatedProvider provapi.APIProviderEnrolmentDetails, registeredProvider provapi.APIProviderEnrolmentDetails, ctx echo.Context) (bool, error) { 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 + pm.addFunction(function, registeredProvider) + } else { + shouldReturn, returnValue := pm.updateFunction(function, registeredProvider, ctx) + if shouldReturn { + return true, returnValue + } } } + return false, nil +} + +func (pm *ProviderManager) addFunction(function provapi.APIProviderFunctionDetails, registeredProvider provapi.APIProviderEnrolmentDetails) { + function.ApiProvFuncId = pm.getFuncId(function.ApiProvFuncRole, function.ApiProvFuncInfo) + registeredFuncs := *registeredProvider.ApiProvFuncs + newFuncs := append(registeredFuncs, function) + registeredProvider.ApiProvFuncs = &newFuncs + pm.onboardedProviders[*registeredProvider.ApiProvDomId] = registeredProvider +} - err = ctx.JSON(http.StatusOK, registeredProvider) +func (*ProviderManager) updateFunction(function provapi.APIProviderFunctionDetails, registeredProvider provapi.APIProviderEnrolmentDetails, ctx echo.Context) (bool, error) { + pos, registeredFunction, err := getApiFunc(*function.ApiProvFuncId, registeredProvider.ApiProvFuncs) if err != nil { - // Something really bad happened, tell Echo that our handler failed - return err + return true, sendCoreError(ctx, http.StatusBadRequest, "Unable to update provider due to: "+err.Error()) } + if function.ApiProvFuncInfo != nil { + registeredFunction.ApiProvFuncInfo = function.ApiProvFuncInfo + (*registeredProvider.ApiProvFuncs)[pos] = registeredFunction + } + return false, nil +} - return nil +func getApiFunc(funcId string, apiFunctions *[]provapi.APIProviderFunctionDetails) (int, provapi.APIProviderFunctionDetails, error) { + for pos, function := range *apiFunctions { + if *function.ApiProvFuncId == funcId { + return pos, function, nil + } + } + return 0, provapi.APIProviderFunctionDetails{}, fmt.Errorf("function with ID %s is not registered for the provider", funcId) } func (pm *ProviderManager) ModifyIndApiProviderEnrolment(ctx echo.Context, registrationId string) error {