Add check for same invoker onboarded 71/10371/1
authorelinuxhenrik <henrik.b.andersson@est.tech>
Fri, 3 Feb 2023 09:14:48 +0000 (10:14 +0100)
committerelinuxhenrik <henrik.b.andersson@est.tech>
Fri, 3 Feb 2023 09:14:51 +0000 (10:14 +0100)
Issue-ID: NONRTRIC-814
Signed-off-by: elinuxhenrik <henrik.b.andersson@est.tech>
Change-Id: I2fa51cf45e98cea19f996ea79d3e9f6c57d02e53

capifcore/internal/invokermanagement/invokermanagement.go
capifcore/internal/invokermanagement/invokermanagement_test.go

index 5fa5ce6..5d4ba25 100644 (file)
@@ -108,6 +108,10 @@ func (im *InvokerManager) PostOnboardedInvokers(ctx echo.Context) error {
                return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, "invalid format for invoker"))
        }
 
+       if im.isInvokerOnboarded(newInvoker) {
+               return sendCoreError(ctx, http.StatusForbidden, fmt.Sprintf(errMsg, "invoker already onboarded"))
+       }
+
        if err := im.validateInvoker(newInvoker, ctx); err != nil {
                return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err))
        }
@@ -127,6 +131,15 @@ func (im *InvokerManager) PostOnboardedInvokers(ctx echo.Context) error {
        return nil
 }
 
+func (im *InvokerManager) isInvokerOnboarded(newInvoker invokerapi.APIInvokerEnrolmentDetails) bool {
+       for _, invoker := range im.onboardedInvokers {
+               if newInvoker.OnboardingInformation.ApiInvokerPublicKey == invoker.OnboardingInformation.ApiInvokerPublicKey {
+                       return true
+               }
+       }
+       return false
+}
+
 func (im *InvokerManager) prepareNewInvoker(newInvoker *invokerapi.APIInvokerEnrolmentDetails) {
        var apiList invokerapi.APIList = im.publishRegister.GetAllPublishedServices()
        newInvoker.ApiList = &apiList
index e5fa008..4365eb3 100644 (file)
@@ -87,20 +87,28 @@ func TestOnboardInvoker(t *testing.T) {
                assert.Equal(t, eventsapi.CAPIFEventAPIINVOKERONBOARDED, invokerEvent.Events)
        }
 
+       // Onboarding the same invoker should result in Forbidden
+       result = testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler)
+
+       assert.Equal(t, http.StatusForbidden, result.Code())
+       var problemDetails common29122.ProblemDetails
+       err = result.UnmarshalBodyToObject(&problemDetails)
+       assert.NoError(t, err, "error unmarshaling response")
+       assert.Equal(t, http.StatusForbidden, *problemDetails.Status)
+       assert.Contains(t, *problemDetails.Cause, "already onboarded")
+
        // Onboard an invoker missing required NotificationDestination, should get 400 with problem details
        invalidInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{
                OnboardingInformation: invokermanagementapi.OnboardingInformation{
-                       ApiInvokerPublicKey: "key",
+                       ApiInvokerPublicKey: "newKey",
                },
        }
        result = testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(invalidInvoker).Go(t, requestHandler)
 
        assert.Equal(t, http.StatusBadRequest, result.Code())
-       var problemDetails common29122.ProblemDetails
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       badRequest := http.StatusBadRequest
-       assert.Equal(t, &badRequest, problemDetails.Status)
+       assert.Equal(t, http.StatusBadRequest, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "missing")
        assert.Contains(t, *problemDetails.Cause, "NotificationDestination")
 
@@ -114,7 +122,7 @@ func TestOnboardInvoker(t *testing.T) {
        assert.Equal(t, http.StatusBadRequest, result.Code())
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       assert.Equal(t, &badRequest, problemDetails.Status)
+       assert.Equal(t, http.StatusBadRequest, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "missing")
        assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey")
 }
@@ -190,8 +198,7 @@ func TestUpdateInvoker(t *testing.T) {
        var problemDetails common29122.ProblemDetails
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       badRequest := http.StatusBadRequest
-       assert.Equal(t, &badRequest, problemDetails.Status)
+       assert.Equal(t, http.StatusBadRequest, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "missing")
        assert.Contains(t, *problemDetails.Cause, "NotificationDestination")
 
@@ -203,7 +210,7 @@ func TestUpdateInvoker(t *testing.T) {
        assert.Equal(t, http.StatusBadRequest, result.Code())
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       assert.Equal(t, &badRequest, problemDetails.Status)
+       assert.Equal(t, http.StatusBadRequest, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "missing")
        assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey")
 
@@ -216,7 +223,7 @@ func TestUpdateInvoker(t *testing.T) {
        assert.Equal(t, http.StatusBadRequest, result.Code())
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       assert.Equal(t, &badRequest, problemDetails.Status)
+       assert.Equal(t, http.StatusBadRequest, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "not matching")
        assert.Contains(t, *problemDetails.Cause, "ApiInvokerId")
 
@@ -228,8 +235,7 @@ func TestUpdateInvoker(t *testing.T) {
        assert.Equal(t, http.StatusNotFound, result.Code())
        err = result.UnmarshalBodyToObject(&problemDetails)
        assert.NoError(t, err, "error unmarshaling response")
-       notFound := http.StatusNotFound
-       assert.Equal(t, &notFound, problemDetails.Status)
+       assert.Equal(t, http.StatusNotFound, *problemDetails.Status)
        assert.Contains(t, *problemDetails.Cause, "not been onboarded")
        assert.Contains(t, *problemDetails.Cause, "invoker")
 }