blob: 87c81ff2019effb8b27b9b59987ed663e6bf975a [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"
Anssi Mannilaf682ace2021-09-28 13:11:25 +030033 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/common"
kalnagy1455c852019-10-21 13:06:23 +020034 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
35 httptransport "github.com/go-openapi/runtime/client"
36 "github.com/go-openapi/strfmt"
Anssi Mannilac92b4212020-12-07 14:59:34 +020037 "github.com/gorilla/mux"
archaggeafbf95f2021-04-14 08:54:05 +030038 "github.com/segmentio/ksuid"
kalnagy1455c852019-10-21 13:06:23 +020039 "github.com/spf13/viper"
kalnagy45114752019-06-18 14:40:39 +020040)
41
Juha Hyttinene406a342020-01-13 13:02:26 +020042//-----------------------------------------------------------------------------
43//
44//-----------------------------------------------------------------------------
45
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020046func idstring(err error, entries ...fmt.Stringer) string {
47 var retval string = ""
48 var filler string = ""
49 for _, entry := range entries {
Markku Virtanen42723e22021-06-15 10:09:23 +030050 if entry != nil {
51 retval += filler + entry.String()
52 filler = " "
53 } else {
54 retval += filler + "(NIL)"
55 }
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020056 }
57 if err != nil {
58 retval += filler + "err(" + err.Error() + ")"
59 filler = " "
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +020060 }
61 return retval
62}
63
64//-----------------------------------------------------------------------------
65//
66//-----------------------------------------------------------------------------
67
Anssi Mannila2f26fb22020-12-07 08:32:13 +020068var e2tSubReqTimeout time.Duration
69var e2tSubDelReqTime time.Duration
70var e2tRecvMsgTimeout time.Duration
Markku Virtanenfe2cdab2021-05-21 10:59:29 +000071var waitRouteCleanup_ms time.Duration
Anssi Mannila2f26fb22020-12-07 08:32:13 +020072var e2tMaxSubReqTryCount uint64 // Initial try + retry
73var e2tMaxSubDelReqTryCount uint64 // Initial try + retry
Anssi Mannilac7da4ee2021-10-22 09:52:02 +030074var checkE2State string
Anssi Mannilac92b4212020-12-07 14:59:34 +020075var readSubsFromDb string
Anssi Mannilab73e7cd2021-08-03 11:57:11 +030076var dbRetryForever string
77var dbTryCount int
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020078
kalnagy45114752019-06-18 14:40:39 +020079type Control struct {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +030080 *xapp.RMRClient
Anssi Mannila3cdd2e02021-10-14 12:35:41 +030081 e2ap *E2ap
82 registry *Registry
83 tracker *Tracker
84 restDuplicateCtrl *DuplicateCtrl
Anssi Mannilac7da4ee2021-10-22 09:52:02 +030085 e2IfState *E2IfState
86 e2IfStateDb XappRnibInterface
Anssi Mannila3cdd2e02021-10-14 12:35:41 +030087 e2SubsDb Sdlnterface
88 restSubsDb Sdlnterface
89 CntRecvMsg uint64
90 ResetTestFlag bool
91 Counters map[string]xapp.Counter
92 LoggerLevel int
93 UTTesting bool
kalnagy93cc3e22019-09-19 11:29:29 +020094}
95
96type RMRMeid struct {
Juha Hyttinenff8dccd2019-12-10 14:34:07 +020097 PlmnID string
98 EnbID string
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020099 RanName string
kalnagy93cc3e22019-09-19 11:29:29 +0200100}
101
Anssi Mannilac92b4212020-12-07 14:59:34 +0200102type SubmgrRestartTestEvent struct{}
103type SubmgrRestartUpEvent struct{}
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300104type PackSubscriptionRequestErrortEvent struct {
105 ErrorInfo ErrorInfo
106}
107
108func (p *PackSubscriptionRequestErrortEvent) SetEvent(errorInfo *ErrorInfo) {
109 p.ErrorInfo = *errorInfo
110}
111
112type SDLWriteErrortEvent struct {
113 ErrorInfo ErrorInfo
114}
115
116func (s *SDLWriteErrortEvent) SetEvent(errorInfo *ErrorInfo) {
117 s.ErrorInfo = *errorInfo
118}
Anssi Mannilac92b4212020-12-07 14:59:34 +0200119
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000120func init() {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300121 xapp.Logger.Debug("SUBMGR")
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000122 viper.AutomaticEnv()
123 viper.SetEnvPrefix("submgr")
124 viper.AllowEmptyEnv(true)
kalnagy45114752019-06-18 14:40:39 +0200125}
126
Juha Hyttinenff8dccd2019-12-10 14:34:07 +0200127func NewControl() *Control {
Juha Hyttinen0388dd92020-01-09 14:14:16 +0200128
Anssi Mannilac92b4212020-12-07 14:59:34 +0200129 transport := httptransport.New(viper.GetString("rtmgr.HostAddr")+":"+viper.GetString("rtmgr.port"), viper.GetString("rtmgr.baseUrl"), []string{"http"})
130 rtmgrClient := RtmgrClient{rtClient: rtmgrclient.New(transport, strfmt.Default)}
131
132 registry := new(Registry)
133 registry.Initialize()
134 registry.rtmgrClient = &rtmgrClient
135
136 tracker := new(Tracker)
137 tracker.Init()
138
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300139 restDuplicateCtrl := new(DuplicateCtrl)
140 restDuplicateCtrl.Init()
141
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300142 e2IfState := new(E2IfState)
143
Anssi Mannilac92b4212020-12-07 14:59:34 +0200144 c := &Control{e2ap: new(E2ap),
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300145 registry: registry,
146 tracker: tracker,
147 restDuplicateCtrl: restDuplicateCtrl,
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300148 e2IfState: e2IfState,
149 e2IfStateDb: CreateXappRnibIfInstance(),
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300150 e2SubsDb: CreateSdl(),
151 restSubsDb: CreateRESTSdl(),
152 Counters: xapp.Metric.RegisterCounterGroup(GetMetricsOpts(), "SUBMGR"),
153 LoggerLevel: 4,
Anssi Mannilac92b4212020-12-07 14:59:34 +0200154 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300155
156 e2IfState.Init(c)
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200157 c.ReadConfigParameters("")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200158
159 // Register REST handler for testing support
160 xapp.Resource.InjectRoute("/ric/v1/test/{testId}", c.TestRestHandler, "POST")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300161 xapp.Resource.InjectRoute("/ric/v1/restsubscriptions", c.GetAllRestSubscriptions, "GET")
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000162 xapp.Resource.InjectRoute("/ric/v1/symptomdata", c.SymptomDataHandler, "GET")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200163
Anssi Mannilac92b4212020-12-07 14:59:34 +0200164 if readSubsFromDb == "false" {
165 return c
166 }
167
168 // Read subscriptions from db
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300169 c.ReadE2Subscriptions()
170 c.ReadRESTSubscriptions()
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300171
172 go xapp.Subscription.Listen(c.RESTSubscriptionHandler, c.RESTQueryHandler, c.RESTSubscriptionDeleteHandler)
173
Anssi Mannilac92b4212020-12-07 14:59:34 +0200174 return c
175}
176
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000177func (c *Control) SymptomDataHandler(w http.ResponseWriter, r *http.Request) {
178 subscriptions, _ := c.registry.QueryHandler()
179 xapp.Resource.SendSymptomDataJson(w, r, subscriptions, "platform/subscriptions.json")
180}
181
Anssi Mannilac92b4212020-12-07 14:59:34 +0200182//-------------------------------------------------------------------
183//
184//-------------------------------------------------------------------
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300185func (c *Control) GetAllRestSubscriptions(w http.ResponseWriter, r *http.Request) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300186 xapp.Logger.Debug("GetAllRestSubscriptions() called")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300187 response := c.registry.GetAllRestSubscriptions()
188 w.Write(response)
189}
190
191//-------------------------------------------------------------------
192//
193//-------------------------------------------------------------------
194func (c *Control) ReadE2Subscriptions() error {
195 var err error
196 var subIds []uint32
197 var register map[uint32]*Subscription
198 for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300199 xapp.Logger.Debug("Reading E2 subscriptions from db")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300200 subIds, register, err = c.ReadAllSubscriptionsFromSdl()
201 if err != nil {
202 xapp.Logger.Error("%v", err)
203 <-time.After(1 * time.Second)
204 } else {
205 c.registry.subIds = subIds
206 c.registry.register = register
207 c.HandleUncompletedSubscriptions(register)
208 return nil
209 }
210 }
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300211 xapp.Logger.Debug("Continuing without retring")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300212 return err
213}
214
215//-------------------------------------------------------------------
216//
217//-------------------------------------------------------------------
218func (c *Control) ReadRESTSubscriptions() error {
219 var err error
220 var restSubscriptions map[string]*RESTSubscription
221 for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300222 xapp.Logger.Debug("Reading REST subscriptions from db")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300223 restSubscriptions, err = c.ReadAllRESTSubscriptionsFromSdl()
224 if err != nil {
225 xapp.Logger.Error("%v", err)
226 <-time.After(1 * time.Second)
227 } else {
228 c.registry.restSubscriptions = restSubscriptions
229 return nil
230 }
231 }
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300232 xapp.Logger.Debug("Continuing without retring")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300233 return err
234}
235
236//-------------------------------------------------------------------
237//
238//-------------------------------------------------------------------
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200239func (c *Control) ReadConfigParameters(f string) {
Anssi Mannilac92b4212020-12-07 14:59:34 +0200240
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300241 xapp.Logger.Debug("ReadConfigParameters")
242
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300243 c.LoggerLevel = int(xapp.Logger.GetLevel())
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300244 xapp.Logger.Debug("LoggerLevel= %v", c.LoggerLevel)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300245
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200246 // viper.GetDuration returns nanoseconds
247 e2tSubReqTimeout = viper.GetDuration("controls.e2tSubReqTimeout_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200248 if e2tSubReqTimeout == 0 {
249 e2tSubReqTimeout = 2000 * 1000000
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300250 xapp.Logger.Debug("WARNING: Using hard coded default value for e2tSubReqTimeout")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200251 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300252 xapp.Logger.Debug("e2tSubReqTimeout= %v", e2tSubReqTimeout)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300253
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200254 e2tSubDelReqTime = viper.GetDuration("controls.e2tSubDelReqTime_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200255 if e2tSubDelReqTime == 0 {
256 e2tSubDelReqTime = 2000 * 1000000
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300257 xapp.Logger.Debug("WARNING: Using hard coded default value for e2tSubDelReqTime")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200258 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300259 xapp.Logger.Debug("e2tSubDelReqTime= %v", e2tSubDelReqTime)
260
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200261 e2tRecvMsgTimeout = viper.GetDuration("controls.e2tRecvMsgTimeout_ms") * 1000000
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200262 if e2tRecvMsgTimeout == 0 {
263 e2tRecvMsgTimeout = 2000 * 1000000
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300264 xapp.Logger.Debug("WARNING: Using hard coded default value for e2tRecvMsgTimeout")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200265 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300266 xapp.Logger.Debug("e2tRecvMsgTimeout= %v", e2tRecvMsgTimeout)
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000267
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200268 e2tMaxSubReqTryCount = viper.GetUint64("controls.e2tMaxSubReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200269 if e2tMaxSubReqTryCount == 0 {
270 e2tMaxSubReqTryCount = 1
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300271 xapp.Logger.Debug("WARNING: Using hard coded default value for e2tMaxSubReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200272 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300273 xapp.Logger.Debug("e2tMaxSubReqTryCount= %v", e2tMaxSubReqTryCount)
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000274
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200275 e2tMaxSubDelReqTryCount = viper.GetUint64("controls.e2tMaxSubDelReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200276 if e2tMaxSubDelReqTryCount == 0 {
277 e2tMaxSubDelReqTryCount = 1
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300278 xapp.Logger.Debug("WARNING: Using hard coded default value for e2tMaxSubDelReqTryCount")
Juha Hyttinen57140bc2020-12-11 13:03:06 +0200279 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300280 xapp.Logger.Debug("e2tMaxSubDelReqTryCount= %v", e2tMaxSubDelReqTryCount)
281
282 checkE2State = viper.GetString("controls.checkE2State")
283 if checkE2State == "" {
284 checkE2State = "true"
285 xapp.Logger.Debug("WARNING: Using hard coded default value for checkE2State")
286 }
287 xapp.Logger.Debug("checkE2State= %v", checkE2State)
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200288
Anssi Mannilac92b4212020-12-07 14:59:34 +0200289 readSubsFromDb = viper.GetString("controls.readSubsFromDb")
290 if readSubsFromDb == "" {
291 readSubsFromDb = "true"
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300292 xapp.Logger.Debug("WARNING: Using hard coded default value for readSubsFromDb")
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200293 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300294 xapp.Logger.Debug("readSubsFromDb= %v", readSubsFromDb)
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300295
296 dbTryCount = viper.GetInt("controls.dbTryCount")
297 if dbTryCount == 0 {
298 dbTryCount = 200
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300299 xapp.Logger.Debug("WARNING: Using hard coded default value for dbTryCount")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300300 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300301 xapp.Logger.Debug("dbTryCount= %v", dbTryCount)
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300302
303 dbRetryForever = viper.GetString("controls.dbRetryForever")
304 if dbRetryForever == "" {
305 dbRetryForever = "true"
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300306 xapp.Logger.Debug("WARNING: Using hard coded default value for dbRetryForever")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300307 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300308 xapp.Logger.Debug("dbRetryForever= %v", dbRetryForever)
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300309
310 // Internal cfg parameter, used to define a wait time for RMR route clean-up. None default
311 // value 100ms used currently only in unittests.
312 waitRouteCleanup_ms = viper.GetDuration("controls.waitRouteCleanup_ms") * 1000000
313 if waitRouteCleanup_ms == 0 {
314 waitRouteCleanup_ms = 5000 * 1000000
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300315 xapp.Logger.Debug("WARNING: Using hard coded default value for waitRouteCleanup_ms")
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300316 }
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300317 xapp.Logger.Debug("waitRouteCleanup= %v", waitRouteCleanup_ms)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200318}
319
320//-------------------------------------------------------------------
321//
322//-------------------------------------------------------------------
323func (c *Control) HandleUncompletedSubscriptions(register map[uint32]*Subscription) {
324
325 xapp.Logger.Debug("HandleUncompletedSubscriptions. len(register) = %v", len(register))
326 for subId, subs := range register {
327 if subs.SubRespRcvd == false {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300328 // If policy subscription has already been made successfully unsuccessful update should not be deleted.
329 if subs.PolicyUpdate == false {
330 subs.NoRespToXapp = true
331 xapp.Logger.Debug("SendSubscriptionDeleteReq. subId = %v", subId)
332 c.SendSubscriptionDeleteReq(subs)
333 }
Anssi Mannilac92b4212020-12-07 14:59:34 +0200334 }
335 }
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200336}
337
338func (c *Control) ReadyCB(data interface{}) {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300339 if c.RMRClient == nil {
340 c.RMRClient = xapp.Rmr
Juha Hyttinenff8dccd2019-12-10 14:34:07 +0200341 }
kalnagy45114752019-06-18 14:40:39 +0200342}
343
344func (c *Control) Run() {
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200345 xapp.SetReadyCB(c.ReadyCB, nil)
Anssi Mannilaf6b78042021-02-18 12:36:59 +0200346 xapp.AddConfigChangeListener(c.ReadConfigParameters)
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000347 xapp.Run(c)
kalnagy45114752019-06-18 14:40:39 +0200348}
349
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200350//-------------------------------------------------------------------
351//
352//-------------------------------------------------------------------
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300353func (c *Control) GetOrCreateRestSubscription(p *models.SubscriptionParams, md5sum string, xAppRmrEndpoint string) (*RESTSubscription, string, error) {
Markku Virtanen42723e22021-06-15 10:09:23 +0300354
355 var restSubId string
356 var restSubscription *RESTSubscription
357 var err error
358
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300359 prevRestSubsId, exists := c.restDuplicateCtrl.GetLastKnownRestSubsIdBasedOnMd5sum(md5sum)
Markku Virtanen42723e22021-06-15 10:09:23 +0300360 if p.SubscriptionID == "" {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300361 // Subscription does not contain REST subscription Id
Markku Virtanen42723e22021-06-15 10:09:23 +0300362 if exists {
363 restSubscription, err = c.registry.GetRESTSubscription(prevRestSubsId, false)
364 if restSubscription != nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300365 // Subscription not found
Markku Virtanen42723e22021-06-15 10:09:23 +0300366 restSubId = prevRestSubsId
367 if err == nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300368 xapp.Logger.Debug("Existing restSubId %s found by MD5sum %s for a request without subscription ID - using previous subscription", prevRestSubsId, md5sum)
Markku Virtanen42723e22021-06-15 10:09:23 +0300369 } else {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300370 xapp.Logger.Debug("Existing restSubId %s found by MD5sum %s for a request without subscription ID - Note: %s", prevRestSubsId, md5sum, err.Error())
Markku Virtanen42723e22021-06-15 10:09:23 +0300371 }
372 } else {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300373 xapp.Logger.Debug("None existing restSubId %s referred by MD5sum %s for a request without subscription ID - deleting cached entry", prevRestSubsId, md5sum)
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300374 c.restDuplicateCtrl.DeleteLastKnownRestSubsIdBasedOnMd5sum(md5sum)
Markku Virtanen42723e22021-06-15 10:09:23 +0300375 }
376 }
377
378 if restSubscription == nil {
379 restSubId = ksuid.New().String()
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300380 restSubscription = c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid)
Markku Virtanen42723e22021-06-15 10:09:23 +0300381 }
382 } else {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300383 // Subscription contains REST subscription Id
Markku Virtanen42723e22021-06-15 10:09:23 +0300384 restSubId = p.SubscriptionID
385
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300386 xapp.Logger.Debug("RestSubscription ID %s provided via REST request", restSubId)
Markku Virtanen42723e22021-06-15 10:09:23 +0300387 restSubscription, err = c.registry.GetRESTSubscription(restSubId, false)
388 if err != nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300389 // Subscription with id in REST request does not exist
Markku Virtanen42723e22021-06-15 10:09:23 +0300390 xapp.Logger.Error("%s", err.Error())
391 c.UpdateCounter(cRestSubFailToXapp)
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300392 return nil, "", err
Markku Virtanen42723e22021-06-15 10:09:23 +0300393 }
394
395 if !exists {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300396 xapp.Logger.Debug("Existing restSubscription found for ID %s, new request based on md5sum", restSubId)
Markku Virtanen42723e22021-06-15 10:09:23 +0300397 } else {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300398 xapp.Logger.Debug("Existing restSubscription found for ID %s(%s), re-transmission based on md5sum match with previous request", prevRestSubsId, restSubId)
Markku Virtanen42723e22021-06-15 10:09:23 +0300399 }
400 }
401
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300402 return restSubscription, restSubId, nil
Markku Virtanen42723e22021-06-15 10:09:23 +0300403}
404
405//-------------------------------------------------------------------
406//
407//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300408func (c *Control) RESTSubscriptionHandler(params interface{}) (*models.SubscriptionResponse, int) {
archaggeafbf95f2021-04-14 08:54:05 +0300409
Anssi Mannila316d8a12021-06-02 11:08:54 +0300410 c.CntRecvMsg++
411 c.UpdateCounter(cRestSubReqFromXapp)
412
archaggeafbf95f2021-04-14 08:54:05 +0300413 subResp := models.SubscriptionResponse{}
archaggeafbf95f2021-04-14 08:54:05 +0300414 p := params.(*models.SubscriptionParams)
415
Anssi Mannilade457a12021-06-02 16:19:48 +0300416 if c.LoggerLevel > 2 {
417 c.PrintRESTSubscriptionRequest(p)
418 }
419
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300420 if c.e2IfState.IsE2ConnectionUp(p.Meid) == false {
421 xapp.Logger.Error("No E2 connection for ranName %v", *p.Meid)
422 c.UpdateCounter(cRestReqRejDueE2Down)
423 return nil, common.SubscribeServiceUnavailableCode
424 }
425
archaggeafbf95f2021-04-14 08:54:05 +0300426 if p.ClientEndpoint == nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300427 err := fmt.Errorf("ClientEndpoint == nil")
428 xapp.Logger.Error("%v", err)
Anssi Mannila316d8a12021-06-02 11:08:54 +0300429 c.UpdateCounter(cRestSubFailToXapp)
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300430 return nil, common.SubscribeBadRequestCode
archaggeafbf95f2021-04-14 08:54:05 +0300431 }
432
433 _, xAppRmrEndpoint, err := ConstructEndpointAddresses(*p.ClientEndpoint)
434 if err != nil {
435 xapp.Logger.Error("%s", err.Error())
Anssi Mannila316d8a12021-06-02 11:08:54 +0300436 c.UpdateCounter(cRestSubFailToXapp)
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300437 return nil, common.SubscribeBadRequestCode
archaggeafbf95f2021-04-14 08:54:05 +0300438 }
439
Markku Virtanen42723e22021-06-15 10:09:23 +0300440 md5sum, err := CalculateRequestMd5sum(params)
441 if err != nil {
442 xapp.Logger.Error("Failed to generate md5sum from incoming request - %s", err.Error())
443 }
444
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300445 restSubscription, restSubId, err := c.GetOrCreateRestSubscription(p, md5sum, xAppRmrEndpoint)
Markku Virtanen42723e22021-06-15 10:09:23 +0300446 if err != nil {
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300447 xapp.Logger.Error("Subscription with id in REST request does not exist")
448 return nil, common.SubscribeNotFoundCode
archaggeafbf95f2021-04-14 08:54:05 +0300449 }
450
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000451 subResp.SubscriptionID = &restSubId
archaggeafbf95f2021-04-14 08:54:05 +0300452 subReqList := e2ap.SubscriptionRequestList{}
453 err = c.e2ap.FillSubscriptionReqMsgs(params, &subReqList, restSubscription)
454 if err != nil {
455 xapp.Logger.Error("%s", err.Error())
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300456 c.restDuplicateCtrl.DeleteLastKnownRestSubsIdBasedOnMd5sum(md5sum)
archaggeafbf95f2021-04-14 08:54:05 +0300457 c.registry.DeleteRESTSubscription(&restSubId)
Anssi Mannila316d8a12021-06-02 11:08:54 +0300458 c.UpdateCounter(cRestSubFailToXapp)
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300459 return nil, common.SubscribeBadRequestCode
archaggeafbf95f2021-04-14 08:54:05 +0300460 }
461
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300462 duplicate := c.restDuplicateCtrl.IsDuplicateToOngoingTransaction(restSubId, md5sum)
Markku Virtanen42723e22021-06-15 10:09:23 +0300463 if duplicate {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300464 err := fmt.Errorf("Retransmission blocker direct ACK for request of restSubsId %s restSubId MD5sum %s as retransmission", restSubId, md5sum)
465 xapp.Logger.Debug("%s", err)
Markku Virtanen42723e22021-06-15 10:09:23 +0300466 c.UpdateCounter(cRestSubRespToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300467 return &subResp, common.SubscribeCreatedCode
Markku Virtanenb642a192021-06-09 09:08:14 +0000468 }
469
Markku Virtanencd73ecc2021-06-23 06:16:01 +0000470 c.WriteRESTSubscriptionToDb(restSubId, restSubscription)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300471 e2SubscriptionDirectives, err := c.GetE2SubscriptionDirectives(p)
472 if err != nil {
473 xapp.Logger.Error("%s", err)
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300474 return nil, common.SubscribeBadRequestCode
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300475 }
476 go c.processSubscriptionRequests(restSubscription, &subReqList, p.ClientEndpoint, p.Meid, &restSubId, xAppRmrEndpoint, md5sum, e2SubscriptionDirectives)
archaggeafbf95f2021-04-14 08:54:05 +0300477
Anssi Mannila316d8a12021-06-02 11:08:54 +0300478 c.UpdateCounter(cRestSubRespToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300479 return &subResp, common.SubscribeCreatedCode
480}
481
482//-------------------------------------------------------------------
483//
484//-------------------------------------------------------------------
485func (c *Control) GetE2SubscriptionDirectives(p *models.SubscriptionParams) (*E2SubscriptionDirectives, error) {
486
487 e2SubscriptionDirectives := &E2SubscriptionDirectives{}
488 if p == nil || p.E2SubscriptionDirectives == nil {
489 e2SubscriptionDirectives.E2TimeoutTimerValue = e2tSubReqTimeout
490 e2SubscriptionDirectives.E2MaxTryCount = int64(e2tMaxSubReqTryCount)
491 e2SubscriptionDirectives.CreateRMRRoute = true
492 xapp.Logger.Debug("p == nil || p.E2SubscriptionDirectives == nil. Using default values for E2TimeoutTimerValue = %v and E2RetryCount = %v RMRRoutingNeeded = true", e2tSubReqTimeout, e2tMaxSubReqTryCount)
493 } else {
494 if p.E2SubscriptionDirectives.E2TimeoutTimerValue >= 1 && p.E2SubscriptionDirectives.E2TimeoutTimerValue <= 10 {
495 e2SubscriptionDirectives.E2TimeoutTimerValue = time.Duration(p.E2SubscriptionDirectives.E2TimeoutTimerValue) * 1000000000 // Duration type cast returns nano seconds
496 } else {
497 return nil, fmt.Errorf("p.E2SubscriptionDirectives.E2TimeoutTimerValue out of range (1-10 seconds): %v", p.E2SubscriptionDirectives.E2TimeoutTimerValue)
498 }
499 if p.E2SubscriptionDirectives.E2RetryCount == nil {
500 xapp.Logger.Error("p.E2SubscriptionDirectives.E2RetryCount == nil. Using default value")
501 e2SubscriptionDirectives.E2MaxTryCount = int64(e2tMaxSubReqTryCount)
502 } else {
503 if *p.E2SubscriptionDirectives.E2RetryCount >= 0 && *p.E2SubscriptionDirectives.E2RetryCount <= 10 {
504 e2SubscriptionDirectives.E2MaxTryCount = *p.E2SubscriptionDirectives.E2RetryCount + 1 // E2MaxTryCount = First sending plus two retries
505 } else {
506 return nil, fmt.Errorf("p.E2SubscriptionDirectives.E2RetryCount out of range (0-10): %v", *p.E2SubscriptionDirectives.E2RetryCount)
507 }
508 }
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300509 e2SubscriptionDirectives.CreateRMRRoute = p.E2SubscriptionDirectives.RMRRoutingNeeded
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300510 }
511 xapp.Logger.Debug("e2SubscriptionDirectives.E2TimeoutTimerValue: %v", e2SubscriptionDirectives.E2TimeoutTimerValue)
512 xapp.Logger.Debug("e2SubscriptionDirectives.E2MaxTryCount: %v", e2SubscriptionDirectives.E2MaxTryCount)
513 xapp.Logger.Debug("e2SubscriptionDirectives.CreateRMRRoute: %v", e2SubscriptionDirectives.CreateRMRRoute)
514 return e2SubscriptionDirectives, nil
515}
516
517//-------------------------------------------------------------------
518//
519//-------------------------------------------------------------------
archaggeafbf95f2021-04-14 08:54:05 +0300520
521func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription, subReqList *e2ap.SubscriptionRequestList,
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300522 clientEndpoint *models.SubscriptionParamsClientEndpoint, meid *string, restSubId *string, xAppRmrEndpoint string, md5sum string, e2SubscriptionDirectives *E2SubscriptionDirectives) {
archaggeafbf95f2021-04-14 08:54:05 +0300523
Anssi Mannila08c8fbd2021-10-05 12:47:41 +0300524 c.SubscriptionProcessingStartDelay()
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300525 xapp.Logger.Debug("Subscription Request count=%v ", len(subReqList.E2APSubscriptionRequests))
archaggeafbf95f2021-04-14 08:54:05 +0300526
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000527 var xAppEventInstanceID int64
528 var e2EventInstanceID int64
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300529 errorInfo := &ErrorInfo{}
Markku Virtanenb642a192021-06-09 09:08:14 +0000530
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300531 defer c.restDuplicateCtrl.SetMd5sumFromLastOkRequest(*restSubId, md5sum)
Markku Virtanenb642a192021-06-09 09:08:14 +0000532
archaggeafbf95f2021-04-14 08:54:05 +0300533 for index := 0; index < len(subReqList.E2APSubscriptionRequests); index++ {
534 subReqMsg := subReqList.E2APSubscriptionRequests[index]
Markku Virtanenb642a192021-06-09 09:08:14 +0000535 xAppEventInstanceID = (int64)(subReqMsg.RequestId.Id)
archaggeafbf95f2021-04-14 08:54:05 +0300536
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000537 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(xAppRmrEndpoint), *restSubId, subReqMsg.RequestId, &xapp.RMRMeid{RanName: *meid})
archaggeafbf95f2021-04-14 08:54:05 +0300538 if trans == nil {
Markku Virtanenb642a192021-06-09 09:08:14 +0000539 // Send notification to xApp that prosessing of a Subscription Request has failed.
540 err := fmt.Errorf("Tracking failure")
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300541 errorInfo.ErrorCause = err.Error()
542 c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans, errorInfo)
Markku Virtanenb642a192021-06-09 09:08:14 +0000543 continue
archaggeafbf95f2021-04-14 08:54:05 +0300544 }
545
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300546 xapp.Logger.Debug("Handle SubscriptionRequest index=%v, %s", index, idstring(nil, trans))
Markku Virtanenb642a192021-06-09 09:08:14 +0000547
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300548 subRespMsg, errorInfo, err := c.handleSubscriptionRequest(trans, &subReqMsg, meid, *restSubId, e2SubscriptionDirectives)
Markku Virtanen42723e22021-06-15 10:09:23 +0300549
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300550 xapp.Logger.Debug("Handled SubscriptionRequest index=%v, %s", index, idstring(nil, trans))
Anssi Mannila53dbe7e2021-10-06 14:21:48 +0300551 trans.Release()
Markku Virtanen42723e22021-06-15 10:09:23 +0300552
archaggeafbf95f2021-04-14 08:54:05 +0300553 if err != nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300554 c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans, errorInfo)
archaggeafbf95f2021-04-14 08:54:05 +0300555 } else {
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000556 e2EventInstanceID = (int64)(subRespMsg.RequestId.InstanceId)
Markku Virtanen42723e22021-06-15 10:09:23 +0300557 restSubscription.AddMd5Sum(md5sum)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300558 xapp.Logger.Debug("SubscriptionRequest index=%v processed successfullyfor %s. endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
Markku Virtanen42723e22021-06-15 10:09:23 +0300559 index, *restSubId, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
Markku Virtanenb642a192021-06-09 09:08:14 +0000560 c.sendSuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, e2EventInstanceID, clientEndpoint, trans)
archaggeafbf95f2021-04-14 08:54:05 +0300561 }
archaggeafbf95f2021-04-14 08:54:05 +0300562 }
563}
564
565//-------------------------------------------------------------------
566//
567//------------------------------------------------------------------
Anssi Mannila08c8fbd2021-10-05 12:47:41 +0300568func (c *Control) SubscriptionProcessingStartDelay() {
569 if c.UTTesting == true {
570 // This is temporary fix for the UT problem that notification arrives before subscription response
571 // Correct fix would be to allow notification come before response and process it correctly
572 xapp.Logger.Debug("Setting 50 ms delay before starting processing Subscriptions")
573 <-time.After(time.Millisecond * 50)
574 xapp.Logger.Debug("Continuing after delay")
575 }
576}
577
578//-------------------------------------------------------------------
579//
580//------------------------------------------------------------------
archaggeafbf95f2021-04-14 08:54:05 +0300581func (c *Control) handleSubscriptionRequest(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, meid *string,
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300582 restSubId string, e2SubscriptionDirectives *E2SubscriptionDirectives) (*e2ap.E2APSubscriptionResponse, *ErrorInfo, error) {
583
584 errorInfo := ErrorInfo{}
archaggeafbf95f2021-04-14 08:54:05 +0300585
586 err := c.tracker.Track(trans)
587 if err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300588 xapp.Logger.Error("XAPP-SubReq Tracking error: %s", idstring(err, trans))
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300589 errorInfo.ErrorCause = err.Error()
Markku Virtanen55d2a282021-06-04 14:46:56 +0300590 err = fmt.Errorf("Tracking failure")
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300591 return nil, &errorInfo, err
archaggeafbf95f2021-04-14 08:54:05 +0300592 }
593
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300594 subs, errorInfo, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c, e2SubscriptionDirectives.CreateRMRRoute)
archaggeafbf95f2021-04-14 08:54:05 +0300595 if err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300596 xapp.Logger.Error("XAPP-SubReq Assign error: %s", idstring(err, trans))
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300597 return nil, &errorInfo, err
archaggeafbf95f2021-04-14 08:54:05 +0300598 }
599
600 //
601 // Wake subs request
602 //
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300603 subs.OngoingReqCount++
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300604 go c.handleSubscriptionCreate(subs, trans, e2SubscriptionDirectives)
archaggeafbf95f2021-04-14 08:54:05 +0300605 event, _ := trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300606 subs.OngoingReqCount--
archaggeafbf95f2021-04-14 08:54:05 +0300607
608 err = nil
609 if event != nil {
610 switch themsg := event.(type) {
611 case *e2ap.E2APSubscriptionResponse:
612 trans.Release()
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300613 if c.e2IfState.IsE2ConnectionUp(meid) == true {
614 return themsg, &errorInfo, nil
615 } else {
616 c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c)
617 c.RemoveSubscriptionFromDb(subs)
618 err = fmt.Errorf("E2 interface down")
619 errorInfo.SetInfo(err.Error(), models.SubscriptionInstanceErrorSourceE2Node, "")
620 return nil, &errorInfo, err
621 }
archaggeafbf95f2021-04-14 08:54:05 +0300622 case *e2ap.E2APSubscriptionFailure:
Markku Virtanen55d2a282021-06-04 14:46:56 +0300623 err = fmt.Errorf("E2 SubscriptionFailure received")
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300624 errorInfo.SetInfo(err.Error(), models.SubscriptionInstanceErrorSourceE2Node, "")
625 return nil, &errorInfo, err
626 case *PackSubscriptionRequestErrortEvent:
627 err = fmt.Errorf("E2 SubscriptionRequest pack failure")
628 return nil, &themsg.ErrorInfo, err
629 case *SDLWriteErrortEvent:
630 err = fmt.Errorf("SDL write failure")
631 return nil, &themsg.ErrorInfo, err
archaggeafbf95f2021-04-14 08:54:05 +0300632 default:
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300633 err = fmt.Errorf("Unexpected E2 subscription response received")
634 errorInfo.SetInfo(err.Error(), models.SubscriptionInstanceErrorSourceE2Node, "")
archaggeafbf95f2021-04-14 08:54:05 +0300635 break
636 }
Markku Virtanen55d2a282021-06-04 14:46:56 +0300637 } else {
638 err = fmt.Errorf("E2 subscription response timeout")
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300639 errorInfo.SetInfo(err.Error(), "", models.SubscriptionInstanceTimeoutTypeE2Timeout)
640 if subs.PolicyUpdate == true {
641 return nil, &errorInfo, err
642 }
archaggeafbf95f2021-04-14 08:54:05 +0300643 }
Markku Virtanen55d2a282021-06-04 14:46:56 +0300644
645 xapp.Logger.Error("XAPP-SubReq E2 subscription failed %s", idstring(err, trans, subs))
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000646 c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300647 return nil, &errorInfo, err
archaggeafbf95f2021-04-14 08:54:05 +0300648}
649
650//-------------------------------------------------------------------
651//
652//-------------------------------------------------------------------
Markku Virtanen42723e22021-06-15 10:09:23 +0300653func (c *Control) sendUnsuccesfullResponseNotification(restSubId *string, restSubscription *RESTSubscription, xAppEventInstanceID int64, err error,
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300654 clientEndpoint *models.SubscriptionParamsClientEndpoint, trans *TransactionXapp, errorInfo *ErrorInfo) {
Markku Virtanen42723e22021-06-15 10:09:23 +0300655
656 // Send notification to xApp that prosessing of a Subscription Request has failed.
657 e2EventInstanceID := (int64)(0)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300658 if errorInfo.ErrorSource == "" {
659 // Submgr is default source of error
660 errorInfo.ErrorSource = models.SubscriptionInstanceErrorSourceSUBMGR
661 }
Markku Virtanen42723e22021-06-15 10:09:23 +0300662 resp := &models.SubscriptionResponse{
663 SubscriptionID: restSubId,
664 SubscriptionInstances: []*models.SubscriptionInstance{
665 &models.SubscriptionInstance{E2EventInstanceID: &e2EventInstanceID,
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300666 ErrorCause: errorInfo.ErrorCause,
667 ErrorSource: errorInfo.ErrorSource,
668 TimeoutType: errorInfo.TimeoutType,
Markku Virtanen42723e22021-06-15 10:09:23 +0300669 XappEventInstanceID: &xAppEventInstanceID},
670 },
671 }
672 // Mark REST subscription request processed.
673 restSubscription.SetProcessed(err)
674 c.UpdateRESTSubscriptionInDB(*restSubId, restSubscription, false)
675 if trans != nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300676 xapp.Logger.Debug("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
677 errorInfo.ErrorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
Markku Virtanen42723e22021-06-15 10:09:23 +0300678 } else {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300679 xapp.Logger.Debug("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v",
680 errorInfo.ErrorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID)
Markku Virtanen42723e22021-06-15 10:09:23 +0300681 }
682
683 c.UpdateCounter(cRestSubFailNotifToXapp)
684 xapp.Subscription.Notify(resp, *clientEndpoint)
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300685
686 if c.e2IfState.IsE2ConnectionUp(&restSubscription.Meid) == false && restSubscription.SubReqOngoing == false {
687 c.registry.DeleteRESTSubscription(restSubId)
688 c.RemoveRESTSubscriptionFromDb(*restSubId)
689 }
Markku Virtanen42723e22021-06-15 10:09:23 +0300690}
691
692//-------------------------------------------------------------------
693//
694//-------------------------------------------------------------------
695func (c *Control) sendSuccesfullResponseNotification(restSubId *string, restSubscription *RESTSubscription, xAppEventInstanceID int64, e2EventInstanceID int64,
696 clientEndpoint *models.SubscriptionParamsClientEndpoint, trans *TransactionXapp) {
697
698 // Store successfully processed InstanceId for deletion
699 restSubscription.AddE2InstanceId((uint32)(e2EventInstanceID))
700 restSubscription.AddXappIdToE2Id(xAppEventInstanceID, e2EventInstanceID)
701
702 // Send notification to xApp that a Subscription Request has been processed.
703 resp := &models.SubscriptionResponse{
704 SubscriptionID: restSubId,
705 SubscriptionInstances: []*models.SubscriptionInstance{
706 &models.SubscriptionInstance{E2EventInstanceID: &e2EventInstanceID,
Anssi Mannilacb7dd492021-10-01 11:10:26 +0300707 ErrorCause: "",
Markku Virtanen42723e22021-06-15 10:09:23 +0300708 XappEventInstanceID: &xAppEventInstanceID},
709 },
710 }
711 // Mark REST subscription request processesd.
712 restSubscription.SetProcessed(nil)
713 c.UpdateRESTSubscriptionInDB(*restSubId, restSubscription, false)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300714 xapp.Logger.Debug("Sending successful REST notification to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
Markku Virtanen42723e22021-06-15 10:09:23 +0300715 clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
716
717 c.UpdateCounter(cRestSubNotifToXapp)
718 xapp.Subscription.Notify(resp, *clientEndpoint)
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300719
720 if c.e2IfState.IsE2ConnectionUp(&restSubscription.Meid) == false && restSubscription.SubReqOngoing == false {
721 c.registry.DeleteRESTSubscription(restSubId)
722 c.RemoveRESTSubscriptionFromDb(*restSubId)
723 }
Markku Virtanen42723e22021-06-15 10:09:23 +0300724}
725
726//-------------------------------------------------------------------
727//
728//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300729func (c *Control) RESTSubscriptionDeleteHandler(restSubId string) int {
archaggeafbf95f2021-04-14 08:54:05 +0300730
731 c.CntRecvMsg++
Konstantinos Archangelof27433e72021-05-31 08:30:35 +0000732 c.UpdateCounter(cRestSubDelReqFromXapp)
archaggeafbf95f2021-04-14 08:54:05 +0300733
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300734 xapp.Logger.Debug("SubscriptionDeleteRequest from XAPP")
archaggeafbf95f2021-04-14 08:54:05 +0300735
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000736 restSubscription, err := c.registry.GetRESTSubscription(restSubId, true)
archaggeafbf95f2021-04-14 08:54:05 +0300737 if err != nil {
738 xapp.Logger.Error("%s", err.Error())
739 if restSubscription == nil {
740 // Subscription was not found
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300741 c.UpdateCounter(cRestSubDelRespToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300742 return common.UnsubscribeNoContentCode
archaggeafbf95f2021-04-14 08:54:05 +0300743 } else {
744 if restSubscription.SubReqOngoing == true {
745 err := fmt.Errorf("Handling of the REST Subscription Request still ongoing %s", restSubId)
746 xapp.Logger.Error("%s", err.Error())
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300747 c.UpdateCounter(cRestSubDelFailToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300748 return common.UnsubscribeBadRequestCode
archaggeafbf95f2021-04-14 08:54:05 +0300749 } else if restSubscription.SubDelReqOngoing == true {
750 // Previous request for same restSubId still ongoing
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300751 c.UpdateCounter(cRestSubDelFailToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300752 return common.UnsubscribeBadRequestCode
archaggeafbf95f2021-04-14 08:54:05 +0300753 }
754 }
755 }
756
757 xAppRmrEndPoint := restSubscription.xAppRmrEndPoint
758 go func() {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300759 xapp.Logger.Debug("Deleteting handler: processing instances = %v", restSubscription.InstanceIds)
archaggeafbf95f2021-04-14 08:54:05 +0300760 for _, instanceId := range restSubscription.InstanceIds {
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000761 xAppEventInstanceID, err := c.SubscriptionDeleteHandler(&restSubId, &xAppRmrEndPoint, &restSubscription.Meid, instanceId)
762
archaggeafbf95f2021-04-14 08:54:05 +0300763 if err != nil {
764 xapp.Logger.Error("%s", err.Error())
archaggeafbf95f2021-04-14 08:54:05 +0300765 }
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300766 xapp.Logger.Debug("Deleteting instanceId = %v", instanceId)
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000767 restSubscription.DeleteXappIdToE2Id(xAppEventInstanceID)
768 restSubscription.DeleteE2InstanceId(instanceId)
archaggeafbf95f2021-04-14 08:54:05 +0300769 }
Anssi Mannila3cdd2e02021-10-14 12:35:41 +0300770 c.restDuplicateCtrl.DeleteLastKnownRestSubsIdBasedOnMd5sum(restSubscription.lastReqMd5sum)
archaggeafbf95f2021-04-14 08:54:05 +0300771 c.registry.DeleteRESTSubscription(&restSubId)
Konstantinos Archangelof268d7152021-06-14 12:24:00 +0300772 c.RemoveRESTSubscriptionFromDb(restSubId)
archaggeafbf95f2021-04-14 08:54:05 +0300773 }()
774
Konstantinos Archangelof27433e72021-05-31 08:30:35 +0000775 c.UpdateCounter(cRestSubDelRespToXapp)
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300776 return common.UnsubscribeNoContentCode
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200777}
778
archaggeafbf95f2021-04-14 08:54:05 +0300779//-------------------------------------------------------------------
780//
781//-------------------------------------------------------------------
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000782func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string, meid *string, instanceId uint32) (int64, error) {
archaggeafbf95f2021-04-14 08:54:05 +0300783
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000784 var xAppEventInstanceID int64
785 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{instanceId})
786 if err != nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300787 xapp.Logger.Debug("Subscription Delete Handler subscription for restSubId=%v, E2EventInstanceID=%v not found %s",
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000788 restSubId, instanceId, idstring(err, nil))
789 return xAppEventInstanceID, nil
790 }
791
792 xAppEventInstanceID = int64(subs.ReqId.Id)
793 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(*endPoint), *restSubId, e2ap.RequestId{subs.ReqId.Id, 0}, &xapp.RMRMeid{RanName: *meid})
archaggeafbf95f2021-04-14 08:54:05 +0300794 if trans == nil {
795 err := fmt.Errorf("XAPP-SubDelReq transaction not created. restSubId %s, endPoint %s, meid %s, instanceId %v", *restSubId, *endPoint, *meid, instanceId)
796 xapp.Logger.Error("%s", err.Error())
797 }
798 defer trans.Release()
799
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000800 err = c.tracker.Track(trans)
archaggeafbf95f2021-04-14 08:54:05 +0300801 if err != nil {
802 err := fmt.Errorf("XAPP-SubDelReq %s:", idstring(err, trans))
803 xapp.Logger.Error("%s", err.Error())
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000804 return xAppEventInstanceID, &time.ParseError{}
archaggeafbf95f2021-04-14 08:54:05 +0300805 }
806 //
807 // Wake subs delete
808 //
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300809 subs.OngoingDelCount++
archaggeafbf95f2021-04-14 08:54:05 +0300810 go c.handleSubscriptionDelete(subs, trans)
811 trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300812 subs.OngoingDelCount--
archaggeafbf95f2021-04-14 08:54:05 +0300813
814 xapp.Logger.Debug("XAPP-SubDelReq: Handling event %s ", idstring(nil, trans, subs))
815
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000816 c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c)
archaggeafbf95f2021-04-14 08:54:05 +0300817
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000818 return xAppEventInstanceID, nil
archaggeafbf95f2021-04-14 08:54:05 +0300819}
820
821//-------------------------------------------------------------------
822//
823//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300824func (c *Control) RESTQueryHandler() (models.SubscriptionList, error) {
825 xapp.Logger.Debug("RESTQueryHandler() called")
Anssi Mannila4c626a22021-02-11 12:50:48 +0200826
archaggeafbf95f2021-04-14 08:54:05 +0300827 c.CntRecvMsg++
828
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200829 return c.registry.QueryHandler()
830}
831
Anssi Mannilac92b4212020-12-07 14:59:34 +0200832func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300833 xapp.Logger.Debug("RESTTestRestHandler() called")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200834
835 pathParams := mux.Vars(r)
836 s := pathParams["testId"]
837
838 // This can be used to delete single subscription from db
839 if contains := strings.Contains(s, "deletesubid="); contains == true {
840 var splits = strings.Split(s, "=")
841 if subId, err := strconv.ParseInt(splits[1], 10, 64); err == nil {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300842 xapp.Logger.Debug("RemoveSubscriptionFromSdl() called. subId = %v", subId)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200843 c.RemoveSubscriptionFromSdl(uint32(subId))
844 return
845 }
846 }
847
848 // This can be used to remove all subscriptions db from
849 if s == "emptydb" {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300850 xapp.Logger.Debug("RemoveAllSubscriptionsFromSdl() called")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200851 c.RemoveAllSubscriptionsFromSdl()
Konstantinos Archangelof268d7152021-06-14 12:24:00 +0300852 c.RemoveAllRESTSubscriptionsFromSdl()
Anssi Mannilac92b4212020-12-07 14:59:34 +0200853 return
854 }
855
856 // This is meant to cause submgr's restart in testing
857 if s == "restart" {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300858 xapp.Logger.Debug("os.Exit(1) called")
Anssi Mannilac92b4212020-12-07 14:59:34 +0200859 os.Exit(1)
860 }
861
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300862 xapp.Logger.Debug("Unsupported rest command received %s", s)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200863}
864
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200865//-------------------------------------------------------------------
866//
867//-------------------------------------------------------------------
868
Juha Hyttinen83ada002020-01-30 10:36:33 +0200869func (c *Control) rmrSendToE2T(desc string, subs *Subscription, trans *TransactionSubs) (err error) {
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300870 params := &xapp.RMRParams{}
Juha Hyttinene406a342020-01-13 13:02:26 +0200871 params.Mtype = trans.GetMtype()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300872 params.SubId = int(subs.GetReqId().InstanceId)
Juha Hyttinen86a46202020-01-14 12:49:09 +0200873 params.Xid = ""
Juha Hyttinene406a342020-01-13 13:02:26 +0200874 params.Meid = subs.GetMeid()
875 params.Src = ""
Juha Hyttinen63284a22020-01-15 10:45:11 +0200876 params.PayloadLen = len(trans.Payload.Buf)
877 params.Payload = trans.Payload.Buf
Juha Hyttinene406a342020-01-13 13:02:26 +0200878 params.Mbuf = nil
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300879 xapp.Logger.Debug("MSG to E2T: %s %s %s", desc, trans.String(), params.String())
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000880 err = c.SendWithRetry(params, false, 5)
881 if err != nil {
882 xapp.Logger.Error("rmrSendToE2T: Send failed: %+v", err)
883 }
884 return err
kalnagye0018682019-09-26 16:28:25 +0200885}
886
Juha Hyttinen83ada002020-01-30 10:36:33 +0200887func (c *Control) rmrSendToXapp(desc string, subs *Subscription, trans *TransactionXapp) (err error) {
888
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300889 params := &xapp.RMRParams{}
Juha Hyttinen63284a22020-01-15 10:45:11 +0200890 params.Mtype = trans.GetMtype()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300891 params.SubId = int(subs.GetReqId().InstanceId)
Juha Hyttinene406a342020-01-13 13:02:26 +0200892 params.Xid = trans.GetXid()
Juha Hyttinen86a46202020-01-14 12:49:09 +0200893 params.Meid = trans.GetMeid()
Juha Hyttinene406a342020-01-13 13:02:26 +0200894 params.Src = ""
Juha Hyttinen63284a22020-01-15 10:45:11 +0200895 params.PayloadLen = len(trans.Payload.Buf)
896 params.Payload = trans.Payload.Buf
Juha Hyttinene406a342020-01-13 13:02:26 +0200897 params.Mbuf = nil
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300898 xapp.Logger.Debug("MSG to XAPP: %s %s %s", desc, trans.String(), params.String())
Abukar Mohamedfbd4df52021-03-11 06:13:27 +0000899 err = c.SendWithRetry(params, false, 5)
900 if err != nil {
901 xapp.Logger.Error("rmrSendToXapp: Send failed: %+v", err)
902 }
903 return err
Juha Hyttinene406a342020-01-13 13:02:26 +0200904}
905
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300906func (c *Control) Consume(msg *xapp.RMRParams) (err error) {
907 if c.RMRClient == nil {
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200908 err = fmt.Errorf("Rmr object nil can handle %s", msg.String())
909 xapp.Logger.Error("%s", err.Error())
910 return
911 }
912 c.CntRecvMsg++
913
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300914 defer c.RMRClient.Free(msg.Mbuf)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200915
Juha Hyttinena8a908d2020-05-26 15:12:47 +0300916 // xapp-frame might use direct access to c buffer and
917 // when msg.Mbuf is freed, someone might take it into use
918 // and payload data might be invalid inside message handle function
919 //
920 // subscriptions won't load system a lot so there is no
921 // real performance hit by cloning buffer into new go byte slice
922 cPay := append(msg.Payload[:0:0], msg.Payload...)
923 msg.Payload = cPay
924 msg.PayloadLen = len(cPay)
925
Anssi Mannila90fa0212019-12-12 10:47:47 +0200926 switch msg.Mtype {
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200927 case xapp.RIC_SUB_REQ:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200928 go c.handleXAPPSubscriptionRequest(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200929 case xapp.RIC_SUB_RESP:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200930 go c.handleE2TSubscriptionResponse(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200931 case xapp.RIC_SUB_FAILURE:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200932 go c.handleE2TSubscriptionFailure(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200933 case xapp.RIC_SUB_DEL_REQ:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200934 go c.handleXAPPSubscriptionDeleteRequest(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200935 case xapp.RIC_SUB_DEL_RESP:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200936 go c.handleE2TSubscriptionDeleteResponse(msg)
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200937 case xapp.RIC_SUB_DEL_FAILURE:
Juha Hyttinen422d0182020-01-17 13:37:05 +0200938 go c.handleE2TSubscriptionDeleteFailure(msg)
Anssi Mannila90fa0212019-12-12 10:47:47 +0200939 default:
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300940 xapp.Logger.Debug("Unknown Message Type '%d', discarding", msg.Mtype)
Balint Uvegescd3881b2019-10-02 15:01:43 +0000941 }
Juha Hyttinen5f8ffa02020-02-06 15:28:59 +0200942 return
Juha Hyttinen31797b42020-01-16 14:05:01 +0200943}
944
Juha Hyttinen422d0182020-01-17 13:37:05 +0200945//-------------------------------------------------------------------
946// handle from XAPP Subscription Request
947//------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +0300948func (c *Control) handleXAPPSubscriptionRequest(params *xapp.RMRParams) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300949 xapp.Logger.Debug("MSG from XAPP: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +0200950 c.UpdateCounter(cSubReqFromXapp)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200951
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300952 if c.e2IfState.IsE2ConnectionUp(&params.Meid.RanName) == false {
953 xapp.Logger.Error("No E2 connection for ranName %v", params.Meid.RanName)
954 return
955 }
956
Juha Hyttinen422d0182020-01-17 13:37:05 +0200957 subReqMsg, err := c.e2ap.UnpackSubscriptionRequest(params.Payload)
958 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200959 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200960 return
961 }
962
Anssi Mannila4c626a22021-02-11 12:50:48 +0200963 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(params.Src), params.Xid, subReqMsg.RequestId, params.Meid)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200964 if trans == nil {
965 xapp.Logger.Error("XAPP-SubReq: %s", idstring(fmt.Errorf("transaction not created"), params))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200966 return
967 }
968 defer trans.Release()
969
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200970 if err = c.tracker.Track(trans); err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200971 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
972 return
973 }
974
Juha Hyttinen429cfe62020-03-31 11:23:02 +0300975 //TODO handle subscription toward e2term inside AssignToSubscription / hide handleSubscriptionCreate in it?
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300976 subs, _, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c, true)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200977 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200978 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
Juha Hyttinen422d0182020-01-17 13:37:05 +0200979 return
980 }
981
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200982 c.wakeSubscriptionRequest(subs, trans)
983}
984
985//-------------------------------------------------------------------
986// Wake Subscription Request to E2node
987//------------------------------------------------------------------
988func (c *Control) wakeSubscriptionRequest(subs *Subscription, trans *TransactionXapp) {
989
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300990 e2SubscriptionDirectives, _ := c.GetE2SubscriptionDirectives(nil)
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300991 subs.OngoingReqCount++
Anssi Mannilaf682ace2021-09-28 13:11:25 +0300992 go c.handleSubscriptionCreate(subs, trans, e2SubscriptionDirectives)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200993 event, _ := trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
Anssi Mannilac7da4ee2021-10-22 09:52:02 +0300994 subs.OngoingReqCount--
Anssi Mannila6b3796f2021-02-12 09:11:35 +0200995 var err error
Juha Hyttinen422d0182020-01-17 13:37:05 +0200996 if event != nil {
997 switch themsg := event.(type) {
998 case *e2ap.E2APSubscriptionResponse:
Anssi Mannila4c626a22021-02-11 12:50:48 +0200999 themsg.RequestId.Id = trans.RequestId.Id
Juha Hyttinen422d0182020-01-17 13:37:05 +02001000 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionResponse(themsg)
1001 if err == nil {
Anssi Mannila64a0df42020-02-26 09:46:03 +02001002 trans.Release()
Anssi Mannila4abf1802021-01-28 13:06:46 +02001003 c.UpdateCounter(cSubRespToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001004 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001005 return
1006 }
1007 case *e2ap.E2APSubscriptionFailure:
Anssi Mannila4c626a22021-02-11 12:50:48 +02001008 themsg.RequestId.Id = trans.RequestId.Id
Juha Hyttinen422d0182020-01-17 13:37:05 +02001009 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionFailure(themsg)
1010 if err == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +02001011 c.UpdateCounter(cSubFailToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001012 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001013 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001014 default:
Juha Hyttinen31797b42020-01-16 14:05:01 +02001015 break
1016 }
1017 }
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001018 xapp.Logger.Debug("XAPP-SubReq: failed %s", idstring(err, trans, subs))
Juha Hyttinen429cfe62020-03-31 11:23:02 +03001019 //c.registry.RemoveFromSubscription(subs, trans, 5*time.Second)
Juha Hyttinen31797b42020-01-16 14:05:01 +02001020}
1021
Juha Hyttinen422d0182020-01-17 13:37:05 +02001022//-------------------------------------------------------------------
1023// handle from XAPP Subscription Delete Request
1024//------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +03001025func (c *Control) handleXAPPSubscriptionDeleteRequest(params *xapp.RMRParams) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001026 xapp.Logger.Debug("MSG from XAPP: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +02001027 c.UpdateCounter(cSubDelReqFromXapp)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001028
Anssi Mannilac7da4ee2021-10-22 09:52:02 +03001029 if c.e2IfState.IsE2ConnectionUp(&params.Meid.RanName) == false {
1030 xapp.Logger.Error("No E2 connection for ranName %v", params.Meid.RanName)
1031 return
1032 }
1033
Juha Hyttinen422d0182020-01-17 13:37:05 +02001034 subDelReqMsg, err := c.e2ap.UnpackSubscriptionDeleteRequest(params.Payload)
Juha Hyttinen31797b42020-01-16 14:05:01 +02001035 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001036 xapp.Logger.Error("XAPP-SubDelReq %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001037 return
1038 }
1039
Anssi Mannila4c626a22021-02-11 12:50:48 +02001040 trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(params.Src), params.Xid, subDelReqMsg.RequestId, params.Meid)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001041 if trans == nil {
1042 xapp.Logger.Error("XAPP-SubDelReq: %s", idstring(fmt.Errorf("transaction not created"), params))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001043 return
1044 }
1045 defer trans.Release()
1046
Juha Hyttinen83ada002020-01-30 10:36:33 +02001047 err = c.tracker.Track(trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001048 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001049 xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans))
1050 return
1051 }
1052
Juha Hyttinen47942b42020-02-27 10:41:43 +02001053 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{trans.GetSubId()})
Juha Hyttinen83ada002020-01-30 10:36:33 +02001054 if err != nil {
1055 xapp.Logger.Error("XAPP-SubDelReq: %s", idstring(err, trans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001056 return
1057 }
1058
Juha Hyttinen422d0182020-01-17 13:37:05 +02001059 //
1060 // Wake subs delete
1061 //
Anssi Mannilac7da4ee2021-10-22 09:52:02 +03001062 subs.OngoingDelCount++
Juha Hyttinen422d0182020-01-17 13:37:05 +02001063 go c.handleSubscriptionDelete(subs, trans)
1064 trans.WaitEvent(0) //blocked wait as timeout is handled in subs side
Anssi Mannilac7da4ee2021-10-22 09:52:02 +03001065 subs.OngoingDelCount--
Juha Hyttinen422d0182020-01-17 13:37:05 +02001066
Juha Hyttinen83ada002020-01-30 10:36:33 +02001067 xapp.Logger.Debug("XAPP-SubDelReq: Handling event %s ", idstring(nil, trans, subs))
1068
Anssi Mannilac92b4212020-12-07 14:59:34 +02001069 if subs.NoRespToXapp == true {
1070 // Do no send delete responses to xapps due to submgr restart is deleting uncompleted subscriptions
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001071 xapp.Logger.Debug("XAPP-SubDelReq: subs.NoRespToXapp == true")
Anssi Mannilac92b4212020-12-07 14:59:34 +02001072 return
1073 }
1074
1075 // Whatever is received success, fail or timeout, send successful delete response
Juha Hyttinen422d0182020-01-17 13:37:05 +02001076 subDelRespMsg := &e2ap.E2APSubscriptionDeleteResponse{}
Anssi Mannila4c626a22021-02-11 12:50:48 +02001077 subDelRespMsg.RequestId.Id = trans.RequestId.Id
1078 subDelRespMsg.RequestId.InstanceId = subs.GetReqId().RequestId.InstanceId
Juha Hyttinen422d0182020-01-17 13:37:05 +02001079 subDelRespMsg.FunctionId = subs.SubReqMsg.FunctionId
1080 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteResponse(subDelRespMsg)
1081 if err == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +02001082 c.UpdateCounter(cSubDelRespToXapp)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001083 c.rmrSendToXapp("", subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001084 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001085
Juha Hyttinen429cfe62020-03-31 11:23:02 +03001086 //TODO handle subscription toward e2term insiged RemoveFromSubscription / hide handleSubscriptionDelete in it?
1087 //c.registry.RemoveFromSubscription(subs, trans, 5*time.Second)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001088}
1089
1090//-------------------------------------------------------------------
1091// SUBS CREATE Handling
1092//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001093func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *TransactionXapp, e2SubscriptionDirectives *E2SubscriptionDirectives) {
Juha Hyttinen422d0182020-01-17 13:37:05 +02001094
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001095 var event interface{} = nil
Anssi Mannilac92b4212020-12-07 14:59:34 +02001096 var removeSubscriptionFromDb bool = false
Juha Hyttinen83ada002020-01-30 10:36:33 +02001097 trans := c.tracker.NewSubsTransaction(subs)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001098 subs.WaitTransactionTurn(trans)
1099 defer subs.ReleaseTransactionTurn(trans)
1100 defer trans.Release()
1101
Juha Hyttinen83ada002020-01-30 10:36:33 +02001102 xapp.Logger.Debug("SUBS-SubReq: Handling %s ", idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001103
Juha Hyttinen83ada002020-01-30 10:36:33 +02001104 subRfMsg, valid := subs.GetCachedResponse()
1105 if subRfMsg == nil && valid == true {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001106 event = c.sendE2TSubscriptionRequest(subs, trans, parentTrans, e2SubscriptionDirectives)
Anssi Mannila6d629ad2021-01-25 09:59:56 +02001107 switch event.(type) {
1108 case *e2ap.E2APSubscriptionResponse:
1109 subRfMsg, valid = subs.SetCachedResponse(event, true)
1110 subs.SubRespRcvd = true
1111 case *e2ap.E2APSubscriptionFailure:
1112 removeSubscriptionFromDb = true
1113 subRfMsg, valid = subs.SetCachedResponse(event, false)
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001114 xapp.Logger.Debug("SUBS-SubReq: internal delete due failure event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
archaggeafbf95f2021-04-14 08:54:05 +03001115 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
Anssi Mannila6d629ad2021-01-25 09:59:56 +02001116 case *SubmgrRestartTestEvent:
1117 // This simulates that no response has been received and after restart subscriptions are restored from db
1118 xapp.Logger.Debug("Test restart flag is active. Dropping this transaction to test restart case")
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001119 case *PackSubscriptionRequestErrortEvent, *SDLWriteErrortEvent:
1120 subRfMsg, valid = subs.SetCachedResponse(event, false)
Anssi Mannila6d629ad2021-01-25 09:59:56 +02001121 default:
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001122 if subs.PolicyUpdate == false {
1123 xapp.Logger.Debug("SUBS-SubReq: internal delete due default event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
1124 removeSubscriptionFromDb = true
1125 subRfMsg, valid = subs.SetCachedResponse(nil, false)
1126 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
1127 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001128 }
1129 xapp.Logger.Debug("SUBS-SubReq: Handling (e2t response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans))
1130 } else {
1131 xapp.Logger.Debug("SUBS-SubReq: Handling (cached response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001132 }
1133
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001134 err := c.UpdateSubscriptionInDB(subs, removeSubscriptionFromDb)
1135 if err != nil {
1136 subRfMsg, valid = subs.SetCachedResponse(event, false)
1137 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
1138 }
1139
Juha Hyttinen429cfe62020-03-31 11:23:02 +03001140 //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete)
1141 if valid == false {
Markku Virtanenfe2cdab2021-05-21 10:59:29 +00001142 c.registry.RemoveFromSubscription(subs, parentTrans, waitRouteCleanup_ms, c)
Juha Hyttinen429cfe62020-03-31 11:23:02 +03001143 }
Anssi Mannilac92b4212020-12-07 14:59:34 +02001144
Juha Hyttinen83ada002020-01-30 10:36:33 +02001145 parentTrans.SendEvent(subRfMsg, 0)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001146}
1147
1148//-------------------------------------------------------------------
1149// SUBS DELETE Handling
1150//-------------------------------------------------------------------
Juha Hyttinen3944a222020-01-24 11:51:46 +02001151
Juha Hyttinen83ada002020-01-30 10:36:33 +02001152func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *TransactionXapp) {
Juha Hyttinen422d0182020-01-17 13:37:05 +02001153
Juha Hyttinen83ada002020-01-30 10:36:33 +02001154 trans := c.tracker.NewSubsTransaction(subs)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001155 subs.WaitTransactionTurn(trans)
1156 defer subs.ReleaseTransactionTurn(trans)
1157 defer trans.Release()
1158
Juha Hyttinen83ada002020-01-30 10:36:33 +02001159 xapp.Logger.Debug("SUBS-SubDelReq: Handling %s", idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001160
Juha Hyttinen3944a222020-01-24 11:51:46 +02001161 subs.mutex.Lock()
Anssi Mannila4abf1802021-01-28 13:06:46 +02001162
Juha Hyttinen3944a222020-01-24 11:51:46 +02001163 if subs.valid && subs.EpList.HasEndpoint(parentTrans.GetEndpoint()) && subs.EpList.Size() == 1 {
1164 subs.valid = false
1165 subs.mutex.Unlock()
1166 c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
1167 } else {
1168 subs.mutex.Unlock()
1169 }
Juha Hyttinen429cfe62020-03-31 11:23:02 +03001170 //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete)
1171 // If parallel deletes ongoing both might pass earlier sendE2TSubscriptionDeleteRequest(...) if
1172 // RemoveFromSubscription locates in caller side (now in handleXAPPSubscriptionDeleteRequest(...))
Markku Virtanenfe2cdab2021-05-21 10:59:29 +00001173 c.registry.RemoveFromSubscription(subs, parentTrans, waitRouteCleanup_ms, c)
Anssi Mannilac92b4212020-12-07 14:59:34 +02001174 c.registry.UpdateSubscriptionToDb(subs, c)
Juha Hyttinen47942b42020-02-27 10:41:43 +02001175 parentTrans.SendEvent(nil, 0)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001176}
1177
1178//-------------------------------------------------------------------
1179// send to E2T Subscription Request
1180//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001181func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp, e2SubscriptionDirectives *E2SubscriptionDirectives) interface{} {
Juha Hyttinen422d0182020-01-17 13:37:05 +02001182 var err error
1183 var event interface{} = nil
1184 var timedOut bool = false
Konstantinos Archangelof26dfa712021-06-04 12:10:26 +00001185 const ricRequestorId = 123
Juha Hyttinen422d0182020-01-17 13:37:05 +02001186
1187 subReqMsg := subs.SubReqMsg
Juha Hyttinen83ada002020-01-30 10:36:33 +02001188 subReqMsg.RequestId = subs.GetReqId().RequestId
Konstantinos Archangelof26dfa712021-06-04 12:10:26 +00001189 subReqMsg.RequestId.Id = ricRequestorId
Juha Hyttinen422d0182020-01-17 13:37:05 +02001190 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionRequest(subReqMsg)
1191 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001192 xapp.Logger.Error("SUBS-SubReq: %s", idstring(err, trans, subs, parentTrans))
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001193 return &PackSubscriptionRequestErrortEvent{
1194 ErrorInfo{
1195 ErrorSource: models.SubscriptionInstanceErrorSourceASN1,
1196 ErrorCause: err.Error(),
1197 },
1198 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001199 }
1200
Anssi Mannilac92b4212020-12-07 14:59:34 +02001201 // Write uncompleted subscrition in db. If no response for subscrition it need to be re-processed (deleted) after restart
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001202 err = c.WriteSubscriptionToDb(subs)
1203 if err != nil {
1204 return &SDLWriteErrortEvent{
1205 ErrorInfo{
1206 ErrorSource: models.SubscriptionInstanceErrorSourceDBAAS,
1207 ErrorCause: err.Error(),
1208 },
1209 }
1210 }
Markku Virtanenfe2cdab2021-05-21 10:59:29 +00001211
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001212 for retries := int64(0); retries < e2SubscriptionDirectives.E2MaxTryCount; retries++ {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001213 desc := fmt.Sprintf("(retry %d)", retries)
Anssi Mannila4abf1802021-01-28 13:06:46 +02001214 if retries == 0 {
1215 c.UpdateCounter(cSubReqToE2)
1216 } else {
1217 c.UpdateCounter(cSubReReqToE2)
1218 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001219 c.rmrSendToE2T(desc, subs, trans)
Anssi Mannilac92b4212020-12-07 14:59:34 +02001220 if subs.DoNotWaitSubResp == false {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001221 event, timedOut = trans.WaitEvent(e2SubscriptionDirectives.E2TimeoutTimerValue)
Anssi Mannilac92b4212020-12-07 14:59:34 +02001222 if timedOut {
Anssi Mannila4abf1802021-01-28 13:06:46 +02001223 c.UpdateCounter(cSubReqTimerExpiry)
Anssi Mannilac92b4212020-12-07 14:59:34 +02001224 continue
1225 }
1226 } else {
1227 // Simulating case where subscrition request has been sent but response has not been received before restart
1228 event = &SubmgrRestartTestEvent{}
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001229 xapp.Logger.Debug("Restart event, DoNotWaitSubResp == true")
Juha Hyttinen422d0182020-01-17 13:37:05 +02001230 }
1231 break
1232 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001233 xapp.Logger.Debug("SUBS-SubReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001234 return event
1235}
1236
1237//-------------------------------------------------------------------
1238// send to E2T Subscription Delete Request
1239//-------------------------------------------------------------------
1240
Juha Hyttinen83ada002020-01-30 10:36:33 +02001241func (c *Control) sendE2TSubscriptionDeleteRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} {
Juha Hyttinen422d0182020-01-17 13:37:05 +02001242 var err error
1243 var event interface{}
1244 var timedOut bool
Konstantinos Archangelof26dfa712021-06-04 12:10:26 +00001245 const ricRequestorId = 123
Juha Hyttinen422d0182020-01-17 13:37:05 +02001246
1247 subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
Juha Hyttinen83ada002020-01-30 10:36:33 +02001248 subDelReqMsg.RequestId = subs.GetReqId().RequestId
Konstantinos Archangelof26dfa712021-06-04 12:10:26 +00001249 subDelReqMsg.RequestId.Id = ricRequestorId
Juha Hyttinenaf91f972020-01-24 08:38:47 +02001250 subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
Juha Hyttinen422d0182020-01-17 13:37:05 +02001251 trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)
1252 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001253 xapp.Logger.Error("SUBS-SubDelReq: %s", idstring(err, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001254 return event
1255 }
1256
1257 for retries := uint64(0); retries < e2tMaxSubDelReqTryCount; retries++ {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001258 desc := fmt.Sprintf("(retry %d)", retries)
Anssi Mannila4abf1802021-01-28 13:06:46 +02001259 if retries == 0 {
1260 c.UpdateCounter(cSubDelReqToE2)
1261 } else {
1262 c.UpdateCounter(cSubDelReReqToE2)
1263 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001264 c.rmrSendToE2T(desc, subs, trans)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001265 event, timedOut = trans.WaitEvent(e2tSubDelReqTime)
1266 if timedOut {
Anssi Mannila4abf1802021-01-28 13:06:46 +02001267 c.UpdateCounter(cSubDelReqTimerExpiry)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001268 continue
1269 }
1270 break
1271 }
Juha Hyttinen83ada002020-01-30 10:36:33 +02001272 xapp.Logger.Debug("SUBS-SubDelReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001273 return event
1274}
1275
1276//-------------------------------------------------------------------
Anssi Mannila4abf1802021-01-28 13:06:46 +02001277// handle from E2T Subscription Response
Juha Hyttinen422d0182020-01-17 13:37:05 +02001278//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +03001279func (c *Control) handleE2TSubscriptionResponse(params *xapp.RMRParams) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001280 xapp.Logger.Debug("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +02001281 c.UpdateCounter(cSubRespFromE2)
Anssi Mannila51122392021-05-25 11:51:31 +03001282
Juha Hyttinen422d0182020-01-17 13:37:05 +02001283 subRespMsg, err := c.e2ap.UnpackSubscriptionResponse(params.Payload)
1284 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001285 xapp.Logger.Error("MSG-SubResp %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001286 return
1287 }
Juha Hyttinenaada6452020-04-07 08:47:58 +03001288 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subRespMsg.RequestId.InstanceId})
Juha Hyttinen422d0182020-01-17 13:37:05 +02001289 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001290 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, params))
Juha Hyttinen422d0182020-01-17 13:37:05 +02001291 return
Juha Hyttinen31797b42020-01-16 14:05:01 +02001292 }
1293 trans := subs.GetTransaction()
1294 if trans == nil {
Juha Hyttinen422d0182020-01-17 13:37:05 +02001295 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +02001296 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, params, subs))
Juha Hyttinenff8dccd2019-12-10 14:34:07 +02001297 return
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001298 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001299 sendOk, timedOut := trans.SendEvent(subRespMsg, e2tRecvMsgTimeout)
1300 if sendOk == false {
1301 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001302 xapp.Logger.Error("MSG-SubResp: %s", idstring(err, trans, subs))
Peter Szilagyifbc56f92019-07-23 19:29:46 +00001303 }
Peter Szilagyifbc56f92019-07-23 19:29:46 +00001304 return
kalnagy45114752019-06-18 14:40:39 +02001305}
1306
Juha Hyttinen422d0182020-01-17 13:37:05 +02001307//-------------------------------------------------------------------
1308// handle from E2T Subscription Failure
1309//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +03001310func (c *Control) handleE2TSubscriptionFailure(params *xapp.RMRParams) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001311 xapp.Logger.Debug("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +02001312 c.UpdateCounter(cSubFailFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001313 subFailMsg, err := c.e2ap.UnpackSubscriptionFailure(params.Payload)
Peter Szilagyifbc56f92019-07-23 19:29:46 +00001314 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001315 xapp.Logger.Error("MSG-SubFail %s", idstring(err, params))
Peter Szilagyifbc56f92019-07-23 19:29:46 +00001316 return
1317 }
Juha Hyttinenaada6452020-04-07 08:47:58 +03001318 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subFailMsg.RequestId.InstanceId})
Juha Hyttinen31797b42020-01-16 14:05:01 +02001319 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001320 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, params))
Juha Hyttinenaafee7f2020-01-14 14:54:51 +02001321 return
1322 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001323 trans := subs.GetTransaction()
1324 if trans == nil {
1325 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +02001326 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, params, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +02001327 return
1328 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001329 sendOk, timedOut := trans.SendEvent(subFailMsg, e2tRecvMsgTimeout)
1330 if sendOk == false {
1331 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001332 xapp.Logger.Error("MSG-SubFail: %s", idstring(err, trans, subs))
Juha Hyttinenaafee7f2020-01-14 14:54:51 +02001333 }
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001334 return
1335}
1336
Juha Hyttinen422d0182020-01-17 13:37:05 +02001337//-------------------------------------------------------------------
1338// handle from E2T Subscription Delete Response
1339//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +03001340func (c *Control) handleE2TSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001341 xapp.Logger.Debug("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +02001342 c.UpdateCounter(cSubDelRespFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001343 subDelRespMsg, err := c.e2ap.UnpackSubscriptionDeleteResponse(params.Payload)
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001344 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001345 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params))
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001346 return
1347 }
Juha Hyttinenaada6452020-04-07 08:47:58 +03001348 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subDelRespMsg.RequestId.InstanceId})
Juha Hyttinen31797b42020-01-16 14:05:01 +02001349 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001350 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params))
Juha Hyttinen0d064ec2020-01-09 09:08:53 +02001351 return
1352 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001353 trans := subs.GetTransaction()
1354 if trans == nil {
1355 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +02001356 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, params, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +02001357 return
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001358 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001359 sendOk, timedOut := trans.SendEvent(subDelRespMsg, e2tRecvMsgTimeout)
1360 if sendOk == false {
1361 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001362 xapp.Logger.Error("MSG-SubDelResp: %s", idstring(err, trans, subs))
Juha Hyttinen60bfcf92020-01-14 15:14:24 +02001363 }
Anssi Mannila2e99e2f2019-12-05 13:57:06 +02001364 return
1365}
1366
Juha Hyttinen422d0182020-01-17 13:37:05 +02001367//-------------------------------------------------------------------
1368// handle from E2T Subscription Delete Failure
1369//-------------------------------------------------------------------
Juha Hyttinen9dc5adc2020-08-13 10:02:40 +03001370func (c *Control) handleE2TSubscriptionDeleteFailure(params *xapp.RMRParams) {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001371 xapp.Logger.Debug("MSG from E2T: %s", params.String())
Anssi Mannila4abf1802021-01-28 13:06:46 +02001372 c.UpdateCounter(cSubDelFailFromE2)
Juha Hyttinen422d0182020-01-17 13:37:05 +02001373 subDelFailMsg, err := c.e2ap.UnpackSubscriptionDeleteFailure(params.Payload)
Juha Hyttinen31797b42020-01-16 14:05:01 +02001374 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001375 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params))
Anssi Mannilaf1d0eb62019-12-17 15:29:55 +02001376 return
1377 }
Juha Hyttinenaada6452020-04-07 08:47:58 +03001378 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subDelFailMsg.RequestId.InstanceId})
Anssi Mannila8046c702020-01-02 13:39:05 +02001379 if err != nil {
Juha Hyttinen83ada002020-01-30 10:36:33 +02001380 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params))
Anssi Mannila8046c702020-01-02 13:39:05 +02001381 return
1382 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001383 trans := subs.GetTransaction()
1384 if trans == nil {
1385 err = fmt.Errorf("Ongoing transaction not found")
Juha Hyttinen83ada002020-01-30 10:36:33 +02001386 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, params, subs))
Juha Hyttinen86a46202020-01-14 12:49:09 +02001387 return
1388 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001389 sendOk, timedOut := trans.SendEvent(subDelFailMsg, e2tRecvMsgTimeout)
1390 if sendOk == false {
1391 err = fmt.Errorf("Passing event to transaction failed: sendOk(%t) timedOut(%t)", sendOk, timedOut)
Juha Hyttinen83ada002020-01-30 10:36:33 +02001392 xapp.Logger.Error("MSG-SubDelFail: %s", idstring(err, trans, subs))
Anssi Mannila8046c702020-01-02 13:39:05 +02001393 }
kalnagy93cc3e22019-09-19 11:29:29 +02001394 return
1395}
1396
Juha Hyttinen422d0182020-01-17 13:37:05 +02001397//-------------------------------------------------------------------
1398//
1399//-------------------------------------------------------------------
1400func typeofSubsMessage(v interface{}) string {
1401 if v == nil {
1402 return "NIL"
kalnagy93cc3e22019-09-19 11:29:29 +02001403 }
Juha Hyttinen422d0182020-01-17 13:37:05 +02001404 switch v.(type) {
Anssi Mannila51122392021-05-25 11:51:31 +03001405 //case *e2ap.E2APSubscriptionRequest:
1406 // return "SubReq"
Juha Hyttinen422d0182020-01-17 13:37:05 +02001407 case *e2ap.E2APSubscriptionResponse:
1408 return "SubResp"
1409 case *e2ap.E2APSubscriptionFailure:
1410 return "SubFail"
Anssi Mannila51122392021-05-25 11:51:31 +03001411 //case *e2ap.E2APSubscriptionDeleteRequest:
1412 // return "SubDelReq"
Juha Hyttinen422d0182020-01-17 13:37:05 +02001413 case *e2ap.E2APSubscriptionDeleteResponse:
1414 return "SubDelResp"
1415 case *e2ap.E2APSubscriptionDeleteFailure:
1416 return "SubDelFail"
1417 default:
1418 return "Unknown"
Juha Hyttinen31797b42020-01-16 14:05:01 +02001419 }
Anssi Mannilaf1d0eb62019-12-17 15:29:55 +02001420}
Anssi Mannilac92b4212020-12-07 14:59:34 +02001421
1422//-------------------------------------------------------------------
1423//
1424//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001425func (c *Control) WriteSubscriptionToDb(subs *Subscription) error {
Anssi Mannilac92b4212020-12-07 14:59:34 +02001426 xapp.Logger.Debug("WriteSubscriptionToDb() subId = %v", subs.ReqId.InstanceId)
1427 err := c.WriteSubscriptionToSdl(subs.ReqId.InstanceId, subs)
1428 if err != nil {
1429 xapp.Logger.Error("%v", err)
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001430 return err
Anssi Mannilac92b4212020-12-07 14:59:34 +02001431 }
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001432 return nil
Anssi Mannilac92b4212020-12-07 14:59:34 +02001433}
1434
1435//-------------------------------------------------------------------
1436//
1437//-------------------------------------------------------------------
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001438func (c *Control) UpdateSubscriptionInDB(subs *Subscription, removeSubscriptionFromDb bool) error {
Anssi Mannilac92b4212020-12-07 14:59:34 +02001439
1440 if removeSubscriptionFromDb == true {
1441 // Subscription was written in db already when subscription request was sent to BTS, except for merged request
1442 c.RemoveSubscriptionFromDb(subs)
1443 } else {
1444 // Update is needed for successful response and merge case here
1445 if subs.RetryFromXapp == false {
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001446 err := c.WriteSubscriptionToDb(subs)
1447 return err
Anssi Mannilac92b4212020-12-07 14:59:34 +02001448 }
1449 }
1450 subs.RetryFromXapp = false
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001451 return nil
Anssi Mannilac92b4212020-12-07 14:59:34 +02001452}
1453
1454//-------------------------------------------------------------------
1455//
1456//-------------------------------------------------------------------
1457func (c *Control) RemoveSubscriptionFromDb(subs *Subscription) {
1458 xapp.Logger.Debug("RemoveSubscriptionFromDb() subId = %v", subs.ReqId.InstanceId)
1459 err := c.RemoveSubscriptionFromSdl(subs.ReqId.InstanceId)
1460 if err != nil {
1461 xapp.Logger.Error("%v", err)
1462 }
1463}
1464
Konstantinos Archangelof268d7152021-06-14 12:24:00 +03001465//-------------------------------------------------------------------
1466//
1467//-------------------------------------------------------------------
1468func (c *Control) WriteRESTSubscriptionToDb(restSubId string, restSubs *RESTSubscription) {
1469 xapp.Logger.Debug("WriteRESTSubscriptionToDb() restSubId = %s", restSubId)
1470 err := c.WriteRESTSubscriptionToSdl(restSubId, restSubs)
1471 if err != nil {
1472 xapp.Logger.Error("%v", err)
1473 }
1474}
1475
1476//-------------------------------------------------------------------
1477//
1478//-------------------------------------------------------------------
1479func (c *Control) UpdateRESTSubscriptionInDB(restSubId string, restSubs *RESTSubscription, removeRestSubscriptionFromDb bool) {
1480
1481 if removeRestSubscriptionFromDb == true {
1482 // Subscription was written in db already when subscription request was sent to BTS, except for merged request
1483 c.RemoveRESTSubscriptionFromDb(restSubId)
1484 } else {
1485 c.WriteRESTSubscriptionToDb(restSubId, restSubs)
1486 }
1487}
1488
1489//-------------------------------------------------------------------
1490//
1491//-------------------------------------------------------------------
1492func (c *Control) RemoveRESTSubscriptionFromDb(restSubId string) {
1493 xapp.Logger.Debug("RemoveRESTSubscriptionFromDb() restSubId = %s", restSubId)
1494 err := c.RemoveRESTSubscriptionFromSdl(restSubId)
1495 if err != nil {
1496 xapp.Logger.Error("%v", err)
1497 }
1498}
1499
Anssi Mannilac92b4212020-12-07 14:59:34 +02001500func (c *Control) SendSubscriptionDeleteReq(subs *Subscription) {
1501
Konstantinos Archangelof26dfa712021-06-04 12:10:26 +00001502 const ricRequestorId = 123
Anssi Mannilac92b4212020-12-07 14:59:34 +02001503 xapp.Logger.Debug("Sending subscription delete due to restart. subId = %v", subs.ReqId.InstanceId)
1504
1505 // Send delete for every endpoint in the subscription
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001506 if subs.PolicyUpdate == false {
1507 subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
1508 subDelReqMsg.RequestId = subs.GetReqId().RequestId
1509 subDelReqMsg.RequestId.Id = ricRequestorId
1510 subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
1511 mType, payload, err := c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)
1512 if err != nil {
1513 xapp.Logger.Error("SendSubscriptionDeleteReq() %s", idstring(err))
1514 return
1515 }
1516 for _, endPoint := range subs.EpList.Endpoints {
1517 params := &xapp.RMRParams{}
1518 params.Mtype = mType
1519 params.SubId = int(subs.GetReqId().InstanceId)
1520 params.Xid = ""
1521 params.Meid = subs.Meid
1522 params.Src = endPoint.String()
1523 params.PayloadLen = len(payload.Buf)
1524 params.Payload = payload.Buf
1525 params.Mbuf = nil
1526 subs.DeleteFromDb = true
1527 c.handleXAPPSubscriptionDeleteRequest(params)
1528 }
Anssi Mannilac92b4212020-12-07 14:59:34 +02001529 }
1530}
Anssi Mannilade457a12021-06-02 16:19:48 +03001531
1532func (c *Control) PrintRESTSubscriptionRequest(p *models.SubscriptionParams) {
1533
1534 fmt.Println("CRESTSubscriptionRequest")
Markku Virtanen987f8b12021-06-10 15:05:02 +03001535
Markku Virtanen2b512b62021-07-30 12:04:00 +00001536 if p == nil {
1537 return
1538 }
1539
Markku Virtanen987f8b12021-06-10 15:05:02 +03001540 if p.SubscriptionID != "" {
1541 fmt.Println(" SubscriptionID = ", p.SubscriptionID)
1542 } else {
1543 fmt.Println(" SubscriptionID = ''")
1544 }
1545
Anssi Mannilade457a12021-06-02 16:19:48 +03001546 fmt.Printf(" ClientEndpoint.Host = %s\n", p.ClientEndpoint.Host)
1547
1548 if p.ClientEndpoint.HTTPPort != nil {
1549 fmt.Printf(" ClientEndpoint.HTTPPort = %v\n", *p.ClientEndpoint.HTTPPort)
1550 } else {
1551 fmt.Println(" ClientEndpoint.HTTPPort = nil")
1552 }
1553
1554 if p.ClientEndpoint.RMRPort != nil {
1555 fmt.Printf(" ClientEndpoint.RMRPort = %v\n", *p.ClientEndpoint.RMRPort)
1556 } else {
1557 fmt.Println(" ClientEndpoint.RMRPort = nil")
1558 }
1559
1560 if p.Meid != nil {
1561 fmt.Printf(" Meid = %s\n", *p.Meid)
1562 } else {
1563 fmt.Println(" Meid = nil")
1564 }
1565
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001566 if p.E2SubscriptionDirectives == nil {
1567 fmt.Println(" E2SubscriptionDirectives = nil")
1568 } else {
1569 fmt.Println(" E2SubscriptionDirectives")
1570 if p.E2SubscriptionDirectives.E2RetryCount == nil {
1571 fmt.Println(" E2RetryCount == nil")
1572 } else {
1573 fmt.Printf(" E2RetryCount = %v\n", *p.E2SubscriptionDirectives.E2RetryCount)
1574 }
1575 fmt.Printf(" E2TimeoutTimerValue = %v\n", p.E2SubscriptionDirectives.E2TimeoutTimerValue)
Anssi Mannilacb7dd492021-10-01 11:10:26 +03001576 fmt.Printf(" RMRRoutingNeeded = %v\n", p.E2SubscriptionDirectives.RMRRoutingNeeded)
Anssi Mannilaf682ace2021-09-28 13:11:25 +03001577 }
Anssi Mannilade457a12021-06-02 16:19:48 +03001578 for _, subscriptionDetail := range p.SubscriptionDetails {
1579 if p.RANFunctionID != nil {
1580 fmt.Printf(" RANFunctionID = %v\n", *p.RANFunctionID)
1581 } else {
1582 fmt.Println(" RANFunctionID = nil")
1583 }
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +00001584 fmt.Printf(" SubscriptionDetail.XappEventInstanceID = %v\n", *subscriptionDetail.XappEventInstanceID)
Konstantinos Archangelofbd9c98e2021-06-07 17:32:10 +00001585 fmt.Printf(" SubscriptionDetail.EventTriggers = %v\n", subscriptionDetail.EventTriggers)
Anssi Mannilade457a12021-06-02 16:19:48 +03001586
1587 for _, actionToBeSetup := range subscriptionDetail.ActionToBeSetupList {
1588 fmt.Printf(" SubscriptionDetail.ActionToBeSetup.ActionID = %v\n", *actionToBeSetup.ActionID)
1589 fmt.Printf(" SubscriptionDetail.ActionToBeSetup.ActionType = %s\n", *actionToBeSetup.ActionType)
Konstantinos Archangelofbd9c98e2021-06-07 17:32:10 +00001590 fmt.Printf(" SubscriptionDetail.ActionToBeSetup.ActionDefinition = %v\n", actionToBeSetup.ActionDefinition)
Anssi Mannilade457a12021-06-02 16:19:48 +03001591
Anssi Mannilade457a12021-06-02 16:19:48 +03001592 if actionToBeSetup.SubsequentAction != nil {
1593 fmt.Printf(" SubscriptionDetail.ActionToBeSetup.SubsequentAction.SubsequentActionType = %s\n", *actionToBeSetup.SubsequentAction.SubsequentActionType)
1594 fmt.Printf(" SubscriptionDetail.ActionToBeSetup..SubsequentAction.TimeToWait = %s\n", *actionToBeSetup.SubsequentAction.TimeToWait)
1595 } else {
1596 fmt.Println(" SubscriptionDetail.ActionToBeSetup.SubsequentAction = nil")
1597 }
1598 }
1599 }
1600}