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 return fmt.Errorf("SDL: WriteSubscriptionToSdl(): %s", err.Error())
73 xapp.Logger.Debug("SDL: Subscription written in db. subId = %v", subId)
78 func (c *Control) ReadSubscriptionFromSdl(subId uint32) (*Subscription, error) {
80 // This function is now just for testing purpose
81 key := strconv.FormatUint(uint64(subId), 10)
82 retMap, err := c.db.Get([]string{key})
84 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl(): %s", err.Error())
86 xapp.Logger.Debug("SDL: Subscription read from db. subId = %v", subId)
89 subs := &Subscription{}
90 for _, iSubscriptionInfo := range retMap {
92 if iSubscriptionInfo == nil {
93 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() subscription not found. subId = %v\n", subId)
96 subscriptionInfo := &SubscriptionInfo{}
97 jsonSubscriptionInfo := iSubscriptionInfo.(string)
99 if err := json.Unmarshal([]byte(jsonSubscriptionInfo), subscriptionInfo); err != nil {
100 return nil, fmt.Errorf("SDL: ReadSubscriptionFromSdl() json.unmarshal error: %s\n", err.Error())
103 subs = c.CreateSubscription(subscriptionInfo, &jsonSubscriptionInfo)
108 func (c *Control) CreateSubscription(subscriptionInfo *SubscriptionInfo, jsonSubscriptionInfo *string) *Subscription {
110 subs := &Subscription{}
111 subs.registry = c.registry
112 subs.valid = subscriptionInfo.Valid
113 subs.ReqId = subscriptionInfo.ReqId
114 meid := xapp.RMRMeid{}
115 meid = subscriptionInfo.Meid
117 subs.EpList = subscriptionInfo.EpList
119 subReq := e2ap.E2APSubscriptionRequest{}
120 subReq = subscriptionInfo.SubReqMsg
121 subs.SubReqMsg = &subReq
123 if subscriptionInfo.SubRespRcvd == "SubResp" {
124 subs.SubRespRcvd = true
125 subResp := e2ap.E2APSubscriptionResponse{}
126 subResp = subscriptionInfo.SubRespMsg
127 subs.SubRFMsg = &subResp
128 } else if subscriptionInfo.SubRespRcvd == "SubFail" {
129 subs.SubRespRcvd = false
130 subFail := e2ap.E2APSubscriptionFailure{}
131 subFail = subscriptionInfo.SubFailMsg
132 subs.SubRFMsg = &subFail
134 subs.SubRespRcvd = false
136 xapp.Logger.Debug("SDL: CreateSubscription() subscriptionInfo.SubRespRcvd == '', InstanceId=%v ", subscriptionInfo.ReqId.InstanceId)
141 func (c *Control) RemoveSubscriptionFromSdl(subId uint32) error {
143 key := strconv.FormatUint(uint64(subId), 10)
144 if err := c.db.Remove([]string{key}); err != nil {
145 return fmt.Errorf("SDL: RemoveSubscriptionfromSdl(): %s\n", err.Error())
147 xapp.Logger.Debug("SDL: Subscription removed from db. subId = %v", subId)
152 func (c *Control) ReadAllSubscriptionsFromSdl() ([]uint32, map[uint32]*Subscription, error) {
154 // Read all subscriptionInfos
157 for i = 1; i < 65535; i++ {
158 subIds = append(subIds, i)
161 retMap := make(map[uint32]*Subscription)
163 keys, err := c.db.GetAll()
165 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), GetAll(). Error while reading keys from DBAAS %s\n", err.Error())
169 return subIds, retMap, nil
172 // Get all subscriptionInfos
173 iSubscriptionMap, err := c.db.Get(keys)
175 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl(), Get(): Error while reading subscriptions from DBAAS %s\n", err.Error())
178 for _, iSubscriptionInfo := range iSubscriptionMap {
180 if iSubscriptionInfo == nil {
181 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() iSubscriptionInfo = nil\n")
184 subscriptionInfo := &SubscriptionInfo{}
185 jsonSubscriptionInfo := iSubscriptionInfo.(string)
187 if err := json.Unmarshal([]byte(jsonSubscriptionInfo), subscriptionInfo); err != nil {
188 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() json.unmarshal error: %s\n", err.Error())
191 subs := c.CreateSubscription(subscriptionInfo, &jsonSubscriptionInfo)
193 if int(subscriptionInfo.ReqId.InstanceId) >= len(subIds) {
194 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() index is out of range. Index is %d with slice length %d", subscriptionInfo.ReqId.InstanceId, len(subIds))
196 retMap[subscriptionInfo.ReqId.InstanceId] = subs
198 // Remove subId from free subIds. Original slice is modified here!
199 subIds, err = removeNumber(subIds, subscriptionInfo.ReqId.InstanceId)
201 return nil, nil, fmt.Errorf("SDL: ReadAllSubscriptionsFromSdl() error: %s\n", err.Error())
204 return subIds, retMap, nil
207 func removeNumber(s []uint32, removedNum uint32) ([]uint32, error) {
208 for i, num := range s {
209 if removedNum == uint32(num) {
210 s = append(s[:i], s[i+1:]...)
211 return s[:len(s)], nil
214 return nil, fmt.Errorf("SDL: To be removed number not in the slice. removedNum: %v", removedNum)
216 func (c *Control) RemoveAllSubscriptionsFromSdl() error {
218 if err := c.db.RemoveAll(); err != nil {
219 return fmt.Errorf("SDL: RemoveAllSubscriptionsFromSdl(): %s\n", err.Error())
221 xapp.Logger.Debug("SDL: All subscriptions removed from db")