RIC-193 - Setup from RAN fixes: Marshal XML Response, trim whitespaces, convert ricId...
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_request_message.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package models
21
22 import (
23         "encoding/xml"
24         "errors"
25         "fmt"
26         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
27         "strconv"
28         "strings"
29 )
30
31 type E2SetupRequestMessage struct {
32         XMLName xml.Name `xml:"E2SetupRequestMessage"`
33         Text    string   `xml:",chardata"`
34         E2APPDU struct {
35                 Text              string `xml:",chardata"`
36                 InitiatingMessage struct {
37                         Text          string `xml:",chardata"`
38                         ProcedureCode string `xml:"procedureCode"`
39                         Criticality   struct {
40                                 Text   string `xml:",chardata"`
41                                 Reject string `xml:"reject"`
42                         } `xml:"criticality"`
43                         Value struct {
44                                 Text           string `xml:",chardata"`
45                                 E2setupRequest struct {
46                                         Text        string `xml:",chardata"`
47                                         ProtocolIEs struct {
48                                                 Text              string `xml:",chardata"`
49                                                 E2setupRequestIEs []struct {
50                                                         Text        string `xml:",chardata"`
51                                                         ID          string `xml:"id"`
52                                                         Criticality struct {
53                                                                 Text   string `xml:",chardata"`
54                                                                 Reject string `xml:"reject"`
55                                                         } `xml:"criticality"`
56                                                         Value struct {
57                                                                 Text           string `xml:",chardata"`
58                                                                 GlobalE2nodeID struct {
59                                                                         Text string `xml:",chardata"`
60                                                                         GNB  struct {
61                                                                                 Text        string `xml:",chardata"`
62                                                                                 GlobalGNBID struct {
63                                                                                         Text   string `xml:",chardata"`
64                                                                                         PlmnID string `xml:"plmn-id"`
65                                                                                         GnbID  struct {
66                                                                                                 Text  string `xml:",chardata"`
67                                                                                                 GnbID string `xml:"gnb-ID"`
68                                                                                         } `xml:"gnb-id"`
69                                                                                 } `xml:"global-gNB-ID"`
70                                                                         } `xml:"gNB"`
71                                                                         EnGNB struct {
72                                                                                 Text        string `xml:",chardata"`
73                                                                                 GlobalGNBID struct {
74                                                                                         Text   string `xml:",chardata"`
75                                                                                         PlmnID string `xml:"plmn-id"`
76                                                                                         GnbID  struct {
77                                                                                                 Text  string `xml:",chardata"`
78                                                                                                 GnbID string `xml:"gnb-ID"`
79                                                                                         } `xml:"gnb-id"`
80                                                                                 } `xml:"global-gNB-ID"`
81                                                                         } `xml:"en-gNB"`
82                                                                         NgENB struct {
83                                                                                 Text          string `xml:",chardata"`
84                                                                                 GlobalNgENBID struct {
85                                                                                         Text   string `xml:",chardata"`
86                                                                                         PlmnID string `xml:"plmn-id"`
87                                                                                         GnbID  struct {
88                                                                                                 Text  string `xml:",chardata"`
89                                                                                                 GnbID string `xml:"gnb-ID"`
90                                                                                         } `xml:"gnb-id"`
91                                                                                 } `xml:"global-ng-eNB-ID"`
92                                                                         } `xml:"ng-eNB"`
93                                                                         ENB struct {
94                                                                                 Text        string `xml:",chardata"`
95                                                                                 GlobalENBID struct {
96                                                                                         Text   string `xml:",chardata"`
97                                                                                         PlmnID string `xml:"plmn-id"`
98                                                                                         GnbID  struct {
99                                                                                                 Text  string `xml:",chardata"`
100                                                                                                 GnbID string `xml:"gnb-ID"`
101                                                                                         } `xml:"gnb-id"`
102                                                                                 } `xml:"global-eNB-ID"`
103                                                                         } `xml:"eNB"`
104                                                                 } `xml:"GlobalE2node-ID"`
105                                                                 RANfunctionsList RANfunctionsList `xml:"RANfunctions-List"`
106                                                         } `xml:"value"`
107                                                 } `xml:"E2setupRequestIEs"`
108                                         } `xml:"protocolIEs"`
109                                 } `xml:"E2setupRequest"`
110                         } `xml:"value"`
111                 } `xml:"initiatingMessage"`
112         } `xml:"E2AP-PDU"`
113 }
114
115 type RANfunctionsList struct {
116     Text                      string `xml:",chardata"`
117     ProtocolIESingleContainer []struct {
118                 Text        string `xml:",chardata"`
119                 ID          string `xml:"id"`
120                 Criticality struct {
121                         Text   string `xml:",chardata"`
122                         Reject string `xml:"reject"`
123                 } `xml:"criticality"`
124                 Value struct {
125                         Text            string `xml:",chardata"`
126                         RANfunctionItem struct {
127                                 Text                  string `xml:",chardata"`
128                                 RanFunctionID         string `xml:"ranFunctionID"`
129                                 RanFunctionDefinition string `xml:"ranFunctionDefinition"`
130                                 RanFunctionRevision   string `xml:"ranFunctionRevision"`
131                         } `xml:"RANfunction-Item"`
132                 } `xml:"value"`
133     } `xml:"ProtocolIE-SingleContainer"`
134 }
135
136 func (m *E2SetupRequestMessage) GetExtractRanFunctionsList()([]*entities.RanFunction, error){
137         list :=m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList.ProtocolIESingleContainer
138         funcs := make([]*entities.RanFunction, len(list))
139         for i:=0; i < len(funcs); i++{
140                 funcs[i] = &entities.RanFunction{}
141                 id, err := strconv.ParseUint(list[i].Value.RANfunctionItem.RanFunctionID, 10, 32)
142                 if err != nil {
143                         return nil, errors.New(fmt.Sprintf("#e2_setup_request_message.GetExtractRanFunctionsList - Failed parse uint RanFunctionID from %s", list[i].Value.RANfunctionItem.RanFunctionID))
144                 }
145                 funcs[i].RanFunctionId = uint32(id)
146                 rev, err := strconv.ParseUint(list[i].Value.RANfunctionItem.RanFunctionRevision, 10, 32)
147                 if err != nil {
148                         return nil, errors.New(fmt.Sprintf("#e2_setup_request_message.GetExtractRanFunctionsList - Failed parse uint RanFunctionRevision from %s", list[i].Value.RANfunctionItem.RanFunctionRevision))
149                 }
150                 funcs[i].RanFunctionDefinition = m.trimSpaces(list[i].Value.RANfunctionItem.RanFunctionDefinition)
151                 funcs[i].RanFunctionRevision = uint32(rev)
152         }
153         return funcs, nil
154 }
155
156 func (m *E2SetupRequestMessage) GetNodeType() entities.Node_Type{
157         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.GNB.GlobalGNBID.PlmnID; id!= ""{
158                 return entities.Node_GNB
159         }
160         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.EnGNB.GlobalGNBID.PlmnID; id!= ""{
161                 return entities.Node_GNB
162         }
163         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.ENB.GlobalENBID.PlmnID; id!= ""{
164                 return entities.Node_ENB
165         }
166         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.NgENB.GlobalNgENBID.PlmnID; id!= ""{
167                 return entities.Node_GNB
168         }
169         return entities.Node_UNKNOWN
170 }
171
172 func (m *E2SetupRequestMessage) GetPlmnId() string{
173         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.GNB.GlobalGNBID.PlmnID; id!= ""{
174                 return m.trimSpaces(id)
175         }
176         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.EnGNB.GlobalGNBID.PlmnID; id!= ""{
177                 return m.trimSpaces(id)
178         }
179         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.ENB.GlobalENBID.PlmnID; id!= ""{
180                 return m.trimSpaces(id)
181         }
182         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.NgENB.GlobalNgENBID.PlmnID; id!= ""{
183                 return m.trimSpaces(id)
184         }
185         return ""
186 }
187
188 func (m *E2SetupRequestMessage) GetNbId() string{
189         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.GNB.GlobalGNBID.GnbID.GnbID; id!= ""{
190                 return m.trimSpaces(id)
191         }
192         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.EnGNB.GlobalGNBID.GnbID.GnbID; id!= ""{
193                 return m.trimSpaces(id)
194         }
195         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.ENB.GlobalENBID.GnbID.GnbID; id!= ""{
196                 return m.trimSpaces(id)
197         }
198         if id := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID.NgENB.GlobalNgENBID.GnbID.GnbID; id!= ""{
199                 return m.trimSpaces(id)
200         }
201         return ""
202 }
203
204 func (m *E2SetupRequestMessage) trimSpaces(str string) string {
205         return strings.NewReplacer(" ", "", "\n", "").Replace(str)
206 }