RIC-194 Setup from RAN: On Routing Manager Failure, return Setup Failure
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_response_message.go
diff --git a/E2Manager/models/e2_setup_response_message.go b/E2Manager/models/e2_setup_response_message.go
new file mode 100644 (file)
index 0000000..62c733d
--- /dev/null
@@ -0,0 +1,233 @@
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//  This source code is part of the near-RT RIC (RAN Intelligent Controller)
+//  platform project (RICP).
+
+package models
+import (
+       "encoding/xml"
+)
+
+
+type TimeToWait = int
+
+var TimeToWaitEnum = struct{
+       V60s TimeToWait
+       V20s TimeToWait
+       V10s TimeToWait
+       V5s TimeToWait
+       V2s TimeToWait
+       V1s TimeToWait
+}{60, 20, 10, 5, 2, 1}
+
+var timeToWaitMap = map[TimeToWait]interface{}{
+       TimeToWaitEnum.V60s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V60s string `xml:"v60s"`
+       }{},
+       TimeToWaitEnum.V20s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V20s string `xml:"v20s"`
+       }{},
+       TimeToWaitEnum.V10s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V10s string `xml:"v10s"`
+       }{},
+       TimeToWaitEnum.V5s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V5s string `xml:"v5s"`
+       }{},
+       TimeToWaitEnum.V2s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V2s string `xml:"v2s"`
+       }{},
+       TimeToWaitEnum.V1s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V1s string `xml:"v1s"`
+       }{},
+}
+
+func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage{
+       outcome := SuccessfulOutcome{}
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2)
+       outcome.ProcedureCode = "1"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               RicID        string `xml:"ric-ID"`
+       }{PLMNIdentity:plmnId, RicID:ricId}}
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
+               Text                      string `xml:",chardata"`
+               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+       }{ProtocolIESingleContainer:extractRanFunctionsIDList(request)}}
+       return E2SetupResponseMessage{E2APPDU:E2APPDU{Outcome:outcome}}
+}
+
+func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage{
+       outcome := UnsuccessfulOutcome{}
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
+       outcome.ProcedureCode = "1"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
+       return E2SetupResponseMessage{E2APPDU:E2APPDU{Outcome:outcome}}
+}
+
+type E2SetupResponseMessage struct {
+       XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
+       Text    string   `xml:",chardata"`
+       E2APPDU E2APPDU
+}
+
+type E2APPDU struct {
+       XMLName xml.Name `xml:"E2AP-PDU"`
+       Text    string `xml:",chardata"`
+       Outcome interface{}
+}
+
+type SuccessfulOutcome struct {
+       XMLName xml.Name        `xml:"successfulOutcome"`
+       Text          string `xml:",chardata"`
+       ProcedureCode string `xml:"procedureCode"`
+       Criticality   struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text            string `xml:",chardata"`
+               E2setupResponse struct {
+                       Text        string `xml:",chardata"`
+                       ProtocolIEs struct {
+                               Text               string `xml:",chardata"`
+                               E2setupResponseIEs []E2setupResponseIEs`xml:"E2setupResponseIEs"`
+                       } `xml:"protocolIEs"`
+               } `xml:"E2setupResponse"`
+       } `xml:"value"`
+}
+
+type E2setupResponseIEs struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value interface{}`xml:"value"`
+}
+
+type GlobalRICID struct {
+       Text        string `xml:",chardata"`
+       GlobalRICID struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               RicID        string `xml:"ric-ID"`
+       } `xml:"GlobalRIC-ID"`
+}
+
+type RANfunctionsIDList struct {
+       Text        string `xml:",chardata"`
+       RANfunctionsIDList struct {
+               Text                      string `xml:",chardata"`
+               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+       } `xml:"RANfunctionsID-List"`
+}
+
+type ProtocolIESingleContainer struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text              string `xml:",chardata"`
+               RANfunctionIDItem struct {
+                       Text                string `xml:",chardata"`
+                       RanFunctionID       string `xml:"ranFunctionID"`
+                       RanFunctionRevision string `xml:"ranFunctionRevision"`
+               } `xml:"RANfunctionID-Item"`
+       } `xml:"value"`
+}
+
+
+type UnsuccessfulOutcome struct {
+       XMLName xml.Name        `xml:"unsuccessfulOutcome"`
+       Text          string `xml:",chardata"`
+       ProcedureCode string `xml:"procedureCode"`
+       Criticality   struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text            string `xml:",chardata"`
+               E2setupFailure struct {
+                       Text        string `xml:",chardata"`
+                       ProtocolIEs struct {
+                               Text               string `xml:",chardata"`
+                               E2setupFailureIEs []E2setupFailureIEs`xml:"E2setupFailureIEs"`
+                       } `xml:"protocolIEs"`
+               } `xml:"E2setupFailure"`
+       } `xml:"value"`
+}
+
+type E2setupFailureIEs struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text  string `xml:",chardata"`
+               Value interface{}
+       } `xml:"value"`
+}
+
+type Cause struct {
+       XMLName xml.Name        `xml:"Cause"`
+       Text      string `xml:",chardata"`
+       Transport struct {
+               Text                         string `xml:",chardata"`
+               TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
+       } `xml:"transport"`
+}
+
+func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer{
+       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
+       ids := make([]ProtocolIESingleContainer,len(list.ProtocolIESingleContainer))
+       for i := 0; i< len(ids); i++{
+               ids[i] = convertToRANfunctionID(list, i)
+       }
+       return ids
+}
+
+func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer{
+       id := ProtocolIESingleContainer{}
+       id.ID = "6"
+       id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
+       id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
+       return id
+}
\ No newline at end of file