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:
}
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
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)
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 {
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() {
}
}
}()
+
go func() {
for {
data := <-subschan
}
}()
+ go func() {
+ for {
+ data := <-subdelchan
+ rtmgr.Logger.Debug("received XApp subscription delete data")
+ delSubscription(&rtmgr.Subs, data)
+ triggerSBI <- true
+ }
+ }()
+
return nil
}
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
+}
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