Submgr REST subscriptions in SDL Database
[ric-plt/submgr.git] / pkg / control / sdl_restSubsDb.go
diff --git a/pkg/control/sdl_restSubsDb.go b/pkg/control/sdl_restSubsDb.go
new file mode 100644 (file)
index 0000000..782108f
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+   ==================================================================================
+  Copyright (c) 2019 AT&T Intellectual Property.
+  Copyright (c) 2019 Nokia
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   ==================================================================================
+*/
+
+package control
+
+import (
+       "encoding/json"
+       "fmt"
+
+       sdl "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
+       "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
+)
+
+type RESTSubscriptionInfo struct {
+       xAppRmrEndPoint  string
+       Meid             string
+       InstanceIds      []uint32
+       xAppIdToE2Id     map[int64]int64
+       SubReqOngoing    bool
+       SubDelReqOngoing bool
+       Md5sum           string
+}
+
+func CreateRESTSdl() Sdlnterface {
+       return sdl.NewSdlInstance("submgr_restSubsDb", sdl.NewDatabase())
+}
+
+func (c *Control) WriteRESTSubscriptionToSdl(restSubId string, restSubs *RESTSubscription) error {
+
+       var restSubscriptionInfo RESTSubscriptionInfo
+       restSubscriptionInfo.xAppRmrEndPoint = restSubs.xAppRmrEndPoint
+       restSubscriptionInfo.Meid = restSubs.Meid
+       restSubscriptionInfo.InstanceIds = restSubs.InstanceIds
+       restSubscriptionInfo.xAppIdToE2Id = restSubs.xAppIdToE2Id
+       restSubscriptionInfo.SubReqOngoing = restSubs.SubReqOngoing
+       restSubscriptionInfo.SubDelReqOngoing = restSubs.SubDelReqOngoing
+       restSubscriptionInfo.Md5sum = restSubs.Md5sum
+
+       jsonData, err := json.Marshal(restSubscriptionInfo)
+       if err != nil {
+               return fmt.Errorf("SDL: WriteSubscriptionToSdl() json.Marshal error: %s", err.Error())
+       }
+
+       if err = c.restSubsDb.Set(restSubId, jsonData); err != nil {
+               c.UpdateCounter(cSDLWriteFailure)
+               return fmt.Errorf("SDL: WriteSubscriptionToSdl(): %s", err.Error())
+       } else {
+               xapp.Logger.Debug("SDL: Subscription written in restSubsDb. restSubId = %v", restSubId)
+       }
+       return nil
+}
+
+func (c *Control) ReadRESTSubscriptionFromSdl(restSubId string) (*RESTSubscription, error) {
+
+       // This function is now just for testing purpose
+       key := restSubId
+       retMap, err := c.restSubsDb.Get([]string{key})
+       if err != nil {
+               c.UpdateCounter(cSDLReadFailure)
+               return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl(): %s", err.Error())
+       } else {
+               xapp.Logger.Debug("SDL: Subscription read from restSubsDb.  restSubId = %v", restSubId)
+       }
+
+       restSubs := &RESTSubscription{}
+       for _, iRESTSubscriptionInfo := range retMap {
+
+               if iRESTSubscriptionInfo == nil {
+                       return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() REST subscription not found. restSubId = %v\n", restSubId)
+               }
+
+               restSubscriptionInfo := &RESTSubscriptionInfo{}
+               jsonSubscriptionInfo := iRESTSubscriptionInfo.(string)
+
+               if err := json.Unmarshal([]byte(jsonSubscriptionInfo), restSubscriptionInfo); err != nil {
+                       return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() json.unmarshal error: %s\n", err.Error())
+               }
+
+               restSubs = c.CreateRESTSubscription(restSubscriptionInfo, &jsonSubscriptionInfo)
+       }
+       return restSubs, nil
+}
+
+func (c *Control) CreateRESTSubscription(restSubscriptionInfo *RESTSubscriptionInfo, jsonSubscriptionInfo *string) *RESTSubscription {
+
+       restSubs := &RESTSubscription{}
+       restSubs.xAppRmrEndPoint = restSubscriptionInfo.xAppRmrEndPoint
+       restSubs.Meid = restSubscriptionInfo.Meid
+       restSubs.InstanceIds = restSubscriptionInfo.InstanceIds
+       restSubs.xAppIdToE2Id = restSubscriptionInfo.xAppIdToE2Id
+       restSubs.SubReqOngoing = restSubscriptionInfo.SubReqOngoing
+       restSubs.SubDelReqOngoing = restSubscriptionInfo.SubDelReqOngoing
+       restSubs.Md5sum = restSubscriptionInfo.Md5sum
+
+       return restSubs
+}
+
+func (c *Control) RemoveRESTSubscriptionFromSdl(restSubId string) error {
+
+       key := restSubId
+       if err := c.restSubsDb.Remove([]string{key}); err != nil {
+               return fmt.Errorf("SDL: RemoveSubscriptionfromSdl(): %s\n", err.Error())
+       } else {
+               xapp.Logger.Debug("SDL: Subscription removed from restSubsDb. restSubId = %v", restSubId)
+       }
+       return nil
+}
+
+func (c *Control) ReadAllRESTSubscriptionsFromSdl() (map[string]*RESTSubscription, error) {
+
+       retMap := make(map[string]*RESTSubscription)
+       // Get all keys
+       keys, err := c.restSubsDb.GetAll()
+       if err != nil {
+               c.UpdateCounter(cSDLReadFailure)
+               return nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), GetAll(). Error while reading REST subscriptions keys from DBAAS %s\n", err.Error())
+       }
+
+       if len(keys) == 0 {
+               return retMap, nil
+       }
+
+       // Get all subscriptionInfos
+       iRESTSubscriptionMap, err := c.restSubsDb.Get(keys)
+       if err != nil {
+               c.UpdateCounter(cSDLReadFailure)
+               return nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), Get():  Error while reading REST subscriptions from DBAAS %s\n", err.Error())
+       }
+
+       for iRESTSubId, iRESTSubscriptionInfo := range iRESTSubscriptionMap {
+
+               if iRESTSubscriptionInfo == nil {
+                       return nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() iRESTSubscriptionInfo = nil\n")
+               }
+
+               restSubscriptionInfo := &RESTSubscriptionInfo{}
+               jsonSubscriptionInfo := iRESTSubscriptionInfo.(string)
+
+               if err := json.Unmarshal([]byte(jsonSubscriptionInfo), restSubscriptionInfo); err != nil {
+                       return nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() json.unmarshal error: %s\n", err.Error())
+               }
+
+               restSubs := c.CreateRESTSubscription(restSubscriptionInfo, &jsonSubscriptionInfo)
+               retMap[iRESTSubId] = restSubs
+       }
+       return retMap, nil
+}
+
+func (c *Control) RemoveAllRESTSubscriptionsFromSdl() error {
+
+       if err := c.restSubsDb.RemoveAll(); err != nil {
+               c.UpdateCounter(cSDLRemoveFailure)
+               return fmt.Errorf("SDL: RemoveAllSubscriptionsFromSdl(): %s\n", err.Error())
+       } else {
+               xapp.Logger.Debug("SDL: All subscriptions removed from e2SubsDb")
+       }
+       return nil
+}