RICPLT-2954 Enhance error and info log writings
[ric-plt/submgr.git] / pkg / control / control.go
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19
20 package control
21
22 import "C"
23
24 import (
25         "errors"
26         rtmgrclient "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client"
27         rtmgrhandle "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client/handle"
28         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
29         httptransport "github.com/go-openapi/runtime/client"
30         "github.com/go-openapi/strfmt"
31         "github.com/spf13/viper"
32         "math/rand"
33         "time"
34         "sync"  
35 )
36
37 var subReqTime time.Duration = 2 * time.Second
38 var SubDelReqTime time.Duration = 2 * time.Second
39
40 type Control struct {
41         e2ap        *E2ap
42         registry    *Registry
43         rtmgrClient *RtmgrClient
44         tracker     *Tracker
45         timerMap        *TimerMap
46         rmrSendMutex *sync.Mutex        
47 }
48
49 type RMRMeid struct {
50         PlmnID string
51         EnbID  string
52         RanName string
53 }
54
55 var seedSN uint16
56
57 const (
58         CREATE Action = 0
59         MERGE  Action = 1
60         NONE   Action = 2
61         DELETE Action = 3
62 )
63
64 func init() {
65         xapp.Logger.Info("SUBMGR /ric-plt-submgr:r3-test-v4")
66         viper.AutomaticEnv()
67         viper.SetEnvPrefix("submgr")
68         viper.AllowEmptyEnv(true)
69         seedSN = uint16(viper.GetInt("seed_sn"))
70         if seedSN == 0 {
71                 rand.Seed(time.Now().UnixNano())
72                 seedSN = uint16(rand.Intn(65535))
73         }
74         if seedSN > 65535 {
75                 seedSN = 0
76         }
77         xapp.Logger.Info("SUBMGR: Initial Sequence Number: %v", seedSN)
78 }
79
80 func NewControl() Control {
81         registry := new(Registry)
82         registry.Initialize(seedSN)
83
84         tracker := new(Tracker)
85         tracker.Init()
86
87         timerMap := new(TimerMap)
88         timerMap.Init()
89
90         rmrSendMutex := &sync.Mutex{}
91
92         transport := httptransport.New(viper.GetString("rtmgr.HostAddr")+":"+viper.GetString("rtmgr.port"), viper.GetString("rtmgr.baseUrl"), []string{"http"})
93         client := rtmgrclient.New(transport, strfmt.Default)
94         handle := rtmgrhandle.NewProvideXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
95         deleteHandle := rtmgrhandle.NewDeleteXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
96         rtmgrClient := RtmgrClient{client, handle, deleteHandle}
97
98         return Control{new(E2ap), registry, &rtmgrClient, tracker, timerMap, rmrSendMutex}
99 }
100
101 func (c *Control) Run() {
102         xapp.Run(c)
103 }
104
105 func (c *Control) rmrSend(params *xapp.RMRParams) (err error) {
106         status := false
107         i := 1
108         for ; i <= 10 && status == false; i++ { 
109                 c.rmrSendMutex.Lock()
110                 status = xapp.Rmr.Send(params, false)
111                 c.rmrSendMutex.Unlock()
112                 if status == false {
113                         xapp.Logger.Info("rmr.Send() failed. Retry count %v, Mtype: %v, SubId: %v, Xid %s",i, params.Mtype, params.SubId, params.Xid)
114                         time.Sleep(500 * time.Millisecond)
115                 }
116         }
117         if status == false {
118                 err = errors.New("rmr.Send() failed")
119                 xapp.Rmr.Free(params.Mbuf)
120         }
121         return
122 }
123
124 func (c *Control) rmrReplyToSender(params *xapp.RMRParams) (err error) {
125         c.rmrSend(params)
126         return
127 }
128
129 func (c *Control) Consume(msg *xapp.RMRParams) (err error) {
130         switch msg.Mtype {
131         case xapp.RICMessageTypes["RIC_SUB_REQ"]:
132                 go c.handleSubscriptionRequest(msg)
133         case xapp.RICMessageTypes["RIC_SUB_RESP"]:
134                 go c.handleSubscriptionResponse(msg)
135         case xapp.RICMessageTypes["RIC_SUB_FAILURE"]:
136                 go c.handleSubscriptionFailure(msg)
137         case xapp.RICMessageTypes["RIC_SUB_DEL_REQ"]:
138                 go c.handleSubscriptionDeleteRequest(msg)
139         case xapp.RICMessageTypes["RIC_SUB_DEL_RESP"]:
140                 go c.handleSubscriptionDeleteResponse(msg)
141         default:
142                 xapp.Logger.Info("Unknown Message Type '%d', discarding", msg.Mtype)
143         }
144         return nil
145 }
146
147 func (c *Control) handleSubscriptionRequest(params *xapp.RMRParams) {
148         xapp.Logger.Info("SubReq received from Src: %s, Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Src, params.Mtype, params.SubId, params.Xid, params.Meid)
149         xapp.Rmr.Free(params.Mbuf)
150         params.Mbuf = nil
151
152         /* Reserve a sequence number and set it in the payload */
153         newSubId, isIdValid := c.registry.ReserveSequenceNumber()
154         if isIdValid != true {
155                 xapp.Logger.Error("SubReq: Failed to reserve sequence number. Dropping this msg. SubId: %v, Xid: %s",params.SubId, params.Xid)
156                 return 
157         }
158
159         err := c.e2ap.SetSubscriptionRequestSequenceNumber(params.Payload, newSubId)
160         if err != nil {
161                 xapp.Logger.Error("SubReq: Unable to set Sequence Number in Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
162                 return
163         }
164
165         srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
166         if err != nil {
167                 xapp.Logger.Error("SubReq: Failed to update routing-manager. Dropping this msg. Err: %s, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
168                 return
169         }
170
171         /* Create transatcion records for every subscription request */
172         xactKey := TransactionKey{newSubId, CREATE}
173         xactValue := Transaction{*srcAddr, *srcPort, params}
174         err = c.tracker.TrackTransaction(xactKey, xactValue)
175         if err != nil {
176                 xapp.Logger.Error("SubReq: Failed to create transaction record. Dropping this msg. Err: %v SubId: %v, Xid: %s", err, params.SubId, params.Xid)
177                 return
178         }
179
180         /* Update routing manager about the new subscription*/
181         subRouteAction := SubRouteInfo{CREATE, *srcAddr, *srcPort, newSubId}
182         xapp.Logger.Info("SubReq: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
183         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
184         if err != nil {
185                 xapp.Logger.Error("SubReq: Failed to update routing manager. Dropping this SubReq msg. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
186                 return
187         }
188
189         // Setting new subscription ID in the RMR header
190         params.SubId = int(newSubId)
191         xapp.Logger.Info("Forwarding SubReq to E2T: Mtype: %v, SubId: %v, Xid %s, Meid %v",params.Mtype, params.SubId, params.Xid, params.Meid)
192         err = c.rmrSend(params)
193         if err != nil {
194                 xapp.Logger.Error("SubReq: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
195         } /*else {
196                 c.timerMap.StartTimer(newSubId, subReqTime, c.handleSubscriptionRequestTimer)
197         }*/
198         xapp.Logger.Debug("SubReq: Debugging transaction table = %v", c.tracker.transactionTable)
199         return
200 }
201
202 func (c *Control) handleSubscriptionResponse(params *xapp.RMRParams) {
203         xapp.Logger.Info("SubResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
204         xapp.Rmr.Free(params.Mbuf)
205         params.Mbuf = nil
206
207         payloadSeqNum, err := c.e2ap.GetSubscriptionResponseSequenceNumber(params.Payload)
208         if err != nil {
209                 xapp.Logger.Error("SubResp: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v", err, params.SubId)
210                 return
211         }
212         xapp.Logger.Info("SubResp: Received payloadSeqNum: %v",payloadSeqNum)
213
214         if !c.registry.IsValidSequenceNumber(payloadSeqNum) {
215                 xapp.Logger.Error("SubResp: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)               
216                 return
217         }
218
219 //      c.timerMap.StopTimer(payloadSeqNum)
220
221         c.registry.setSubscriptionToConfirmed(payloadSeqNum)
222         var transaction Transaction
223         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, CREATE)
224         if err != nil {
225                 xapp.Logger.Error("SubResp: Failed to retrive transaction record. Dropping this msg. Err: %V, SubId: %v", err, params.SubId)
226                 return
227         }
228         xapp.Logger.Info("SubResp: SubId: %v, from address: %v:%v. Retrieved old subId", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
229
230     params.SubId = int(payloadSeqNum)
231     params.Xid = transaction.OrigParams.Xid
232         
233         xapp.Logger.Info("SubResp: Forwarding Subscription Response to xApp Mtype: %v, SubId: %v, Meid: %v",params.Mtype, params.SubId, params.Meid)
234         err = c.rmrReplyToSender(params)
235         if err != nil {
236                 xapp.Logger.Error("SubResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
237         }
238
239         xapp.Logger.Info("SubResp: SubId: %v, from address: %v:%v. Deleting transaction record", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
240         transaction, err = c.tracker.completeTransaction(payloadSeqNum, CREATE)
241         if err != nil {
242                 xapp.Logger.Error("SubResp: Failed to delete transaction record. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
243                 return
244         }
245         return
246 }
247
248 func (c *Control) handleSubscriptionFailure(params *xapp.RMRParams) {
249         xapp.Logger.Info("SubFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
250         xapp.Rmr.Free(params.Mbuf)
251         params.Mbuf = nil
252
253         payloadSeqNum, err := c.e2ap.GetSubscriptionFailureSequenceNumber(params.Payload)
254         if err != nil {
255                 xapp.Logger.Error("SubFail: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v", err, params.SubId)
256                 return
257         }
258         xapp.Logger.Info("SubFail: Received payloadSeqNum: %v", payloadSeqNum)
259
260 //      c.timerMap.StopTimer(payloadSeqNum)
261
262         var transaction Transaction
263         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, CREATE)
264         if  err != nil {
265                 xapp.Logger.Error("SubFail: Failed to retrive transaction record. Dropping this msg. Err: %v, SubId: %v: %s", err, params.SubId)
266                 return
267         }
268         xapp.Logger.Info("SubFail: SubId: %v, from address: %v:%v. Forwarding response to xApp", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
269
270         params.SubId = int(payloadSeqNum)
271         params.Xid = transaction.OrigParams.Xid
272
273         xapp.Logger.Info("Forwarding SubFail to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
274         err = c.rmrReplyToSender(params)
275         if err != nil {
276                 xapp.Logger.Error("Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
277         }
278
279         time.Sleep(3 * time.Second)
280
281         xapp.Logger.Info("SubFail: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
282         subRouteAction := SubRouteInfo{CREATE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
283         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
284         if err != nil {
285                 xapp.Logger.Error("SubFail: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
286         }
287
288         xapp.Logger.Info("SubFail: Deleting trancaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
289         if c.registry.releaseSequenceNumber(payloadSeqNum) {
290                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, CREATE)
291                 if err != nil {
292                         xapp.Logger.Error("SubFail: Failed to delete transaction record. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
293                         return
294                 }
295         } else {
296                 xapp.Logger.Error("SubFail: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
297                 return
298         }
299         return
300 }
301
302 func (c *Control) handleSubscriptionRequestTimer(subId uint16) {
303         xapp.Logger.Info("Subscription Request timer expired. SubId: %v",subId)
304 /*      
305         transaction, err := c.tracker.completeTransaction(subId, CREATE)
306         if err != nil {
307                 xapp.Logger.Error("Failed to delete a Subscription Request transaction record due to %v", err)
308                 return
309         }
310         xapp.Logger.Info("SubId: %v, Xid %v, Meid: %v",subId, transaction.OrigParams.Xid, transaction.OrigParams.Meid)
311
312         var params xapp.RMRParams
313         params.Mtype = 12012 //xapp.RICMessageTypes["RIC_SUB_FAILURE"]
314         params.SubId = int(subId)
315         params.Meid = transaction.OrigParams.Meid
316         params.Xid = transaction.OrigParams.Xid
317         payload := []byte("40C9408098000003EA7E00050000010016EA6300020021EA6E00808180EA6F000400000000EA6F000400010040EA6F000400020080EA6F0004000300C0EA6F000400040100EA6F000400050140EA6F000400060180EA6F0004000701C0EA6F000400080200EA6F000400090240EA6F0004000A0280EA6F0004000B02C0EA6F0004000C0300EA6F0004000D0340EA6F0004000E0380EA6F0004000F03C0")
318         params.PayloadLen = len(payload)
319         params.Payload = payload
320
321         xapp.Logger.Info("Forwarding Subscription Failure to xApp: Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
322         err = c.rmrReplyToSender(&params)
323         if err != nil {
324                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
325         }
326 */
327 /*
328         time.Sleep(3 * time.Second)
329
330         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Deleting transaction record", int(subId), transaction.XappInstanceAddress, transaction.XappPort)
331
332         xapp.Logger.Info("Starting routing manager update")
333         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
334         c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
335
336         xapp.Logger.Info("Deleting trancaction record")
337         if c.registry.releaseSequenceNumber(payloadSeqNum) {
338                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, CREATE)
339                 if err != nil {
340                         xapp.Logger.Error("Failed to delete a Subscription Request transaction record due to %v", err)
341                         return
342                 }
343         }
344 */
345         return
346 }
347
348 func (act Action) String() string {
349         actions := [...]string{
350                 "CREATE",
351                 "MERGE",
352                 "NONE",
353                 "DELETE",
354         }
355
356         if act < CREATE || act > DELETE {
357                 return "Unknown"
358         }
359         return actions[act]
360 }
361
362 func (act Action) valid() bool {
363         switch act {
364         case CREATE, MERGE, DELETE:
365                 return true
366         default:
367                 return false
368         }
369 }
370
371 func (c *Control) handleSubscriptionDeleteRequest(params *xapp.RMRParams) {
372         xapp.Logger.Info("SubDelReq received from Src: %s, Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Src, params.Mtype, params.SubId, params.Xid, params.Meid)
373         xapp.Rmr.Free(params.Mbuf)
374         params.Mbuf = nil
375
376         payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteRequestSequenceNumber(params.Payload)
377         if err != nil {
378                 xapp.Logger.Error("SubDelReq: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
379                 return
380         }
381         xapp.Logger.Info("SubDelReq: Received payloadSeqNum: %v", payloadSeqNum)
382
383         if c.registry.IsValidSequenceNumber(payloadSeqNum) {
384                 c.registry.deleteSubscription(payloadSeqNum)
385                 err = c.trackDeleteTransaction(params, payloadSeqNum)
386                 if err != nil {
387                         xapp.Logger.Error("SubDelReq: Failed to create transaction record. Dropping this msg. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
388                         return
389                 }
390         } else {
391                 xapp.Logger.Error("SubDelReq: Not valid sequence number. Dropping this msg. SubId: %v, Xid: %s", params.SubId, params.Xid)
392                 return
393         }
394         
395         xapp.Logger.Info("SubDelReq: Forwarding Request to E2T. Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
396         c.rmrSend(params)
397         if err != nil {
398                 xapp.Logger.Error("SubDelReq: Failed to send request to E2T. Err %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
399         } /*else {
400                 c.timerMap.StartTimer(payloadSeqNum, SubDelReqTime, c.handleSubscriptionDeleteRequestTimer)
401         }*/
402         return
403 }
404
405 func (c *Control) trackDeleteTransaction(params *xapp.RMRParams, payloadSeqNum uint16) (err error) {
406         srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
407         if err != nil {
408                 xapp.Logger.Error("SubDelReq: Failed to update routing-manager. Err: %s, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
409         }
410         xactKey := TransactionKey{payloadSeqNum, DELETE}
411         xactValue := Transaction{*srcAddr, *srcPort, params}
412         err = c.tracker.TrackTransaction(xactKey, xactValue)
413         return
414 }
415
416 func (c *Control) handleSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
417         xapp.Logger.Info("SubDelResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
418         xapp.Rmr.Free(params.Mbuf)
419         params.Mbuf = nil
420
421         payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteResponseSequenceNumber(params.Payload)
422         if err != nil {
423                 xapp.Logger.Error("SubDelResp: Unable to get Sequence Number from Payload. Dropping this msg. Err: %, SubId: %v", err, params.SubId)
424                 return
425         }
426         xapp.Logger.Info("SubDelResp: Received payloadSeqNum: %v", payloadSeqNum)
427
428 //      c.timerMap.StopTimer(payloadSeqNum)
429         
430         var transaction Transaction
431         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, DELETE)
432         if  err != nil {
433                 xapp.Logger.Error("SubDelResp: Failed to retrive transaction record. Dropping this msg. Err: %v, SubId: %v", err, params.SubId)
434                 return
435         }
436         xapp.Logger.Info("SubDelResp: SubId: %v, from address: %v:%v. Forwarding response to xApp", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
437
438     params.SubId = int(payloadSeqNum)
439     params.Xid = transaction.OrigParams.Xid
440         xapp.Logger.Info("Forwarding SubDelResp to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
441         err = c.rmrReplyToSender(params)
442         if err != nil {
443                 xapp.Logger.Error("SubDelResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
444 //              return
445         }
446
447         time.Sleep(3 * time.Second)
448
449         xapp.Logger.Info("SubDelResp: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
450         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
451         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
452         if err != nil {
453                 xapp.Logger.Error("SubDelResp: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
454                 return
455         }
456
457         xapp.Logger.Info("SubDelResp: Deleting trancaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
458         if c.registry.releaseSequenceNumber(payloadSeqNum) {
459                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
460                 if err != nil {
461                         xapp.Logger.Error("SubDelResp: Failed to delete transaction record. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
462                         return
463                 }
464         } else {
465                 xapp.Logger.Error("SubDelResp: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
466                 return
467         }
468         return
469 }
470
471 func (c *Control) handleSubscriptionDeleteFailure(params *xapp.RMRParams) {
472         xapp.Logger.Info("SubDelFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
473         xapp.Rmr.Free(params.Mbuf)
474         params.Mbuf = nil
475
476         payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteFailureSequenceNumber(params.Payload)
477         if err != nil {
478                 xapp.Logger.Error("SubDelFail: Unable to get Sequence Number from Payload. Dropping this msg. Err: %, SubId: %v", err, params.SubId)
479                 return
480         }
481         xapp.Logger.Info("SubDelFail: Received payloadSeqNum: %v", payloadSeqNum)
482
483 //      c.timerMap.StopTimer(payloadSeqNum)
484
485         var transaction Transaction
486         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, DELETE)
487         if  err != nil {
488                 xapp.Logger.Error("SubDelFail: Failed to retrive transaction record. Dropping msg. Err %v, SubId: %v", err, params.SubId)
489                 return
490         }
491         xapp.Logger.Info("SubDelFail: SubId: %v, from address: %v:%v. Forwarding response to xApp", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
492
493     params.SubId = int(payloadSeqNum)
494     params.Xid = transaction.OrigParams.Xid
495         xapp.Logger.Info("Forwarding SubDelFail to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
496         err = c.rmrReplyToSender(params)
497         if err != nil {
498                 xapp.Logger.Error("Failed to send SubDelFail to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
499 //              return
500         }
501
502         time.Sleep(3 * time.Second)
503
504         xapp.Logger.Info("SubDelFail: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
505         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
506         c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
507         if err != nil {
508                 xapp.Logger.Error("SubDelFail: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
509                 return
510         }
511
512         xapp.Logger.Info("SubDelFail: Deleting trancaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
513         if c.registry.releaseSequenceNumber(payloadSeqNum) {
514                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
515                 if err != nil {
516                         xapp.Logger.Error("SubDelFail: Failed to delete transaction record. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
517                         return
518                 }
519         } else {
520                 xapp.Logger.Error("SubDelFail: Failed to release sequency number. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
521                 return
522         }
523         return
524 }
525
526 func (c *Control) handleSubscriptionDeleteRequestTimer(subId uint16) {
527         xapp.Logger.Info("Subscription Delete Request timer expired. SubId: %v",subId)
528 /*      
529         transaction, err := c.tracker.completeTransaction(subId, DELETE)
530         if err != nil {
531                 xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
532                 return
533         }
534         xapp.Logger.Info("SubId: %v, Xid %v, Meid: %v",subId, transaction.OrigParams.Xid, transaction.OrigParams.Meid)
535
536         var params xapp.RMRParams
537         params.Mtype = 12022 //xapp.RICMessageTypes["RIC_SUB_DEL_FAILURE"]
538         params.SubId = int(subId)
539         params.Meid = transaction.OrigParams.Meid
540         params.Xid = transaction.OrigParams.Xid
541         payload := []byte("40CA4018000003EA7E00050000010016EA6300020021EA74000200C0")
542         params.PayloadLen = len(payload)
543         params.Payload = payload
544
545         xapp.Logger.Info("Forwarding Subscription Delete Failure to xApp: Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
546         err = c.rmrReplyToSender(&params)
547         if err != nil {
548                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
549         }
550 */      
551 /*
552         time.Sleep(3 * time.Second)
553         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Deleting transaction record", int(subId), transaction.XappInstanceAddress, transaction.XappPort)
554
555         xapp.Logger.Info("Starting routing manager update")
556         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
557         c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
558
559         xapp.Logger.Info("Deleting trancaction record")
560         if c.registry.releaseSequenceNumber(payloadSeqNum) {
561                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
562                 if err != nil {
563                         xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
564                         return
565                 }
566         }
567 */
568         return
569         }