blob: e9a7d2f86e22ffaae304c0fa1b9e27dbb8594b17 [file] [log] [blame]
/*
==================================================================================
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"
)
const restSubSdlNs = "submgr_restSubsDb"
type RESTSubscriptionInfo struct {
XAppRmrEndPoint string
Meid string
InstanceIds []uint32
XAppIdToE2Id map[int64]int64
SubReqOngoing bool
SubDelReqOngoing bool
Md5sum string
}
func CreateRESTSdl() Sdlnterface {
return sdl.NewSyncStorage()
}
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.lastReqMd5sum
jsonData, err := json.Marshal(restSubscriptionInfo)
if err != nil {
return fmt.Errorf("SDL: WriteSubscriptionToSdl() json.Marshal error: %s", err.Error())
}
if err = c.restSubsDb.Set(restSubSdlNs, 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(restSubSdlNs, []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)
restDuplicateCtrl.SetMd5sumFromLastOkRequest(restSubId, restSubs.lastReqMd5sum)
}
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.lastReqMd5sum = restSubscriptionInfo.Md5sum
return restSubs
}
func (c *Control) RemoveRESTSubscriptionFromSdl(restSubId string) error {
key := restSubId
if err := c.restSubsDb.Remove(restSubSdlNs, []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(restSubSdlNs)
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(restSubSdlNs, 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(restSubSdlNs); err != nil {
c.UpdateCounter(cSDLRemoveFailure)
return fmt.Errorf("SDL: RemoveAllSubscriptionsFromSdl(): %s\n", err.Error())
} else {
xapp.Logger.Debug("SDL: All subscriptions removed from restSubsDb")
}
return nil
}