[RIC-436] Fix out of range defect for setupRequestIes 36/3936/3
authoridanshal <idan.shalom@intl.att.com>
Mon, 1 Jun 2020 13:47:00 +0000 (16:47 +0300)
committerShuky Har-Noy <shuky.har-noy@intl.att.com>
Mon, 1 Jun 2020 20:34:39 +0000 (20:34 +0000)
Change-Id: I81e2d719c1136c77442db5cbd1226a20b761cde7
Signed-off-by: idanshal <idan.shalom@intl.att.com>
E2Manager/Dockerfile
E2Manager/container-tag.yaml
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/models/e2_setup_request_message.go
E2Manager/models/e2_setup_response_message.go
E2Manager/tests/resources/setupRequest_gnb_without_functions.xml [new file with mode: 0644]

index b56f011..89c23af 100755 (executable)
@@ -20,7 +20,7 @@
 #   platform project (RICP).
 #
 
-FROM nexus3.o-ran-sc.org:10004/bldr-ubuntu18-c-go:7-u18.04 as ubuntu
+FROM nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:8-u18.04 as ubuntu
 
 WORKDIR /opt/E2Manager
 COPY . .
index 4491f06..ba5c780 100644 (file)
@@ -1,4 +1,4 @@
 # The Jenkins job requires a tag to build the Docker image.
 # Global-JJB script assumes this file is in the repo root.
 ---
-tag: 4.4.10
+tag: 4.4.11
index 9ea0ef5..7cd5458 100644 (file)
@@ -140,7 +140,10 @@ func (h E2SetupRequestNotificationHandler) setGnbFunctions(nodebInfo *entities.N
                return err
        }
 
-       nodebInfo.GetGnb().RanFunctions = ranFunctions
+       if ranFunctions != nil {
+               nodebInfo.GetGnb().RanFunctions = ranFunctions
+       }
+
        return nil
 }
 
index 22d8d45..28dfe76 100644 (file)
@@ -42,6 +42,7 @@ const (
        e2tInstanceFullAddress   = "10.0.2.15:9999"
        nodebRanName             = "gnb:310-410-b5c67788"
        GnbSetupRequestXmlPath   = "../../tests/resources/setupRequest_gnb.xml"
+       GnbWithoutFunctionsSetupRequestXmlPath   = "../../tests/resources/setupRequest_gnb_without_functions.xml"
        EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml"
        NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml"
        EnbSetupRequestXmlPath   = "../../tests/resources/setupRequest_enb.xml"
@@ -139,6 +140,26 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) {
        assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
 }
 
+func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) {
+       xmlGnb := readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath)
+       handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
+       var e2tInstance = &entities.E2TInstance{}
+       e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil)
+       var gnb *entities.NodebInfo
+       readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
+       writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
+       routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
+       writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
+       e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
+       var errEmpty error
+       rmrMessage := &rmrCgo.MBuf{}
+       rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
+       prefBytes := []byte(prefix)
+       notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
+       handler.Handle(notificationRequest)
+       assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock)
+}
+
 func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) {
        xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
        handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t)
index 44fe5f8..32d05ca 100644 (file)
@@ -157,7 +157,14 @@ type RANfunctionsList struct {
 }
 
 func (m *E2SetupRequestMessage) ExtractRanFunctionsList() ([]*entities.RanFunction, error) {
-       list := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList.ProtocolIESingleContainer
+
+       setupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+
+       if len(setupRequestIes) < 2 {
+               return nil, nil
+       }
+
+       list := setupRequestIes[1].Value.RANfunctionsList.ProtocolIESingleContainer
        funcs := make([]*entities.RanFunction, len(list))
        for i := 0; i < len(funcs); i++ {
                funcs[i] = &entities.RanFunction{}
index 654e2af..fc20788 100644 (file)
@@ -77,11 +77,17 @@ func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2Se
                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)}}
+
+       functionsIdList := extractRanFunctionsIDList(request)
+
+       if functionsIdList != nil {
+               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: functionsIdList}}
+       }
+
        return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
 }
 
@@ -215,7 +221,14 @@ type Cause struct {
 }
 
 func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
-       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
+
+       setupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+
+       if len(setupRequestIes) < 2 {
+               return nil
+       }
+
+       list := &setupRequestIes[1].Value.RANfunctionsList
        ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
        for i := 0; i < len(ids); i++ {
                ids[i] = convertToRANfunctionID(list, i)
diff --git a/E2Manager/tests/resources/setupRequest_gnb_without_functions.xml b/E2Manager/tests/resources/setupRequest_gnb_without_functions.xml
new file mode 100644 (file)
index 0000000..db28387
--- /dev/null
@@ -0,0 +1,34 @@
+<E2AP-PDU>
+    <initiatingMessage>
+        <procedureCode>1</procedureCode>
+        <criticality>
+            <reject/>
+        </criticality>
+        <value>
+            <E2setupRequest>
+                <protocolIEs>
+                    <E2setupRequestIEs>
+                        <id>3</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <GlobalE2node-ID>
+                                <gNB>
+                                    <global-gNB-ID>
+                                        <plmn-id>13 F1 84</plmn-id>
+                                        <gnb-id>
+                                            <gnb-ID>
+                                                00000000000000010000001000000001
+                                            </gnb-ID>
+                                        </gnb-id>
+                                    </global-gNB-ID>
+                                </gNB>
+                            </GlobalE2node-ID>
+                        </value>
+                    </E2setupRequestIEs>
+                </protocolIEs>
+            </E2setupRequest>
+        </value>
+    </initiatingMessage>
+</E2AP-PDU>
\ No newline at end of file