2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
25 "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
26 sdl "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
27 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
31 type SubscriptionInfo struct {
35 EpList xapp.RmrEndpointList
36 SubReqMsg e2ap.E2APSubscriptionRequest
37 SubRespMsg e2ap.E2APSubscriptionResponse
38 SubFailMsg e2ap.E2APSubscriptionFailure
42 func CreateSdl() Sdlnterface {
43 return sdl.NewSdlInstance("submgr", sdl.NewDatabase())
46 func (c *Control) WriteSubscriptionToSdl(subId uint32, subs *Subscription) error {
48 var subscriptionInfo SubscriptionInfo
49 subscriptionInfo.Valid = subs.valid
50 subscriptionInfo.ReqId = subs.ReqId
51 subscriptionInfo.Meid = *subs.Meid
52 subscriptionInfo.EpList = subs.EpList
53 subscriptionInfo.SubReqMsg = *subs.SubReqMsg
55 if typeofSubsMessage(subs.SubRFMsg) == "SubResp" {
56 subscriptionInfo.SubRespRcvd = "SubResp"
57 subscriptionInfo.SubRespMsg = *subs.SubRFMsg.(*e2ap.E2APSubscriptionResponse)
58 } else if typeofSubsMessage(subs.SubRFMsg) == "SubFail" {
59 subscriptionInfo.SubRespRcvd = "SubFail"
60 subscriptionInfo.SubFailMsg = *subs.SubRFMsg.(*e2ap.E2APSubscriptionFailure)
62 subscriptionInfo.SubRespRcvd = ""
65 jsonData, err := json.Marshal(subscriptionInfo)
67 return fmt.Errorf("SDL: WriteSubscriptionToSdl() json.Marshal error: %s", err.Error())
70 if err = c.db.Set(strconv.FormatUint(uint64(subId), 10), jsonData); err != nil {
71 c.UpdateCounter(cSDLWriteFailure)
72 return fmt.Errorf("SDL: WriteSubscriptionToSdl(): %s", err.Error())
74 xapp.Logger.Debug("SDL: Subscription written in db. subId = %v", subId)
79 func (c *Control) ReadSubscriptionFromSdl(subId uint32) (*Subscription, error) {
81 // This function is now just for testing purpose
82 key := strconv.FormatUint(uint64(subId), 10)
83 retMap, err := c.db.Get([]string{key})
85 c.UpdateCounter(cSDLReadFailure)
86 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl(): %s", err.Error())
88 xapp.Logger.Debug("SDL: Subscription read from db. subId = %v", subId)
91 subs := &Subscription{}
92 for _, iSubscriptionInfo := range retMap {
94 if iSubscriptionInfo == nil {
95 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() subscription not found. subId = %v\n", subId)
98 subscriptionInfo := &SubscriptionInfo{}
99 jsonSubscriptionInfo := iSubscriptionInfo.(string)
101 if err := json.Unmarshal([]byte(jsonSubscriptionInfo), subscriptionInfo); err != nil {
102 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() json.unmarshal error: %s\n", err.Error())
105 subs = c.CreateSubscription(subscriptionInfo, &jsonSubscriptionInfo)
110 func (c *Control) CreateSubscription(subscriptionInfo *SubscriptionInfo, jsonSubscriptionInfo *string) *Subscription {
112 subs := &Subscription{}
113 subs.registry = c.registry
114 subs.valid = subscriptionInfo.Valid
115 subs.ReqId = subscriptionInfo.ReqId
116 meid := xapp.RMRMeid{}
117 meid = subscriptionInfo.Meid
119 subs.EpList = subscriptionInfo.EpList
121 subReq := e2ap.E2APSubscriptionRequest{}
122 subReq = subscriptionInfo.SubReqMsg
123 subs.SubReqMsg = &subReq
125 if subscriptionInfo.SubRespRcvd == "SubResp" {
126 subs.SubRespRcvd = true
127 subResp := e2ap.E2APSubscriptionResponse{}
128 subResp = subscriptionInfo.SubRespMsg
129 subs.SubRFMsg = &subResp
130 } else if subscriptionInfo.SubRespRcvd == "SubFail" {
131 subs.SubRespRcvd = false
132 subFail := e2ap.E2APSubscriptionFailure{}
133 subFail = subscriptionInfo.SubFailMsg
134 subs.SubRFMsg = &subFail
136 subs.SubRespRcvd = false
138 xapp.Logger.Debug("SDL: CreateSubscription() subscriptionInfo.SubRespRcvd == '', InstanceId=%v ", subscriptionInfo.ReqId.InstanceId)
143 func (c *Control) RemoveSubscriptionFromSdl(subId uint32) error {
145 key := strconv.FormatUint(uint64(subId), 10)
146 if err := c.db.Remove([]string{key}); err != nil {
147 return fmt.Errorf("SDL: RemoveSubscriptionfromSdl(): %s\n", err.Error())
149 xapp.Logger.Debug("SDL: Subscription removed from db. subId = %v", subId)
154 func (c *Control) ReadAllSubscriptionsFromSdl() ([]uint32, map[uint32]*Subscription, error) {
156 // Read all subscriptionInfos
159 for i = 1; i < 65535; i++ {
160 subIds = append(subIds, i)
163 retMap := make(map[uint32]*Subscription)
165 keys, err := c.db.GetAll()
167 c.UpdateCounter(cSDLReadFailure)
168 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), GetAll(). Error while reading keys from DBAAS %s\n", err.Error())
172 return subIds, retMap, nil
175 // Get all subscriptionInfos
176 iSubscriptionMap, err := c.db.Get(keys)
178 c.UpdateCounter(cSDLReadFailure)
179 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), Get(): Error while reading subscriptions from DBAAS %s\n", err.Error())
182 for _, iSubscriptionInfo := range iSubscriptionMap {
184 if iSubscriptionInfo == nil {
185 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() iSubscriptionInfo = nil\n")
188 subscriptionInfo := &SubscriptionInfo{}
189 jsonSubscriptionInfo := iSubscriptionInfo.(string)
191 if err := json.Unmarshal([]byte(jsonSubscriptionInfo), subscriptionInfo); err != nil {
192 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() json.unmarshal error: %s\n", err.Error())
195 subs := c.CreateSubscription(subscriptionInfo, &jsonSubscriptionInfo)
197 if int(subscriptionInfo.ReqId.InstanceId) >= len(subIds) {
198 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() index is out of range. Index is %d with slice length %d", subscriptionInfo.ReqId.InstanceId, len(subIds))
200 retMap[subscriptionInfo.ReqId.InstanceId] = subs
202 // Remove subId from free subIds. Original slice is modified here!
203 subIds, err = removeNumber(subIds, subscriptionInfo.ReqId.InstanceId)
205 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() error: %s\n", err.Error())
208 return subIds, retMap, nil
211 func removeNumber(s []uint32, removedNum uint32) ([]uint32, error) {
212 for i, num := range s {
213 if removedNum == uint32(num) {
214 s = append(s[:i], s[i+1:]...)
215 return s[:len(s)], nil
218 return nil, fmt.Errorf("SDL: To be removed number not in the slice. removedNum: %v", removedNum)
220 func (c *Control) RemoveAllSubscriptionsFromSdl() error {
222 if err := c.db.RemoveAll(); err != nil {
223 c.UpdateCounter(cSDLRemoveFailure)
224 return fmt.Errorf("SDL: RemoveAllSubscriptionsFromSdl(): %s\n", err.Error())
226 xapp.Logger.Debug("SDL: All subscriptions removed from db")