[RIC-436] Fix E2 Setup Response population
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_response_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 )
25
26 type TimeToWait = int
27
28 var TimeToWaitEnum = struct {
29         V60s TimeToWait
30         V20s TimeToWait
31         V10s TimeToWait
32         V5s  TimeToWait
33         V2s  TimeToWait
34         V1s  TimeToWait
35 }{60, 20, 10, 5, 2, 1}
36
37 var timeToWaitMap = map[TimeToWait]interface{}{
38         TimeToWaitEnum.V60s: struct {
39                 XMLName xml.Name `xml:"TimeToWait"`
40                 Text    string   `xml:",chardata"`
41                 V60s    string   `xml:"v60s"`
42         }{},
43         TimeToWaitEnum.V20s: struct {
44                 XMLName xml.Name `xml:"TimeToWait"`
45                 Text    string   `xml:",chardata"`
46                 V20s    string   `xml:"v20s"`
47         }{},
48         TimeToWaitEnum.V10s: struct {
49                 XMLName xml.Name `xml:"TimeToWait"`
50                 Text    string   `xml:",chardata"`
51                 V10s    string   `xml:"v10s"`
52         }{},
53         TimeToWaitEnum.V5s: struct {
54                 XMLName xml.Name `xml:"TimeToWait"`
55                 Text    string   `xml:",chardata"`
56                 V5s     string   `xml:"v5s"`
57         }{},
58         TimeToWaitEnum.V2s: struct {
59                 XMLName xml.Name `xml:"TimeToWait"`
60                 Text    string   `xml:",chardata"`
61                 V2s     string   `xml:"v2s"`
62         }{},
63         TimeToWaitEnum.V1s: struct {
64                 XMLName xml.Name `xml:"TimeToWait"`
65                 Text    string   `xml:",chardata"`
66                 V1s     string   `xml:"v1s"`
67         }{},
68 }
69
70 func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage {
71         outcome := SuccessfulOutcome{}
72         outcome.ProcedureCode = "1"
73
74         e2SetupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
75
76         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, len(e2SetupRequestIes))
77         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
78         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
79                 Text         string `xml:",chardata"`
80                 PLMNIdentity string `xml:"pLMN-Identity"`
81                 RicID        string `xml:"ric-ID"`
82         }{PLMNIdentity: plmnId, RicID: ricId}}
83
84         if len(e2SetupRequestIes) < 2 {
85                 return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
86         }
87
88         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
89         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
90                 Text                      string                      `xml:",chardata"`
91                 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
92         }{ProtocolIESingleContainer: extractRanFunctionsIDList(request)}}
93         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
94 }
95
96 func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage {
97         outcome := UnsuccessfulOutcome{}
98         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
99         outcome.ProcedureCode = "1"
100         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
101         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
102         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
103         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
104         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
105 }
106
107 type E2SetupResponseMessage struct {
108         XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
109         Text    string   `xml:",chardata"`
110         E2APPDU E2APPDU
111 }
112
113 type E2APPDU struct {
114         XMLName xml.Name `xml:"E2AP-PDU"`
115         Text    string   `xml:",chardata"`
116         Outcome interface{}
117 }
118
119 type SuccessfulOutcome struct {
120         XMLName       xml.Name `xml:"successfulOutcome"`
121         Text          string   `xml:",chardata"`
122         ProcedureCode string   `xml:"procedureCode"`
123         Criticality   struct {
124                 Text   string `xml:",chardata"`
125                 Reject string `xml:"reject"`
126         } `xml:"criticality"`
127         Value struct {
128                 Text            string `xml:",chardata"`
129                 E2setupResponse struct {
130                         Text        string `xml:",chardata"`
131                         ProtocolIEs struct {
132                                 Text               string               `xml:",chardata"`
133                                 E2setupResponseIEs []E2setupResponseIEs `xml:"E2setupResponseIEs"`
134                         } `xml:"protocolIEs"`
135                 } `xml:"E2setupResponse"`
136         } `xml:"value"`
137 }
138
139 type E2setupResponseIEs struct {
140         Text        string `xml:",chardata"`
141         ID          string `xml:"id"`
142         Criticality struct {
143                 Text   string `xml:",chardata"`
144                 Reject string `xml:"reject"`
145         } `xml:"criticality"`
146         Value interface{} `xml:"value"`
147 }
148
149 type GlobalRICID struct {
150         Text        string `xml:",chardata"`
151         GlobalRICID struct {
152                 Text         string `xml:",chardata"`
153                 PLMNIdentity string `xml:"pLMN-Identity"`
154                 RicID        string `xml:"ric-ID"`
155         } `xml:"GlobalRIC-ID"`
156 }
157
158 type RANfunctionsIDList struct {
159         Text               string `xml:",chardata"`
160         RANfunctionsIDList struct {
161                 Text                      string                      `xml:",chardata"`
162                 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
163         } `xml:"RANfunctionsID-List"`
164 }
165
166 type ProtocolIESingleContainer struct {
167         Text        string `xml:",chardata"`
168         ID          string `xml:"id"`
169         Criticality struct {
170                 Text   string `xml:",chardata"`
171                 Ignore string `xml:"ignore"`
172         } `xml:"criticality"`
173         Value struct {
174                 Text              string `xml:",chardata"`
175                 RANfunctionIDItem struct {
176                         Text                string `xml:",chardata"`
177                         RanFunctionID       uint32 `xml:"ranFunctionID"`
178                         RanFunctionRevision uint32 `xml:"ranFunctionRevision"`
179                 } `xml:"RANfunctionID-Item"`
180         } `xml:"value"`
181 }
182
183 type UnsuccessfulOutcome struct {
184         XMLName       xml.Name `xml:"unsuccessfulOutcome"`
185         Text          string   `xml:",chardata"`
186         ProcedureCode string   `xml:"procedureCode"`
187         Criticality   struct {
188                 Text   string `xml:",chardata"`
189                 Reject string `xml:"reject"`
190         } `xml:"criticality"`
191         Value struct {
192                 Text           string `xml:",chardata"`
193                 E2setupFailure struct {
194                         Text        string `xml:",chardata"`
195                         ProtocolIEs struct {
196                                 Text              string              `xml:",chardata"`
197                                 E2setupFailureIEs []E2setupFailureIEs `xml:"E2setupFailureIEs"`
198                         } `xml:"protocolIEs"`
199                 } `xml:"E2setupFailure"`
200         } `xml:"value"`
201 }
202
203 type E2setupFailureIEs struct {
204         Text        string `xml:",chardata"`
205         ID          string `xml:"id"`
206         Criticality struct {
207                 Text   string `xml:",chardata"`
208                 Ignore string `xml:"ignore"`
209         } `xml:"criticality"`
210         Value struct {
211                 Text  string `xml:",chardata"`
212                 Value interface{}
213         } `xml:"value"`
214 }
215
216 type Cause struct {
217         XMLName   xml.Name `xml:"Cause"`
218         Text      string   `xml:",chardata"`
219         Transport struct {
220                 Text                         string `xml:",chardata"`
221                 TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
222         } `xml:"transport"`
223 }
224
225 func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
226         list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
227         ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
228         for i := 0; i < len(ids); i++ {
229                 ids[i] = convertToRANfunctionID(list, i)
230         }
231         return ids
232 }
233
234 func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer {
235         id := ProtocolIESingleContainer{}
236         id.ID = "6"
237         id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
238         id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
239         return id
240 }