2 // ========================LICENSE_START=================================
5 // Copyright (C) 2023-2024: OpenInfra Foundation Europe
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 // ========================LICENSE_END===================================
21 package invokermanagement
29 "oransc.org/nonrtric/servicemanager/internal/common29122"
30 invokerapi "oransc.org/nonrtric/servicemanager/internal/invokermanagementapi"
32 echo "github.com/labstack/echo/v4"
33 log "github.com/sirupsen/logrus"
36 type InvokerManager struct {
38 CapifIPv4 common29122.Ipv4Addr
39 CapifPort common29122.Port
42 // Creates a manager that implements both the InvokerRegister and the invokermanagementapi.ServerInterface interfaces.
43 func NewInvokerManager(capifProtocol string, capifIPv4 common29122.Ipv4Addr, capifPort common29122.Port) *InvokerManager {
44 return &InvokerManager{
45 CapifProtocol: capifProtocol,
51 // Creates a new individual API Invoker profile.
52 func (im *InvokerManager) PostOnboardedInvokers(ctx echo.Context) error {
53 log.Trace("entering PostOnboardedInvokers")
55 var newInvoker invokerapi.APIInvokerEnrolmentDetails
56 errMsg := "Unable to onboard invoker due to %s"
57 if err := ctx.Bind(&newInvoker); err != nil {
58 return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, "invalid format for invoker"))
61 capifcoreUrl := fmt.Sprintf("%s://%s:%d/api-invoker-management/v1/", im.CapifProtocol, im.CapifIPv4, im.CapifPort)
62 client, err := invokerapi.NewClientWithResponses(capifcoreUrl)
68 ctxHandler context.Context
69 cancel context.CancelFunc
71 ctxHandler, cancel = context.WithCancel(context.Background())
74 postRegistrationsJSONRequestBody := invokerapi.PostOnboardedInvokersJSONRequestBody(newInvoker)
76 var rspInvoker *invokerapi.PostOnboardedInvokersResponse
77 rspInvoker, err = client.PostOnboardedInvokersWithResponse(ctxHandler, postRegistrationsJSONRequestBody)
81 log.Errorf("error on PostOnboardedInvokersWithResponse %s", msg)
82 return sendCoreError(ctx, http.StatusInternalServerError, msg)
85 if rspInvoker.StatusCode() != http.StatusCreated {
86 msg := string(rspInvoker.Body)
87 log.Errorf("error on PostOnboardedInvokersWithResponse %s", msg)
88 return sendCoreError(ctx, rspInvoker.StatusCode(), msg)
91 rspAPIProviderEnrolmentDetails := *rspInvoker.JSON201
92 apiInvokerId := *rspAPIProviderEnrolmentDetails.ApiInvokerId
94 uri := ctx.Request().Host + ctx.Request().URL.String()
95 ctx.Response().Header().Set(echo.HeaderLocation, ctx.Scheme()+`://`+path.Join(uri, apiInvokerId))
96 err = ctx.JSON(http.StatusCreated, rspAPIProviderEnrolmentDetails)
98 // Something really bad happened, tell Echo that our handler failed
105 // Deletes an individual API Invoker.
106 func (im *InvokerManager) DeleteOnboardedInvokersOnboardingId(ctx echo.Context, onboardingId string) error {
107 log.Tracef("entering DeleteOnboardedInvokersOnboardingId onboardingId %s", onboardingId)
109 capifcoreUrl := fmt.Sprintf("%s://%s:%d/api-invoker-management/v1/", im.CapifProtocol, im.CapifIPv4, im.CapifPort)
110 client, err := invokerapi.NewClientWithResponses(capifcoreUrl)
116 ctxHandler context.Context
117 cancel context.CancelFunc
119 ctxHandler, cancel = context.WithCancel(context.Background())
122 _, err = client.DeleteOnboardedInvokersOnboardingId(ctxHandler, onboardingId)
126 log.Errorf("error on DeleteOnboardedInvokersOnboardingId %s", msg)
127 return sendCoreError(ctx, http.StatusInternalServerError, msg)
130 return ctx.NoContent(http.StatusNoContent)
134 // Updates an individual API invoker details.
135 func (im *InvokerManager) PutOnboardedInvokersOnboardingId(ctx echo.Context, onboardingId string) error {
136 log.Tracef("entering DeleteOnboardedInvokersOnboardingId onboardingId %s", onboardingId)
138 var invoker invokerapi.APIInvokerEnrolmentDetails
139 errMsg := "Unable to update invoker due to %s"
140 if err := ctx.Bind(&invoker); err != nil {
141 return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, "invalid format for invoker"))
144 capifcoreUrl := fmt.Sprintf("%s://%s:%d/api-invoker-management/v1/", im.CapifProtocol, im.CapifIPv4, im.CapifPort)
145 client, err := invokerapi.NewClientWithResponses(capifcoreUrl)
151 ctxHandler context.Context
152 cancel context.CancelFunc
154 ctxHandler, cancel = context.WithCancel(context.Background())
157 putRegistrationsJSONRequestBody := invokerapi.PutOnboardedInvokersOnboardingIdJSONRequestBody(invoker)
159 var rspInvoker *invokerapi.PutOnboardedInvokersOnboardingIdResponse
160 rspInvoker, err = client.PutOnboardedInvokersOnboardingIdWithResponse(ctxHandler, onboardingId, putRegistrationsJSONRequestBody)
163 // Something really bad happened, tell Echo that our handler failed
167 if rspInvoker.StatusCode() != http.StatusOK {
168 msg := string(rspInvoker.Body)
169 return sendCoreError(ctx, rspInvoker.StatusCode(), msg)
172 rspAPIProviderEnrolmentDetails := *rspInvoker.JSON200
173 apiInvokerId := *rspAPIProviderEnrolmentDetails.ApiInvokerId
175 uri := ctx.Request().Host + ctx.Request().URL.String()
176 ctx.Response().Header().Set(echo.HeaderLocation, ctx.Scheme()+`://`+path.Join(uri, apiInvokerId))
177 err = ctx.JSON(http.StatusOK, rspAPIProviderEnrolmentDetails)
179 // Something really bad happened, tell Echo that our handler failed
186 func (im *InvokerManager) ModifyIndApiInvokeEnrolment(ctx echo.Context, onboardingId string) error {
187 return ctx.NoContent(http.StatusNotImplemented)
190 // This function wraps sending of an error in the Error format, and
191 // handling the failure to marshal that.
192 func sendCoreError(ctx echo.Context, code int, message string) error {
193 pd := common29122.ProblemDetails{
197 err := ctx.JSON(code, pd)