Routing manager v0.3.3 71/971/3
authorkalnagy <kalman.nagy@nokia.com>
Wed, 18 Sep 2019 13:09:32 +0000 (15:09 +0200)
committerkalnagy <kalman.nagy@nokia.com>
Thu, 19 Sep 2019 08:51:57 +0000 (10:51 +0200)
Introduced delete API over REST interface for subscriptions
And Integration fixes

Change-Id: Ib44037b3958f89ace832f4521edcb0d0e28f45f0
Signed-off-by: kalnagy <kalman.nagy@nokia.com>
.gitignore
RELNOTES
api/routing_manager.yaml
container-tag.yaml
pkg/nbi/httprestful.go
pkg/nbi/types.go

index 66d38c8..13ea118 100644 (file)
@@ -1,3 +1,5 @@
 vendor
 bin
 pkg/sdl/ut.rt
+.idea/*
+
index 92b98fa..39d7e16 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -1,3 +1,6 @@
+### v0.3.3
+* Introduced delete API over REST interface for subscriptions.
+
 ### v0.3.2
 * Minor code changes due to appmgr/rtmgr api differences
 * Doc update
index 93c4fc9..7bfbfea 100644 (file)
@@ -126,6 +126,26 @@ paths:
           description: "Invalid data"
         201:
           description: "Xapp Subscription data received"
+    delete:
+      tags:
+      - "handle"
+      summary: "API for deleting an xapp subscription"
+      description: "By performing the delete operation on xapp-subscription-handle resource, the API caller will be able to update routing manager about the deletion of an xapp's subscription"
+      operationId: "delete_xapp_subscription_handle"
+      consumes:
+      - "application/json"
+      parameters:
+      - in: "body"
+        name: "xapp-subscription-data"
+        description: "xApp related subscription data"
+        required: true
+        schema:
+          $ref: "#/definitions/xapp-subscription-data"
+      responses:
+        204:
+          description: "Content not found"
+        200:
+          description: "Xapp Subscription deleted"
   /handles/xapp-subscription-handle/{subscription_id}:
     put:
       tags:
index db88a6c..884ddaa 100644 (file)
@@ -2,4 +2,4 @@
 # By default this file is in the docker build directory,
 # but the location can configured in the JJB template.
 ---
-tag: 0.3.2
+tag: 0.3.3
index 3d94cc9..336e615 100644 (file)
@@ -106,7 +106,7 @@ func provideXappHandleHandlerImpl(datach chan<- *models.XappCallbackData, data *
        }
        err := validateXappCallbackData(data)
        if err != nil {
-               rtmgr.Logger.Debug("XApp callback data validation failed: "+err.Error())
+               rtmgr.Logger.Warn("XApp callback data validation failed: "+err.Error())
                return err
        } else {
                datach<-data
@@ -139,7 +139,39 @@ func provideXappSubscriptionHandleImpl(subchan chan<- *models.XappSubscriptionDa
        return nil
 }
 
-func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan chan<- *models.XappSubscriptionData) {
+func subscriptionExists(data *models.XappSubscriptionData) bool {
+       present := false
+       sub := rtmgr.Subscription{SubID:*data.SubscriptionID, Fqdn:*data.Address, Port:*data.Port,}
+       for _, elem := range rtmgr.Subs {
+               if elem == sub {
+                       present = true
+                       break
+               }
+       }
+       return present
+}
+
+func deleteXappSubscriptionHandleImpl(subdelchan chan<- *models.XappSubscriptionData,
+                                        data *models.XappSubscriptionData) error {
+       rtmgr.Logger.Debug("Invoked deleteXappSubscriptionHandleImpl")
+       err := validateXappSubscriptionData(data)
+       if err != nil {
+               rtmgr.Logger.Error(err.Error())
+               return err
+       }
+
+       if !subscriptionExists(data) {
+               rtmgr.Logger.Warn("Subscription not found: %d", *data.SubscriptionID)
+               err := fmt.Errorf("Subscription not found: %d", *data.SubscriptionID)
+               return err
+       }
+
+       subdelchan <- data
+       return nil
+}
+
+func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan chan<- *models.XappSubscriptionData,
+                                                               subdelchan chan<- *models.XappSubscriptionData) {
         swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON)
         if err != nil {
                 //log.Fatalln(err)
@@ -182,6 +214,15 @@ func launchRest(nbiif *string, datach chan<- *models.XappCallbackData, subchan c
                                return handle.NewGetHandlesOK()
                        }
                })
+       api.HandleDeleteXappSubscriptionHandleHandler = handle.DeleteXappSubscriptionHandleHandlerFunc(
+               func(params handle.DeleteXappSubscriptionHandleParams) middleware.Responder {
+                       err := deleteXappSubscriptionHandleImpl(subdelchan, params.XappSubscriptionData)
+                       if err != nil {
+                               return handle.NewDeleteXappSubscriptionHandleNoContent()
+                       } else {
+                               return handle.NewGetHandlesOK()
+                       }
+               })
         // start to serve API
         rtmgr.Logger.Info("Starting the HTTP Rest service")
         if err := server.Serve(); err != nil {
@@ -261,9 +302,10 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co
 
        datach := make(chan *models.XappCallbackData, 10)
        subschan := make(chan *models.XappSubscriptionData, 10)
+       subdelchan := make(chan *models.XappSubscriptionData, 10)
        rtmgr.Logger.Info("Launching Rest Http service")
        go func() {
-               r.LaunchRest(&nbiif, datach, subschan)
+               r.LaunchRest(&nbiif, datach, subschan, subdelchan)
        }()
 
        go func() {
@@ -277,6 +319,7 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co
                        }
                }
        }()
+
        go func() {
                for {
                        data := <-subschan
@@ -286,6 +329,15 @@ func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, co
                }
        }()
 
+       go func() {
+               for {
+                       data := <-subdelchan
+                       rtmgr.Logger.Debug("received XApp subscription delete data")
+                       delSubscription(&rtmgr.Subs, data)
+                       triggerSBI <- true
+               }
+       }()
+
        return nil
 }
 
@@ -308,3 +360,22 @@ func addSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubsc
        return b
 }
 
+func delSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubscriptionData) bool {
+       rtmgr.Logger.Debug("Deleteing the subscription from the subscriptions list")
+       var present bool = false
+       sub := rtmgr.Subscription{SubID:*xappSubData.SubscriptionID, Fqdn:*xappSubData.Address, Port:*xappSubData.Port,}
+       for i, elem := range *subs {
+               if elem == sub {
+                       present = true
+                       // Since the order of the list is not important, we are swapping the last element
+                       // with the matching element and replacing the list with list(n-1) elements.
+                       (*subs)[len(*subs)-1], (*subs)[i] = (*subs)[i], (*subs)[len(*subs)-1]
+                       *subs = (*subs)[:len(*subs)-1]
+                       break
+               }
+       }
+       if present == false {
+               rtmgr.Logger.Warn("rtmgr.delSubscription: Subscription = %v, not present in the existing subscriptions", xappSubData)
+       }
+       return present
+}
index 2b4bebb..813363e 100644 (file)
@@ -33,7 +33,7 @@ import (
 
 type FetchAllXappsHandler func(string) (*[]rtmgr.XApp, error)
 type RecvXappCallbackDataHandler func(<-chan *models.XappCallbackData) (*[]rtmgr.XApp, error)
-type LaunchRestHandler func(*string, chan<- *models.XappCallbackData, chan<- *models.XappSubscriptionData)
+type LaunchRestHandler func(*string, chan<- *models.XappCallbackData, chan<- *models.XappSubscriptionData, chan<- *models.XappSubscriptionData)
 type ProvideXappHandleHandlerImpl func(chan<- *models.XappCallbackData, *models.XappCallbackData) (error)
 type RetrieveStartupDataHandler func(string, string, string, string, sdl.SdlEngine) error