blob: 3446f255cc90aea68717b158030e516b42558363 [file] [log] [blame]
kalnagy45114752019-06-18 14:40:39 +02001/*
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
20package control
21
kalnagy45114752019-06-18 14:40:39 +020022import (
Juha Hyttinene406a342020-01-13 13:02:26 +020023 "fmt"
Anssi Mannilac92b4212020-12-07 14:59:34 +020024 "net/http"
25 "os"
26 "strconv"
27 "strings"
28 "time"
29
Juha Hyttinen86a46202020-01-14 12:49:09 +020030 "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
kalnagy93cc3e22019-09-19 11:29:29 +020031 rtmgrclient "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client"
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +020032 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
kalnagy1455c852019-10-21 13:06:23 +020033 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
34 httptransport "github.com/go-openapi/runtime/client"
35 "github.com/go-openapi/strfmt"
Anssi Mannilac92b4212020-12-07 14:59:34 +020036 "github.com/gorilla/mux"
kalnagy1455c852019-10-21 13:06:23 +020037 "github.com/spf13/viper"
kalnagy45114752019-06-18 14:40:39 +020038)
39
Juha Hyttinene406a342020-01-13 13:02:26 +020040//-----------------------------------------------------------------------------
41//
42//-----------------------------------------------------------------------------
43
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020044func idstring(err error, entries ...fmt.Stringer) string {
45 var retval string = ""
46 var filler string = ""
47 for _, entry := range entries {
48 retval += filler + entry.String()
49 filler = " "
50 }
51 if err != nil {
52 retval += filler + "err(" + err.Error() + ")"
53 filler = " "
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020054 }
55 return retval
56}
57
58//-----------------------------------------------------------------------------
59//
60//-----------------------------------------------------------------------------
61
Anssi Mannila2f26fb22020-12-07 08:32:13 +020062var e2tSubReqTimeout time.Duration
63var e2tSubDelReqTime time.Duration
64var e2tRecvMsgTimeout time.Duration
65var e2tMaxSubReqTryCount uint64 // Initial try + retry
66var e2tMaxSubDelReqTryCount uint64 // Initial try + retry
Anssi Mannilac92b4212020-12-07 14:59:34 +020067var readSubsFromDb string
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020068
kalnagy45114752019-06-18 14:40:39 +020069type Control struct {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +030070 *xapp.RMRClient
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020071 e2ap *E2ap
72 registry *Registry
73 tracker *Tracker
Anssi Mannilac92b4212020-12-07 14:59:34 +020074 db Sdlnterface
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +020075 //subscriber *xapp.Subscriber
Anssi Mannilac92b4212020-12-07 14:59:34 +020076 CntRecvMsg uint64
77 ResetTestFlag bool
Anssi Mannila4abf1802021-01-28 13:06:46 +020078 Counters map[string]xapp.Counter
kalnagy93cc3e22019-09-19 11:29:29 +020079}
80
81type RMRMeid struct {
Juha Hyttinenff8dccd2019-12-10 14:34:07 +020082 PlmnID string
83 EnbID string
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020084 RanName string
kalnagy93cc3e22019-09-19 11:29:29 +020085}
86
Anssi Mannilac92b4212020-12-07 14:59:34 +020087type SubmgrRestartTestEvent struct{}
88type SubmgrRestartUpEvent struct{}
89
Peter Szilagyifbc56f92019-07-23 19:29:46 +000090func init() {
Anssi Mannila8046c702020-01-02 13:39:05 +020091 xapp.Logger.Info("SUBMGR")
Peter Szilagyifbc56f92019-07-23 19:29:46 +000092 viper.AutomaticEnv()
93 viper.SetEnvPrefix("submgr")
94 viper.AllowEmptyEnv(true)
kalnagy45114752019-06-18 14:40:39 +020095}
96
Juha Hyttinenff8dccd2019-12-10 14:34:07 +020097func NewControl() *Control {
Juha Hyttinen0388dd92020-01-09 14:14:16 +020098
Anssi Mannilac92b4212020-12-07 14:59:34 +020099 transport := httptransport.New(viper.GetString("rtmgr.HostAddr")+":"+viper.GetString("rtmgr.port"), viper.GetString("rtmgr.baseUrl"), []string{"http"})
100 rtmgrClient := RtmgrClient{rtClient: rtmgrclient.New(transport, strfmt.Default)}
101
102 registry := new(Registry)
103 registry.Initialize()
104 registry.rtmgrClient = &rtmgrClient
105
106 tracker := new(Tracker)
107 tracker.Init()
108
Anssi Mannilac92b4212020-12-07 14:59:34 +0200109 c := &Control{e2ap: new(E2ap),
110 registry: registry,
111 tracker: tracker,
112 db: CreateSdl(),
113 //subscriber: subscriber,
Anssi Mannila4abf1802021-01-28 13:06:46 +0200114 Counters: xapp.Metric.RegisterCounterGroup(GetMetricsOpts(), "SUBMGR"),
Anssi Mannilac92b4212020-12-07 14:59:34 +0200115 }
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200116 c.ReadConfigParameters("")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200117
118 // Register REST handler for testing support
119 xapp.Resource.InjectRoute("/ric/v1/test/{testId}", c.TestRestHandler, "POST")
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000120 xapp.Resource.InjectRoute("/ric/v1/symptomdata", c.SymptomDataHandler, "GET")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200121
122 go xapp.Subscription.Listen(c.SubscriptionHandler, c.QueryHandler, c.SubscriptionDeleteHandler)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200123
124 if readSubsFromDb == "false" {
125 return c
126 }
127
128 // Read subscriptions from db
129 xapp.Logger.Info("Reading subscriptions from db")
130 subIds, register, err := c.ReadAllSubscriptionsFromSdl()
131 if err != nil {
132 xapp.Logger.Error("%v", err)
133 } else {
134 c.registry.subIds = subIds
135 c.registry.register = register
136 c.HandleUncompletedSubscriptions(register)
137 }
138 return c
139}
140
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000141func (c *Control) SymptomDataHandler(w http.ResponseWriter, r *http.Request) {
142 subscriptions, _ := c.registry.QueryHandler()
143 xapp.Resource.SendSymptomDataJson(w, r, subscriptions, "platform/subscriptions.json")
144}
145
Anssi Mannilac92b4212020-12-07 14:59:34 +0200146//-------------------------------------------------------------------
147//
148//-------------------------------------------------------------------
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200149func (c *Control) ReadConfigParameters(f string) {
Anssi Mannilac92b4212020-12-07 14:59:34 +0200150
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200151 // viper.GetDuration returns nanoseconds
152 e2tSubReqTimeout = viper.GetDuration("controls.e2tSubReqTimeout_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200153 if e2tSubReqTimeout == 0 {
154 e2tSubReqTimeout = 2000 * 1000000
155 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200156 xapp.Logger.Info("e2tSubReqTimeout %v", e2tSubReqTimeout)
157 e2tSubDelReqTime = viper.GetDuration("controls.e2tSubDelReqTime_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200158 if e2tSubDelReqTime == 0 {
159 e2tSubDelReqTime = 2000 * 1000000
160 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200161 xapp.Logger.Info("e2tSubDelReqTime %v", e2tSubDelReqTime)
162 e2tRecvMsgTimeout = viper.GetDuration("controls.e2tRecvMsgTimeout_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200163 if e2tRecvMsgTimeout == 0 {
164 e2tRecvMsgTimeout = 2000 * 1000000
165 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200166 xapp.Logger.Info("e2tRecvMsgTimeout %v", e2tRecvMsgTimeout)
167 e2tMaxSubReqTryCount = viper.GetUint64("controls.e2tMaxSubReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200168 if e2tMaxSubReqTryCount == 0 {
169 e2tMaxSubReqTryCount = 1
170 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200171 xapp.Logger.Info("e2tMaxSubReqTryCount %v", e2tMaxSubReqTryCount)
172 e2tMaxSubDelReqTryCount = viper.GetUint64("controls.e2tMaxSubDelReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200173 if e2tMaxSubDelReqTryCount == 0 {
174 e2tMaxSubDelReqTryCount = 1
175 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200176 xapp.Logger.Info("e2tMaxSubDelReqTryCount %v", e2tMaxSubDelReqTryCount)
177
Anssi Mannilac92b4212020-12-07 14:59:34 +0200178 readSubsFromDb = viper.GetString("controls.readSubsFromDb")
179 if readSubsFromDb == "" {
180 readSubsFromDb = "true"
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200181 }
Anssi Mannilac92b4212020-12-07 14:59:34 +0200182 xapp.Logger.Info("readSubsFromDb %v", readSubsFromDb)
183}
184
185//-------------------------------------------------------------------
186//
187//-------------------------------------------------------------------
188func (c *Control) HandleUncompletedSubscriptions(register map[uint32]*Subscription) {
189
190 xapp.Logger.Debug("HandleUncompletedSubscriptions. len(register) = %v", len(register))
191 for subId, subs := range register {
192 if subs.SubRespRcvd == false {
193 subs.NoRespToXapp = true
194 xapp.Logger.Debug("SendSubscriptionDeleteReq. subId = %v", subId)
195 c.SendSubscriptionDeleteReq(subs)
196 }
197 }
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200198}
199
200func (c *Control) ReadyCB(data interface{}) {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300201 if c.RMRClient == nil {
202 c.RMRClient = xapp.Rmr
Juha Hyttinenff8dccd2019-12-10 14:34:07 +0200203 }
kalnagy45114752019-06-18 14:40:39 +0200204}
205
206func (c *Control) Run() {
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200207 xapp.SetReadyCB(c.ReadyCB, nil)
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200208 xapp.AddConfigChangeListener(c.ReadConfigParameters)
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000209 xapp.Run(c)
kalnagy45114752019-06-18 14:40:39 +0200210}
211
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200212//-------------------------------------------------------------------
213//
214//-------------------------------------------------------------------
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300215func (c *Control) SubscriptionHandler(stype models.SubscriptionType, params interface{}) (*models.SubscriptionResponse, error) {
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200216 /*
217 switch p := params.(type) {
218 case *models.ReportParams:
219 trans := c.tracker.NewXappTransaction(NewRmrEndpoint(p.ClientEndpoint),"" , 0, &xapp.RMRMeid{RanName: p.Meid})
220 if trans == nil {
221 xapp.Logger.Error("XAPP-SubReq: %s", idstring(fmt.Errorf("transaction not created"), params))
222 return
223 }
224 defer trans.Release()
225 case *models.ControlParams:
226 case *models.PolicyParams:
227 }
228 */
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300229 return &models.SubscriptionResponse{}, fmt.Errorf("Subscription rest interface not implemented")
230}
231
Anssi Mannilac92b4212020-12-07 14:59:34 +0200232func (c *Control) SubscriptionDeleteHandler(s string) error {
233 return nil
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200234}
235
236func (c *Control) QueryHandler() (models.SubscriptionList, error) {
Anssi Mannila4c626a22021-02-11 12:50:48 +0200237 xapp.Logger.Info("QueryHandler() called")
238
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200239 return c.registry.QueryHandler()
240}
241
Anssi Mannilac92b4212020-12-07 14:59:34 +0200242func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) {
Anssi Mannilac92b4212020-12-07 14:59:34 +0200243 xapp.Logger.Info("TestRestHandler() called")
244
245 pathParams := mux.Vars(r)
246 s := pathParams["testId"]
247
248 // This can be used to delete single subscription from db
249 if contains := strings.Contains(s, "deletesubid="); contains == true {
250 var splits = strings.Split(s, "=")
251 if subId, err := strconv.ParseInt(splits[1], 10, 64); err == nil {
252 xapp.Logger.Info("RemoveSubscriptionFromSdl() called. subId = %v", subId)
253 c.RemoveSubscriptionFromSdl(uint32(subId))
254 return
255 }
256 }
257
258 // This can be used to remove all subscriptions db from
259 if s == "emptydb" {
260 xapp.Logger.Info("RemoveAllSubscriptionsFromSdl() called")
261 c.RemoveAllSubscriptionsFromSdl()
262 return
263 }
264
265 // This is meant to cause submgr's restart in testing
266 if s == "restart" {
267 xapp.Logger.Info("os.Exit(1) called")
268 os.Exit(1)
269 }
270
271 xapp.Logger.Info("Unsupported rest command received %s", s)
272}
273
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200274//-------------------------------------------------------------------
275//
276//-------------------------------------------------------------------
277
Juha Hyttinen83ada002020-01-30 10:36:33 +0200278func (c *Control) rmrSendToE2T(desc string, subs *Subscription, trans *TransactionSubs) (err error) {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300279 params := &xapp.RMRParams{}
Juha Hyttinene406a342020-01-13 13:02:26 +0200280 params.Mtype = trans.GetMtype()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300281 params.SubId = int(subs.GetReqId().InstanceId)
Juha Hyttinen86a46202020-01-14 12:49:09 +0200282 params.Xid = ""
Juha Hyttinene406a342020-01-13 13:02:26 +0200283 params.Meid = subs.GetMeid()
284 params.Src = ""
Juha Hyttinen63284a22020-01-15 10:45:11 +0200285 params.PayloadLen = len(trans.Payload.Buf)
286 params.Payload = trans.Payload.Buf
Juha Hyttinene406a342020-01-13 13:02:26 +0200287 params.Mbuf = nil
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200288 xapp.Logger.Info("MSG to E2T: %s %s %s", desc, trans.String(), params.String())
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000289 err = c.SendWithRetry(params, false, 5)
290 if err != nil {
291 xapp.Logger.Error("rmrSendToE2T: Send failed: %+v", err)
292 }
293 return err
kalnagye0018682019-09-26 16:28:25 +0200294}
295
Juha Hyttinen83ada002020-01-30 10:36:33 +0200296func (c *Control) rmrSendToXapp(desc string, subs *Subscription, trans *TransactionXapp) (err error) {
297
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300298 params := &xapp.RMRParams{}
Juha Hyttinen63284a22020-01-15 10:45:11 +0200299 params.Mtype = trans.GetMtype()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300300 params.SubId = int(subs.GetReqId().InstanceId)
Juha Hyttinene406a342020-01-13 13:02:26 +0200301 params.Xid = trans.GetXid()
Juha Hyttinen86a46202020-01-14 12:49:09 +0200302 params.Meid = trans.GetMeid()
Juha Hyttinene406a342020-01-13 13:02:26 +0200303 params.Src = ""
Juha Hyttinen63284a22020-01-15 10:45:11 +0200304 params.PayloadLen = len(trans.Payload.Buf)
305 params.Payload = trans.Payload.Buf
Juha Hyttinene406a342020-01-13 13:02:26 +0200306 params.Mbuf = nil
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200307 xapp.Logger.Info("MSG to XAPP: %s %s %s", desc, trans.String(), params.String())
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000308 err = c.SendWithRetry(params, false, 5)
309 if err != nil {
310 xapp.Logger.Error("rmrSendToXapp: Send failed: %+v", err)
311 }
312 return err
Juha Hyttinene406a342020-01-13 13:02:26 +0200313}
314
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300315func (c *Control) Consume(msg *xapp.RMRParams) (err error) {
316 if c.RMRClient == nil {
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200317 err = fmt.Errorf("Rmr object nil can handle %s", msg.String())
318 xapp.Logger.Error("%s", err.Error())
319 return
320 }
321 c.CntRecvMsg++
322
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300323 defer c.RMRClient.Free(msg.Mbuf)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200324
Juha Hyttinena8a908d2020-05-26 15:12:47 +0300325 // xapp-frame might use direct access to c buffer and
326 // when msg.Mbuf is freed, someone might take it into use
327 // and payload data might be invalid inside message handle function
328 //
329 // subscriptions won't load system a lot so there is no
330 // real performance hit by cloning buffer into new go byte slice
331 cPay := append(msg.Payload[:0:0], msg.Payload...)
332 msg.Payload = cPay
333 msg.PayloadLen = len(cPay)
334
Anssi Mannila90fa0212019-12-12 10:47:47 +0200335 switch msg.Mtype {
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200336 case xapp.RIC_SUB_REQ:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200337 go c.handleXAPPSubscriptionRequest(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200338 case xapp.RIC_SUB_RESP:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200339 go c.handleE2TSubscriptionResponse(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200340 case xapp.RIC_SUB_FAILURE:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200341 go c.handleE2TSubscriptionFailure(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200342 case xapp.RIC_SUB_DEL_REQ:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200343 go c.handleXAPPSubscriptionDeleteRequest(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200344 case xapp.RIC_SUB_DEL_RESP:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200345 go c.handleE2TSubscriptionDeleteResponse(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200346 case xapp.RIC_SUB_DEL_FAILURE:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200347 go c.handleE2TSubscriptionDeleteFailure(msg)
Anssi Mannila90fa0212019-12-12 10:47:47 +0200348 default:
349 xapp.Logger.Info("Unknown Message Type '%d', discarding", msg.Mtype)
Balint Uvegescd3881b2019-10-02 15:01:43 +0000350 }
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200351 return
Juha Hyttinen31797b42020-01-16 14:05:01 +0200352}
353
Juha Hyttinen422d0182020-01-17 13:37:05 +0200354//-------------------------------------------------------------------
355// handle from XAPP Subscription Request
356//------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300357func (c *Control) handleXAPPSubscriptionRequest(params *xapp.RMRParams) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200358 xapp.Logger.Info("MSG from XAPP: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200359 c.UpdateCounter(cSubReqFromXapp)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200360
361 subReqMsg, err := c.e2ap.UnpackSubscriptionRequest(params.Payload)
362 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200363 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200364 return
365 }
366
Anssi Mannila4c626a22021-02-11 12:50:48 +0200367 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(params.Src), params.Xid, subReqMsg.RequestId, params.Meid)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200368 if trans == nil {
369 xapp.Logger.Error("XAPP-SubReq: %s", idstring(fmt.Errorf("transaction not created"), params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200370 return
371 }
372 defer trans.Release()
373
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200374 if err = c.tracker.Track(trans); err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200375 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
376 return
377 }
378
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300379 //TODO handle subscription toward e2term inside AssignToSubscription / hide handleSubscriptionCreate in it?
Anssi Mannila4abf1802021-01-28 13:06:46 +0200380 subs, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200381 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200382 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200383 return
384 }
385
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200386 c.wakeSubscriptionRequest(subs, trans)
387}
388
389//-------------------------------------------------------------------
390// Wake Subscription Request to E2node
391//------------------------------------------------------------------
392func (c *Control) wakeSubscriptionRequest(subs *Subscription, trans *TransactionXapp) {
393
Juha Hyttinen422d0182020-01-17 13:37:05 +0200394 go c.handleSubscriptionCreate(subs, trans)
395 event, _ := trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200396 var err error
Juha Hyttinen422d0182020-01-17 13:37:05 +0200397 if event != nil {
398 switch themsg := event.(type) {
399 case *e2ap.E2APSubscriptionResponse:
Anssi Mannila4c626a22021-02-11 12:50:48 +0200400 themsg.RequestId.Id = trans.RequestId.Id
Juha Hyttinen422d0182020-01-17 13:37:05 +0200401 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionResponse(themsg)
402 if err == nil {
Anssi Mannila64a0df42020-02-26 09:46:03 +0200403 trans.Release()
Anssi Mannila4abf1802021-01-28 13:06:46 +0200404 c.UpdateCounter(cSubRespToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200405 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200406 return
407 }
408 case *e2ap.E2APSubscriptionFailure:
Anssi Mannila4c626a22021-02-11 12:50:48 +0200409 themsg.RequestId.Id = trans.RequestId.Id
Juha Hyttinen422d0182020-01-17 13:37:05 +0200410 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionFailure(themsg)
411 if err == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200412 c.UpdateCounter(cSubFailToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200413 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200414 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200415 default:
Juha Hyttinen31797b42020-01-16 14:05:01 +0200416 break
417 }
418 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200419 xapp.Logger.Info("XAPP-SubReq: failed %s", idstring(err, trans, subs))
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300420 //c.registry.RemoveFromSubscription(subs, trans, 5*time.Second)
Juha Hyttinen31797b42020-01-16 14:05:01 +0200421}
422
Juha Hyttinen422d0182020-01-17 13:37:05 +0200423//-------------------------------------------------------------------
424// handle from XAPP Subscription Delete Request
425//------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300426func (c *Control) handleXAPPSubscriptionDeleteRequest(params *xapp.RMRParams) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200427 xapp.Logger.Info("MSG from XAPP: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200428 c.UpdateCounter(cSubDelReqFromXapp)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200429
430 subDelReqMsg, err := c.e2ap.UnpackSubscriptionDeleteRequest(params.Payload)
Juha Hyttinen31797b42020-01-16 14:05:01 +0200431 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200432 xapp.Logger.Error("XAPP-SubDelReq %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200433 return
434 }
435
Anssi Mannila4c626a22021-02-11 12:50:48 +0200436 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(params.Src), params.Xid, subDelReqMsg.RequestId, params.Meid)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200437 if trans == nil {
438 xapp.Logger.Error("XAPP-SubDelReq: %s", idstring(fmt.Errorf("transaction not created"), params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200439 return
440 }
441 defer trans.Release()
442
Juha Hyttinen83ada002020-01-30 10:36:33 +0200443 err = c.tracker.Track(trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200444 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200445 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
446 return
447 }
448
Juha Hyttinen47942b42020-02-27 10:41:43 +0200449 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{trans.GetSubId()})
Juha Hyttinen83ada002020-01-30 10:36:33 +0200450 if err != nil {
451 xapp.Logger.Error("XAPP-SubDelReq: %s", idstring(err, trans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200452 return
453 }
454
Juha Hyttinen422d0182020-01-17 13:37:05 +0200455 //
456 // Wake subs delete
457 //
458 go c.handleSubscriptionDelete(subs, trans)
459 trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
460
Juha Hyttinen83ada002020-01-30 10:36:33 +0200461 xapp.Logger.Debug("XAPP-SubDelReq: Handling event %s ", idstring(nil, trans, subs))
462
Anssi Mannilac92b4212020-12-07 14:59:34 +0200463 if subs.NoRespToXapp == true {
464 // Do no send delete responses to xapps due to submgr restart is deleting uncompleted subscriptions
465 return
466 }
467
468 // Whatever is received success, fail or timeout, send successful delete response
Juha Hyttinen422d0182020-01-17 13:37:05 +0200469 subDelRespMsg := &e2ap.E2APSubscriptionDeleteResponse{}
Anssi Mannila4c626a22021-02-11 12:50:48 +0200470 subDelRespMsg.RequestId.Id = trans.RequestId.Id
471 subDelRespMsg.RequestId.InstanceId = subs.GetReqId().RequestId.InstanceId
Juha Hyttinen422d0182020-01-17 13:37:05 +0200472 subDelRespMsg.FunctionId = subs.SubReqMsg.FunctionId
473 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteResponse(subDelRespMsg)
474 if err == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200475 c.UpdateCounter(cSubDelRespToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200476 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200477 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200478
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300479 //TODO handle subscription toward e2term insiged RemoveFromSubscription / hide handleSubscriptionDelete in it?
480 //c.registry.RemoveFromSubscription(subs, trans, 5*time.Second)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200481}
482
483//-------------------------------------------------------------------
484// SUBS CREATE Handling
485//-------------------------------------------------------------------
Juha Hyttinen83ada002020-01-30 10:36:33 +0200486func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *TransactionXapp) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200487
Anssi Mannilac92b4212020-12-07 14:59:34 +0200488 var removeSubscriptionFromDb bool = false
Juha Hyttinen83ada002020-01-30 10:36:33 +0200489 trans := c.tracker.NewSubsTransaction(subs)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200490 subs.WaitTransactionTurn(trans)
491 defer subs.ReleaseTransactionTurn(trans)
492 defer trans.Release()
493
Juha Hyttinen83ada002020-01-30 10:36:33 +0200494 xapp.Logger.Debug("SUBS-SubReq: Handling %s ", idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200495
Juha Hyttinen83ada002020-01-30 10:36:33 +0200496 subRfMsg, valid := subs.GetCachedResponse()
497 if subRfMsg == nil && valid == true {
Anssi Mannila6d629ad2021-01-25 09:59:56 +0200498 event := c.sendE2TSubscriptionRequest(subs, trans, parentTrans)
499 switch event.(type) {
500 case *e2ap.E2APSubscriptionResponse:
501 subRfMsg, valid = subs.SetCachedResponse(event, true)
502 subs.SubRespRcvd = true
503 case *e2ap.E2APSubscriptionFailure:
504 removeSubscriptionFromDb = true
505 subRfMsg, valid = subs.SetCachedResponse(event, false)
Anssi Mannilaebaeae62021-02-12 11:56:20 +0200506 xapp.Logger.Info("SUBS-SubReq: internal delete due event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
Anssi Mannila6d629ad2021-01-25 09:59:56 +0200507 case *SubmgrRestartTestEvent:
508 // This simulates that no response has been received and after restart subscriptions are restored from db
509 xapp.Logger.Debug("Test restart flag is active. Dropping this transaction to test restart case")
510 return
511 default:
512 xapp.Logger.Info("SUBS-SubReq: internal delete due event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
513 removeSubscriptionFromDb = true
514 subRfMsg, valid = subs.SetCachedResponse(nil, false)
515 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200516 }
517 xapp.Logger.Debug("SUBS-SubReq: Handling (e2t response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans))
518 } else {
519 xapp.Logger.Debug("SUBS-SubReq: Handling (cached response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200520 }
521
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300522 //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete)
523 if valid == false {
Anssi Mannilac92b4212020-12-07 14:59:34 +0200524 c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second, c)
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300525 }
Anssi Mannilac92b4212020-12-07 14:59:34 +0200526
527 c.UpdateSubscriptionInDB(subs, removeSubscriptionFromDb)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200528 parentTrans.SendEvent(subRfMsg, 0)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200529}
530
531//-------------------------------------------------------------------
532// SUBS DELETE Handling
533//-------------------------------------------------------------------
Juha Hyttinen3944a222020-01-24 11:51:46 +0200534
Juha Hyttinen83ada002020-01-30 10:36:33 +0200535func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *TransactionXapp) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200536
Juha Hyttinen83ada002020-01-30 10:36:33 +0200537 trans := c.tracker.NewSubsTransaction(subs)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200538 subs.WaitTransactionTurn(trans)
539 defer subs.ReleaseTransactionTurn(trans)
540 defer trans.Release()
541
Juha Hyttinen83ada002020-01-30 10:36:33 +0200542 xapp.Logger.Debug("SUBS-SubDelReq: Handling %s", idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200543
Juha Hyttinen3944a222020-01-24 11:51:46 +0200544 subs.mutex.Lock()
Anssi Mannila4abf1802021-01-28 13:06:46 +0200545
Juha Hyttinen3944a222020-01-24 11:51:46 +0200546 if subs.valid && subs.EpList.HasEndpoint(parentTrans.GetEndpoint()) && subs.EpList.Size() == 1 {
547 subs.valid = false
548 subs.mutex.Unlock()
549 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
550 } else {
551 subs.mutex.Unlock()
552 }
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300553 //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete)
554 // If parallel deletes ongoing both might pass earlier sendE2TSubscriptionDeleteRequest(...) if
555 // RemoveFromSubscription locates in caller side (now in handleXAPPSubscriptionDeleteRequest(...))
Anssi Mannilac92b4212020-12-07 14:59:34 +0200556 c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second, c)
557 c.registry.UpdateSubscriptionToDb(subs, c)
Juha Hyttinen47942b42020-02-27 10:41:43 +0200558 parentTrans.SendEvent(nil, 0)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200559}
560
561//-------------------------------------------------------------------
562// send to E2T Subscription Request
563//-------------------------------------------------------------------
Juha Hyttinen83ada002020-01-30 10:36:33 +0200564func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200565 var err error
566 var event interface{} = nil
567 var timedOut bool = false
568
569 subReqMsg := subs.SubReqMsg
Juha Hyttinen83ada002020-01-30 10:36:33 +0200570 subReqMsg.RequestId = subs.GetReqId().RequestId
Juha Hyttinen422d0182020-01-17 13:37:05 +0200571 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionRequest(subReqMsg)
572 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200573 xapp.Logger.Error("SUBS-SubReq: %s", idstring(err, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200574 return event
575 }
576
Anssi Mannilac92b4212020-12-07 14:59:34 +0200577 // Write uncompleted subscrition in db. If no response for subscrition it need to be re-processed (deleted) after restart
578 c.WriteSubscriptionToDb(subs)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200579 for retries := uint64(0); retries < e2tMaxSubReqTryCount; retries++ {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200580 desc := fmt.Sprintf("(retry %d)", retries)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200581 if retries == 0 {
582 c.UpdateCounter(cSubReqToE2)
583 } else {
584 c.UpdateCounter(cSubReReqToE2)
585 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200586 c.rmrSendToE2T(desc, subs, trans)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200587 if subs.DoNotWaitSubResp == false {
588 event, timedOut = trans.WaitEvent(e2tSubReqTimeout)
589 if timedOut {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200590 c.UpdateCounter(cSubReqTimerExpiry)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200591 continue
592 }
593 } else {
594 // Simulating case where subscrition request has been sent but response has not been received before restart
595 event = &SubmgrRestartTestEvent{}
Juha Hyttinen422d0182020-01-17 13:37:05 +0200596 }
597 break
598 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200599 xapp.Logger.Debug("SUBS-SubReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200600 return event
601}
602
603//-------------------------------------------------------------------
604// send to E2T Subscription Delete Request
605//-------------------------------------------------------------------
606
Juha Hyttinen83ada002020-01-30 10:36:33 +0200607func (c *Control) sendE2TSubscriptionDeleteRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200608 var err error
609 var event interface{}
610 var timedOut bool
611
612 subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
Juha Hyttinen83ada002020-01-30 10:36:33 +0200613 subDelReqMsg.RequestId = subs.GetReqId().RequestId
Juha Hyttinenaf91f972020-01-24 08:38:47 +0200614 subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
Juha Hyttinen422d0182020-01-17 13:37:05 +0200615 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)
616 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200617 xapp.Logger.Error("SUBS-SubDelReq: %s", idstring(err, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200618 return event
619 }
620
621 for retries := uint64(0); retries < e2tMaxSubDelReqTryCount; retries++ {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200622 desc := fmt.Sprintf("(retry %d)", retries)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200623 if retries == 0 {
624 c.UpdateCounter(cSubDelReqToE2)
625 } else {
626 c.UpdateCounter(cSubDelReReqToE2)
627 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200628 c.rmrSendToE2T(desc, subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200629 event, timedOut = trans.WaitEvent(e2tSubDelReqTime)
630 if timedOut {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200631 c.UpdateCounter(cSubDelReqTimerExpiry)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200632 continue
633 }
634 break
635 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200636 xapp.Logger.Debug("SUBS-SubDelReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200637 return event
638}
639
640//-------------------------------------------------------------------
Anssi Mannila4abf1802021-01-28 13:06:46 +0200641// handle from E2T Subscription Response
Juha Hyttinen422d0182020-01-17 13:37:05 +0200642//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300643func (c *Control) handleE2TSubscriptionResponse(params *xapp.RMRParams) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200644 xapp.Logger.Info("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200645 c.UpdateCounter(cSubRespFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200646 subRespMsg, err := c.e2ap.UnpackSubscriptionResponse(params.Payload)
647 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200648 xapp.Logger.Error("MSG-SubResp %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200649 return
650 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300651 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subRespMsg.RequestId.InstanceId})
Juha Hyttinen422d0182020-01-17 13:37:05 +0200652 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200653 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200654 return
Juha Hyttinen31797b42020-01-16 14:05:01 +0200655 }
656 trans := subs.GetTransaction()
657 if trans == nil {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200658 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +0200659 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, params, subs))
Juha Hyttinenff8dccd2019-12-10 14:34:07 +0200660 return
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200661 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200662 sendOk, timedOut := trans.SendEvent(subRespMsg, e2tRecvMsgTimeout)
663 if sendOk == false {
664 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200665 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, trans, subs))
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000666 }
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000667 return
kalnagy45114752019-06-18 14:40:39 +0200668}
669
Juha Hyttinen422d0182020-01-17 13:37:05 +0200670//-------------------------------------------------------------------
671// handle from E2T Subscription Failure
672//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300673func (c *Control) handleE2TSubscriptionFailure(params *xapp.RMRParams) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200674 xapp.Logger.Info("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200675 c.UpdateCounter(cSubFailFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200676 subFailMsg, err := c.e2ap.UnpackSubscriptionFailure(params.Payload)
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000677 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200678 xapp.Logger.Error("MSG-SubFail %s", idstring(err, params))
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000679 return
680 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300681 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subFailMsg.RequestId.InstanceId})
Juha Hyttinen31797b42020-01-16 14:05:01 +0200682 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200683 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, params))
Juha Hyttinenaafee7f2020-01-14 14:54:51 +0200684 return
685 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200686 trans := subs.GetTransaction()
687 if trans == nil {
688 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +0200689 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, params, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +0200690 return
691 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200692 sendOk, timedOut := trans.SendEvent(subFailMsg, e2tRecvMsgTimeout)
693 if sendOk == false {
694 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200695 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, trans, subs))
Juha Hyttinenaafee7f2020-01-14 14:54:51 +0200696 }
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200697 return
698}
699
Juha Hyttinen422d0182020-01-17 13:37:05 +0200700//-------------------------------------------------------------------
701// handle from E2T Subscription Delete Response
702//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300703func (c *Control) handleE2TSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200704 xapp.Logger.Info("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200705 c.UpdateCounter(cSubDelRespFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200706 subDelRespMsg, err := c.e2ap.UnpackSubscriptionDeleteResponse(params.Payload)
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200707 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200708 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params))
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200709 return
710 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300711 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subDelRespMsg.RequestId.InstanceId})
Juha Hyttinen31797b42020-01-16 14:05:01 +0200712 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200713 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params))
Juha Hyttinen0d064ec2020-01-09 09:08:53 +0200714 return
715 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200716 trans := subs.GetTransaction()
717 if trans == nil {
718 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +0200719 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +0200720 return
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200721 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200722 sendOk, timedOut := trans.SendEvent(subDelRespMsg, e2tRecvMsgTimeout)
723 if sendOk == false {
724 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200725 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, trans, subs))
Juha Hyttinen60bfcf92020-01-14 15:14:24 +0200726 }
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200727 return
728}
729
Juha Hyttinen422d0182020-01-17 13:37:05 +0200730//-------------------------------------------------------------------
731// handle from E2T Subscription Delete Failure
732//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300733func (c *Control) handleE2TSubscriptionDeleteFailure(params *xapp.RMRParams) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200734 xapp.Logger.Info("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200735 c.UpdateCounter(cSubDelFailFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200736 subDelFailMsg, err := c.e2ap.UnpackSubscriptionDeleteFailure(params.Payload)
Juha Hyttinen31797b42020-01-16 14:05:01 +0200737 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200738 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params))
Anssi Mannilaf1d0eb62019-12-17 15:29:55 +0200739 return
740 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300741 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subDelFailMsg.RequestId.InstanceId})
Anssi Mannila8046c702020-01-02 13:39:05 +0200742 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200743 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params))
Anssi Mannila8046c702020-01-02 13:39:05 +0200744 return
745 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200746 trans := subs.GetTransaction()
747 if trans == nil {
748 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +0200749 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params, subs))
Juha Hyttinen86a46202020-01-14 12:49:09 +0200750 return
751 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200752 sendOk, timedOut := trans.SendEvent(subDelFailMsg, e2tRecvMsgTimeout)
753 if sendOk == false {
754 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200755 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, trans, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +0200756 }
kalnagy93cc3e22019-09-19 11:29:29 +0200757 return
758}
759
Juha Hyttinen422d0182020-01-17 13:37:05 +0200760//-------------------------------------------------------------------
761//
762//-------------------------------------------------------------------
763func typeofSubsMessage(v interface{}) string {
764 if v == nil {
765 return "NIL"
kalnagy93cc3e22019-09-19 11:29:29 +0200766 }
Juha Hyttinen422d0182020-01-17 13:37:05 +0200767 switch v.(type) {
768 case *e2ap.E2APSubscriptionRequest:
769 return "SubReq"
770 case *e2ap.E2APSubscriptionResponse:
771 return "SubResp"
772 case *e2ap.E2APSubscriptionFailure:
773 return "SubFail"
774 case *e2ap.E2APSubscriptionDeleteRequest:
775 return "SubDelReq"
776 case *e2ap.E2APSubscriptionDeleteResponse:
777 return "SubDelResp"
778 case *e2ap.E2APSubscriptionDeleteFailure:
779 return "SubDelFail"
780 default:
781 return "Unknown"
Juha Hyttinen31797b42020-01-16 14:05:01 +0200782 }
Anssi Mannilaf1d0eb62019-12-17 15:29:55 +0200783}
Anssi Mannilac92b4212020-12-07 14:59:34 +0200784
785//-------------------------------------------------------------------
786//
787//-------------------------------------------------------------------
788func (c *Control) WriteSubscriptionToDb(subs *Subscription) {
789 xapp.Logger.Debug("WriteSubscriptionToDb() subId = %v", subs.ReqId.InstanceId)
790 err := c.WriteSubscriptionToSdl(subs.ReqId.InstanceId, subs)
791 if err != nil {
792 xapp.Logger.Error("%v", err)
793 }
794}
795
796//-------------------------------------------------------------------
797//
798//-------------------------------------------------------------------
799func (c *Control) UpdateSubscriptionInDB(subs *Subscription, removeSubscriptionFromDb bool) {
800
801 if removeSubscriptionFromDb == true {
802 // Subscription was written in db already when subscription request was sent to BTS, except for merged request
803 c.RemoveSubscriptionFromDb(subs)
804 } else {
805 // Update is needed for successful response and merge case here
806 if subs.RetryFromXapp == false {
807 c.WriteSubscriptionToDb(subs)
808 }
809 }
810 subs.RetryFromXapp = false
811}
812
813//-------------------------------------------------------------------
814//
815//-------------------------------------------------------------------
816func (c *Control) RemoveSubscriptionFromDb(subs *Subscription) {
817 xapp.Logger.Debug("RemoveSubscriptionFromDb() subId = %v", subs.ReqId.InstanceId)
818 err := c.RemoveSubscriptionFromSdl(subs.ReqId.InstanceId)
819 if err != nil {
820 xapp.Logger.Error("%v", err)
821 }
822}
823
824func (c *Control) SendSubscriptionDeleteReq(subs *Subscription) {
825
826 xapp.Logger.Debug("Sending subscription delete due to restart. subId = %v", subs.ReqId.InstanceId)
827
828 // Send delete for every endpoint in the subscription
829 subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
830 subDelReqMsg.RequestId = subs.GetReqId().RequestId
831 subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
832 mType, payload, err := c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)
833 if err != nil {
834 xapp.Logger.Error("SendSubscriptionDeleteReq() %s", idstring(err))
835 return
836 }
837 for _, endPoint := range subs.EpList.Endpoints {
838 params := &xapp.RMRParams{}
839 params.Mtype = mType
840 params.SubId = int(subs.GetReqId().InstanceId)
841 params.Xid = ""
842 params.Meid = subs.Meid
843 params.Src = endPoint.String()
844 params.PayloadLen = len(payload.Buf)
845 params.Payload = payload.Buf
846 params.Mbuf = nil
847
848 if params == nil {
849 xapp.Logger.Error("SendSubscriptionDeleteReq() params == nil")
850 return
851 }
852
853 subs.DeleteFromDb = true
854 c.handleXAPPSubscriptionDeleteRequest(params)
855 }
856}