[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         setupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
75
76         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, len(setupRequestIes))
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(setupRequestIes) < 2 {
85                 return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
86         }
87
88         functionsIdList := extractRanFunctionsIDList(request)
89
90         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
91         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
92                 Text                      string                      `xml:",chardata"`
93                 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
94         }{ProtocolIESingleContainer: functionsIdList}}
95
96         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
97 }
98
99 func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage {
100         outcome := UnsuccessfulOutcome{}
101         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
102         outcome.ProcedureCode = "1"
103         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
104         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
105         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
106         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
107         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
108 }
109
110 type E2SetupResponseMessage struct {
111         XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
112         Text    string   `xml:",chardata"`
113         E2APPDU E2APPDU
114 }
115
116 type E2APPDU struct {
117         XMLName xml.Name `xml:"E2AP-PDU"`
118         Text    string   `xml:",chardata"`
119         Outcome interface{}
120 }
121
122 type SuccessfulOutcome struct {
123         XMLName       xml.Name `xml:"successfulOutcome"`
124         Text          string   `xml:",chardata"`
125         ProcedureCode string   `xml:"procedureCode"`
126         Criticality   struct {
127                 Text   string `xml:",chardata"`
128                 Reject string `xml:"reject"`
129         } `xml:"criticality"`
130         Value struct {
131                 Text            string `xml:",chardata"`
132                 E2setupResponse struct {
133                         Text        string `xml:",chardata"`
134                         ProtocolIEs struct {
135                                 Text               string               `xml:",chardata"`
136                                 E2setupResponseIEs []E2setupResponseIEs `xml:"E2setupResponseIEs"`
137                         } `xml:"protocolIEs"`
138                 } `xml:"E2setupResponse"`
139         } `xml:"value"`
140 }
141
142 type E2setupResponseIEs struct {
143         Text        string `xml:",chardata"`
144         ID          string `xml:"id"`
145         Criticality struct {
146                 Text   string `xml:",chardata"`
147                 Reject string `xml:"reject"`
148         } `xml:"criticality"`
149         Value interface{} `xml:"value"`
150 }
151
152 type GlobalRICID struct {
153         Text        string `xml:",chardata"`
154         GlobalRICID struct {
155                 Text         string `xml:",chardata"`
156                 PLMNIdentity string `xml:"pLMN-Identity"`
157                 RicID        string `xml:"ric-ID"`
158         } `xml:"GlobalRIC-ID"`
159 }
160
161 type RANfunctionsIDList struct {
162         Text               string `xml:",chardata"`
163         RANfunctionsIDList struct {
164                 Text                      string                      `xml:",chardata"`
165                 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
166         } `xml:"RANfunctionsID-List"`
167 }
168
169 type ProtocolIESingleContainer struct {
170         Text        string `xml:",chardata"`
171         ID          string `xml:"id"`
172         Criticality struct {
173                 Text   string `xml:",chardata"`
174                 Ignore string `xml:"ignore"`
175         } `xml:"criticality"`
176         Value struct {
177                 Text              string `xml:",chardata"`
178                 RANfunctionIDItem struct {
179                         Text                string `xml:",chardata"`
180                         RanFunctionID       string `xml:"ranFunctionID"`
181                         RanFunctionRevision string `xml:"ranFunctionRevision"`
182                 } `xml:"RANfunctionID-Item"`
183         } `xml:"value"`
184 }
185
186 type UnsuccessfulOutcome struct {
187         XMLName       xml.Name `xml:"unsuccessfulOutcome"`
188         Text          string   `xml:",chardata"`
189         ProcedureCode string   `xml:"procedureCode"`
190         Criticality   struct {
191                 Text   string `xml:",chardata"`
192                 Reject string `xml:"reject"`
193         } `xml:"criticality"`
194         Value struct {
195                 Text           string `xml:",chardata"`
196                 E2setupFailure struct {
197                         Text        string `xml:",chardata"`
198                         ProtocolIEs struct {
199                                 Text              string              `xml:",chardata"`
200                                 E2setupFailureIEs []E2setupFailureIEs `xml:"E2setupFailureIEs"`
201                         } `xml:"protocolIEs"`
202                 } `xml:"E2setupFailure"`
203         } `xml:"value"`
204 }
205
206 type E2setupFailureIEs struct {
207         Text        string `xml:",chardata"`
208         ID          string `xml:"id"`
209         Criticality struct {
210                 Text   string `xml:",chardata"`
211                 Ignore string `xml:"ignore"`
212         } `xml:"criticality"`
213         Value struct {
214                 Text  string `xml:",chardata"`
215                 Value interface{}
216         } `xml:"value"`
217 }
218
219 type Cause struct {
220         XMLName   xml.Name `xml:"Cause"`
221         Text      string   `xml:",chardata"`
222         Transport struct {
223                 Text                         string `xml:",chardata"`
224                 TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
225         } `xml:"transport"`
226 }
227
228 func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
229
230         list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
231         ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
232         for i := 0; i < len(ids); i++ {
233                 ids[i] = convertToRANfunctionID(list, i)
234         }
235         return ids
236 }
237
238 func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer {
239         id := ProtocolIESingleContainer{}
240         id.ID = "6"
241         id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
242         id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
243         return id
244 }