8a06174e998a1d592cfa41b8042e14bdc962e6fa
[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("Subscription Request 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("Further processing of this SubscriptionRequest stopped. 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("Unable to set Subscription Sequence Number in Payload. Dropping this Subscription Request message. 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("Failed to update routing-manager about the subscription request with reason: %s", err)
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("Failed to create a Subscription Request transaction record. Err: %v", err)
177                 return
178         }
179
180         /* Update routing manager about the new subscription*/
181         subRouteAction := SubRouteInfo{CREATE, *srcAddr, *srcPort, newSubId}
182         xapp.Logger.Info("Starting routing manager update")
183         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
184         if err != nil {
185                 xapp.Logger.Error("Failed to update routing manager. Dropping this Subscription Request message. 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 Subscription Request 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("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("--- Debugging transaction table = %v", c.tracker.transactionTable)
199         return
200 }
201
202 func (c *Control) handleSubscriptionResponse(params *xapp.RMRParams) {
203         xapp.Logger.Info("Subscription Response 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("Unable to get Subscription Sequence Number from Payload. Dropping this Subscription Responsemessage. Err: v%, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
210                 return
211         }
212
213         xapp.Logger.Info("Received payloadSeqNum: %v",payloadSeqNum)
214         if !c.registry.IsValidSequenceNumber(payloadSeqNum) {
215                 xapp.Logger.Error("Unknown payloadSeqNum. Dropping this Subscription Response message. PayloadSeqNum: %v, SubId: %v, Xid: %s", payloadSeqNum, params.SubId, params.Xid)         
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("Failed to retrive transaction record. Dropping this Subscription Response message. Err: v%, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
226                 return
227         }
228         xapp.Logger.Info("Subscription ID: %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("Forwarding Subscription Response to UEEC: Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
234         err = c.rmrReplyToSender(params)
235         if err != nil {
236                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
237         }
238
239         xapp.Logger.Info("Subscription ID: %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("Failed to delete a Subscription Request transaction record due to %v", err)
243                 return
244         }
245         return
246 }
247
248 func (c *Control) handleSubscriptionFailure(params *xapp.RMRParams) {
249         xapp.Logger.Info("Subscription Failure 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("Unable to get Subscription Sequence Number from Payload. Dropping this Subscription Failure message. Err: v%, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
256                 return
257         }
258         xapp.Logger.Info("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("Failed to retrive transaction record. Dropping this Subscription Failure message. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
266                 return
267         }
268         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Forwarding response to requestor...", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
269
270         params.SubId = int(payloadSeqNum)
271         params.Xid = transaction.OrigParams.Xid
272
273         xapp.Logger.Info("Forwarding Subscription Failure to UEEC: 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 requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
277         }
278
279         time.Sleep(3 * time.Second)
280
281         xapp.Logger.Info("Starting routing manager update")
282         subRouteAction := SubRouteInfo{CREATE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
283         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
284         if err != nil {
285                 xapp.Logger.Error("Failed to update routing manager. Err: %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
286         }
287
288         xapp.Logger.Info("Deleting trancaction record")
289         if c.registry.releaseSequenceNumber(payloadSeqNum) {
290                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, CREATE)
291                 if err != nil {
292                         xapp.Logger.Error("Failed to delete a Subscription Request transaction record due to %v", err)
293                         return
294                 }
295         } else {
296                 xapp.Logger.Error("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 UEEC: 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("Subscription Delete Request 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("Unable to get Subscription Sequence Number from Payload. Dropping this Subscription Delete Request message. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
379                 return
380         }
381         xapp.Logger.Info("Received payloadSeqNum: %v", payloadSeqNum)
382         if c.registry.IsValidSequenceNumber(payloadSeqNum) {
383                 c.registry.deleteSubscription(payloadSeqNum)
384                 err = c.trackDeleteTransaction(params, payloadSeqNum)
385                 if err != nil {
386                         xapp.Logger.Error("Failed to create transaction record. Dropping this Subscription Delete Request message. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
387                         return
388                 }
389         } else {
390                 xapp.Logger.Error("Not valid sequence number. Dropping this Subscription Delete Request message. SubId: %v, Xid: %s", params.SubId, params.Xid)
391                 return
392         }
393         
394         xapp.Logger.Info("Forwarding Delete Subscription Request to E2T: Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
395         c.rmrSend(params)
396         if err != nil {
397                 xapp.Logger.Error("Failed to send request to E2T %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
398         } /*else {
399                 c.timerMap.StartTimer(payloadSeqNum, SubDelReqTime, c.handleSubscriptionDeleteRequestTimer)
400         }*/
401         return
402 }
403
404 func (c *Control) trackDeleteTransaction(params *xapp.RMRParams, payloadSeqNum uint16) (err error) {
405         srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
406         if err != nil {
407                 xapp.Logger.Error("Failed to update routing-manager about the subscription delete request with reason: %s", err)
408         }
409         xactKey := TransactionKey{payloadSeqNum, DELETE}
410         xactValue := Transaction{*srcAddr, *srcPort, params}
411         err = c.tracker.TrackTransaction(xactKey, xactValue)
412         return
413 }
414
415 func (c *Control) handleSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
416         xapp.Logger.Info("Subscription Delete Response Received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
417         xapp.Rmr.Free(params.Mbuf)
418         params.Mbuf = nil
419
420         payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteResponseSequenceNumber(params.Payload)
421         if err != nil {
422                 xapp.Logger.Error("Unable to get Subscription Sequence Number from Payload. Dropping this Subscription Delete Response message. Err: %, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
423                 return
424         }
425         xapp.Logger.Info("Received payloadSeqNum: %v", payloadSeqNum)
426
427 //      c.timerMap.StopTimer(payloadSeqNum)
428         
429         var transaction Transaction
430         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, DELETE)
431         if  err != nil {
432                 xapp.Logger.Error("Failed to retrive transaction record. Dropping this Subscription Delete Response message. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
433                 return
434         }
435         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Forwarding response to requestor...", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
436
437     params.SubId = int(payloadSeqNum)
438     params.Xid = transaction.OrigParams.Xid
439         xapp.Logger.Info("Forwarding Subscription Delete Response to UEEC: Mtype: %v, SubId: %v, Xid: %v, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
440         err = c.rmrReplyToSender(params)
441         if err != nil {
442                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
443 //              return
444         }
445
446         time.Sleep(3 * time.Second)
447
448         xapp.Logger.Info("Starting routing manager update")
449         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
450         err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
451         if err != nil {
452                 xapp.Logger.Error("Failed to update routing manager %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
453                 return
454         }
455
456         xapp.Logger.Info("Deleting trancaction record")
457         if c.registry.releaseSequenceNumber(payloadSeqNum) {
458                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
459                 if err != nil {
460                         xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
461                         return
462                 }
463         } else {
464                 xapp.Logger.Error("Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
465                 return
466         }
467         return
468 }
469
470 func (c *Control) handleSubscriptionDeleteFailure(params *xapp.RMRParams) {
471         xapp.Logger.Info("Subscription Delete Failure Received from Src: %s, Mtype: %v, SubId: %v, Meid: %v",params.Src, params.Mtype, params.SubId, params.Meid)
472         xapp.Rmr.Free(params.Mbuf)
473         params.Mbuf = nil
474
475         payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteFailureSequenceNumber(params.Payload)
476         if err != nil {
477                 xapp.Logger.Error("Unable to get Subscription Sequence Number from Payload. Dropping this Subscription Delete Failure message. Err: %, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
478                 return
479         }
480         xapp.Logger.Info("Received payloadSeqNum: %v", payloadSeqNum)
481
482 //      c.timerMap.StopTimer(payloadSeqNum)
483
484         var transaction Transaction
485         transaction, err = c.tracker.RetriveTransaction(payloadSeqNum, DELETE)
486         if  err != nil {
487                 xapp.Logger.Error("Failed to retrive transaction record. Dropping this Subscription Delete Failure message. Err %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
488                 return
489         }
490         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Forwarding response to requestor...", int(payloadSeqNum), transaction.XappInstanceAddress, transaction.XappPort)
491
492     params.SubId = int(payloadSeqNum)
493     params.Xid = transaction.OrigParams.Xid
494         xapp.Logger.Info("Forwarding Subscription Delete Failure to UEEC: Mtype: %v, SubId: %v, Xid: %v, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
495         err = c.rmrReplyToSender(params)
496         if err != nil {
497                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
498 //              return
499         }
500
501         time.Sleep(3 * time.Second)
502
503         xapp.Logger.Info("Starting routing manager update")
504         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
505         c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
506         if err != nil {
507                 xapp.Logger.Error("Failed to update routing manager %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
508                 return
509         }
510
511         xapp.Logger.Info("Deleting trancaction record")
512         if c.registry.releaseSequenceNumber(payloadSeqNum) {
513                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
514                 if err != nil {
515                         xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
516                         return
517                 }
518         } else {
519                 xapp.Logger.Error("Failed to release sequency number. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
520                 return
521         }
522         return
523 }
524
525 func (c *Control) handleSubscriptionDeleteRequestTimer(subId uint16) {
526         xapp.Logger.Info("Subscription Delete Request timer expired. SubId: %v",subId)
527 /*      
528         transaction, err := c.tracker.completeTransaction(subId, DELETE)
529         if err != nil {
530                 xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
531                 return
532         }
533         xapp.Logger.Info("SubId: %v, Xid %v, Meid: %v",subId, transaction.OrigParams.Xid, transaction.OrigParams.Meid)
534
535         var params xapp.RMRParams
536         params.Mtype = 12022 //xapp.RICMessageTypes["RIC_SUB_DEL_FAILURE"]
537         params.SubId = int(subId)
538         params.Meid = transaction.OrigParams.Meid
539         params.Xid = transaction.OrigParams.Xid
540         payload := []byte("40CA4018000003EA7E00050000010016EA6300020021EA74000200C0")
541         params.PayloadLen = len(payload)
542         params.Payload = payload
543
544         xapp.Logger.Info("Forwarding Subscription Delete Failure to UEEC: Mtype: %v, SubId: %v, Xid: %s, Meid: %v",params.Mtype, params.SubId, params.Xid, params.Meid)
545         err = c.rmrReplyToSender(&params)
546         if err != nil {
547                 xapp.Logger.Error("Failed to send response to requestor %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
548         }
549 */      
550 /*
551         time.Sleep(3 * time.Second)
552         xapp.Logger.Info("Subscription ID: %v, from address: %v:%v. Deleting transaction record", int(subId), transaction.XappInstanceAddress, transaction.XappPort)
553
554         xapp.Logger.Info("Starting routing manager update")
555         subRouteAction := SubRouteInfo{DELETE, transaction.XappInstanceAddress, transaction.XappPort, payloadSeqNum}
556         c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
557
558         xapp.Logger.Info("Deleting trancaction record")
559         if c.registry.releaseSequenceNumber(payloadSeqNum) {
560                 transaction, err = c.tracker.completeTransaction(payloadSeqNum, DELETE)
561                 if err != nil {
562                         xapp.Logger.Error("Failed to delete a Subscription Delete Request transaction record due to %v", err)
563                         return
564                 }
565         }
566 */
567         return
568         }