ac68aa616d3d00f67eb4ead42e0102842823024c
[ric-plt/submgr.git] / pkg / control / subscription.go
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17 ==================================================================================
18 */
19
20 package control
21
22 import (
23         "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
24         "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/xapptweaks"
25         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
26         "sync"
27 )
28
29 //-----------------------------------------------------------------------------
30 //
31 //-----------------------------------------------------------------------------
32 type Subscription struct {
33         mutex     sync.Mutex                    // Lock
34         valid     bool                          // valid
35         registry  *Registry                     // Registry
36         ReqId     RequestId                     // ReqId (Requestor Id + Seq Nro a.k.a subsid)
37         Meid      *xapp.RMRMeid                 // Meid/ RanName
38         EpList    xapptweaks.RmrEndpointList    // Endpoints
39         TransLock sync.Mutex                    // Lock transactions, only one executed per time for subs
40         TheTrans  TransactionIf                 // Ongoing transaction
41         SubReqMsg *e2ap.E2APSubscriptionRequest // Subscription information
42         SubRFMsg  interface{}                   // Subscription information
43 }
44
45 func (s *Subscription) String() string {
46         return "subs(" + s.ReqId.String() + "/" + (&xapptweaks.RMRMeid{s.Meid}).String() + "/" + s.EpList.String() + ")"
47 }
48
49 func (s *Subscription) GetCachedResponse() (interface{}, bool) {
50         s.mutex.Lock()
51         defer s.mutex.Unlock()
52         return s.SubRFMsg, s.valid
53 }
54
55 func (s *Subscription) SetCachedResponse(subRFMsg interface{}, valid bool) (interface{}, bool) {
56         s.mutex.Lock()
57         defer s.mutex.Unlock()
58         s.SubRFMsg = subRFMsg
59         s.valid = valid
60         return s.SubRFMsg, s.valid
61 }
62
63 func (s *Subscription) GetReqId() *RequestId {
64         s.mutex.Lock()
65         defer s.mutex.Unlock()
66         return &s.ReqId
67 }
68
69 func (s *Subscription) GetMeid() *xapp.RMRMeid {
70         s.mutex.Lock()
71         defer s.mutex.Unlock()
72         if s.Meid != nil {
73                 return s.Meid
74         }
75         return nil
76 }
77
78 func (s *Subscription) GetTransaction() TransactionIf {
79         s.mutex.Lock()
80         defer s.mutex.Unlock()
81         return s.TheTrans
82 }
83
84 func (s *Subscription) WaitTransactionTurn(trans TransactionIf) {
85         s.TransLock.Lock()
86         s.mutex.Lock()
87         s.TheTrans = trans
88         s.mutex.Unlock()
89 }
90
91 func (s *Subscription) ReleaseTransactionTurn(trans TransactionIf) {
92         s.mutex.Lock()
93         if trans != nil && trans == s.TheTrans {
94                 s.TheTrans = nil
95         }
96         s.mutex.Unlock()
97         s.TransLock.Unlock()
98 }
99
100 func (s *Subscription) IsMergeable(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest) bool {
101         s.mutex.Lock()
102         defer s.mutex.Unlock()
103
104         if s.valid == false {
105                 return false
106         }
107
108         if s.SubReqMsg == nil {
109                 return false
110         }
111
112         if s.Meid.RanName != trans.Meid.RanName {
113                 return false
114         }
115
116         // EventTrigger check
117         if s.SubReqMsg.EventTriggerDefinition.InterfaceDirection != subReqMsg.EventTriggerDefinition.InterfaceDirection ||
118                 s.SubReqMsg.EventTriggerDefinition.ProcedureCode != subReqMsg.EventTriggerDefinition.ProcedureCode ||
119                 s.SubReqMsg.EventTriggerDefinition.TypeOfMessage != subReqMsg.EventTriggerDefinition.TypeOfMessage {
120                 return false
121         }
122
123         if s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present ||
124                 s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId ||
125                 s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.String() != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.String() {
126                 return false
127         }
128
129         if s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.Present != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.Present ||
130                 s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.NodeId != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.NodeId ||
131                 s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.String() != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.String() {
132                 return false
133         }
134
135         // Actions check
136         if len(s.SubReqMsg.ActionSetups) != len(subReqMsg.ActionSetups) {
137                 return false
138         }
139
140         for _, acts := range s.SubReqMsg.ActionSetups {
141                 for _, actt := range subReqMsg.ActionSetups {
142                         if acts.ActionId != actt.ActionId {
143                                 return false
144                         }
145                         if acts.ActionType != actt.ActionType {
146                                 return false
147                         }
148
149                         if acts.ActionType != e2ap.E2AP_ActionTypeReport {
150                                 return false
151                         }
152
153                         if acts.ActionDefinition.Present != actt.ActionDefinition.Present ||
154                                 acts.ActionDefinition.StyleId != actt.ActionDefinition.StyleId ||
155                                 acts.ActionDefinition.ParamId != actt.ActionDefinition.ParamId {
156                                 return false
157                         }
158                         if acts.SubsequentAction.Present != actt.SubsequentAction.Present ||
159                                 acts.SubsequentAction.Type != actt.SubsequentAction.Type ||
160                                 acts.SubsequentAction.TimetoWait != actt.SubsequentAction.TimetoWait {
161                                 return false
162                         }
163                 }
164         }
165
166         return true
167 }