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