Merge "[RIC-395] - E2M new REST API - E2M Set Parameters - Automation + Decoder"
authorShuky Har-Noy <shuky.har-noy@intl.att.com>
Wed, 17 Jun 2020 13:08:49 +0000 (13:08 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Wed, 17 Jun 2020 13:08:49 +0000 (13:08 +0000)
1  2 
E2Manager/controllers/nodeb_controller.go
E2Manager/controllers/nodeb_controller_test.go

@@@ -46,6 -46,8 +46,6 @@@ const ContentType = "Content-Type
  type INodebController interface {
        Shutdown(writer http.ResponseWriter, r *http.Request)
        X2Reset(writer http.ResponseWriter, r *http.Request)
 -      X2Setup(writer http.ResponseWriter, r *http.Request)
 -      EndcSetup(writer http.ResponseWriter, r *http.Request)
        GetNodeb(writer http.ResponseWriter, r *http.Request)
        UpdateGnb(writer http.ResponseWriter, r *http.Request)
        GetNodebIdList(writer http.ResponseWriter, r *http.Request)
@@@ -101,7 -103,7 +101,7 @@@ func (c *NodebController) SetGeneralCon
  
        request := models.GeneralConfigurationRequest{}
  
-       if !c.extractJsonBody(r, &request, writer){
+       if !c.extractJsonBodyDisallowUnknownFields(r, &request, writer){
                return
        }
        c.handleRequest(writer, &r.Header, httpmsghandlerprovider.SetGeneralConfigurationRequest, request, false)
@@@ -125,6 -127,30 +125,6 @@@ func (c *NodebController) X2Reset(write
        c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ResetRequest, request, false)
  }
  
 -func (c *NodebController) X2Setup(writer http.ResponseWriter, r *http.Request) {
 -      c.logger.Infof("[Client -> E2 Manager] #NodebController.X2Setup - request: %v", c.prettifyRequest(r))
 -
 -      request := models.SetupRequest{}
 -
 -      if !c.extractJsonBody(r, &request, writer) {
 -              return
 -      }
 -
 -      c.handleRequest(writer, &r.Header, httpmsghandlerprovider.X2SetupRequest, request, true)
 -}
 -
 -func (c *NodebController) EndcSetup(writer http.ResponseWriter, r *http.Request) {
 -      c.logger.Infof("[Client -> E2 Manager] #NodebController.EndcSetup - request: %v", c.prettifyRequest(r))
 -
 -      request := models.SetupRequest{}
 -
 -      if !c.extractJsonBody(r, &request, writer) {
 -              return
 -      }
 -
 -      c.handleRequest(writer, &r.Header, httpmsghandlerprovider.EndcSetupRequest, request, true)
 -}
 -
  func (c *NodebController) extractRequestBodyToProto(r *http.Request, pb proto.Message , writer http.ResponseWriter) bool {
        defer r.Body.Close()
  
        return true
  }
  
+ func (c *NodebController) extractJsonBodyDisallowUnknownFields(r *http.Request, request models.Request, writer http.ResponseWriter) bool {
+       defer r.Body.Close()
+       decoder := json.NewDecoder(r.Body)
+       decoder.DisallowUnknownFields()
+       if err := decoder.Decode(&request); err != nil {
+               c.logger.Errorf("[Client -> E2 Manager] #NodebController.extractJsonBody - unable to extract json body - error: %s", err)
+               c.handleErrorResponse(e2managererrors.NewInvalidJsonError(), writer)
+               return false
+       }
+       return true
+ }
  func (c *NodebController) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool {
        defer r.Body.Close()
        body, err := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
@@@ -24,6 -24,7 +24,6 @@@ import 
        "e2mgr/clients"
        "e2mgr/configuration"
        "e2mgr/e2managererrors"
 -      "e2mgr/e2pdus"
        "e2mgr/logger"
        "e2mgr/managers"
        "e2mgr/mocks"
@@@ -176,16 -177,92 +176,16 @@@ func setupControllerTest(t *testing.T) 
        e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
        httpClientMock := &mocks.HttpClientMock{}
        rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
 -      e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
 +      ranListManager := &mocks.RanListManagerMock{}
 +      ranAlarmService := &mocks.RanAlarmServiceMock{}
 +      ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
 +
 +      e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager)
        handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager, rmClient)
        controller := NewNodebController(log, handlerProvider)
        return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager
  }
  
 -func TestX2SetupInvalidBody(t *testing.T) {
 -
 -      controller, _, _, _, _ := setupControllerTest(t)
 -
 -      header := http.Header{}
 -      header.Set("Content-Type", "application/json")
 -      httpRequest, _ := http.NewRequest("POST", "http://localhost:3800/v1/nodeb/x2-setup", strings.NewReader("{}{}"))
 -      httpRequest.Header = header
 -
 -      writer := httptest.NewRecorder()
 -      controller.X2Setup(writer, httpRequest)
 -
 -      var errorResponse = parseJsonRequest(t, writer.Body)
 -
 -      assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
 -      assert.Equal(t, e2managererrors.NewInvalidJsonError().Code, errorResponse.Code)
 -}
 -
 -func TestX2SetupSuccess(t *testing.T) {
 -
 -      controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t)
 -
 -      ranName := "test"
 -      nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"}
 -      readerMock.On("GetNodeb", ranName).Return(nb, nil)
 -      var nbUpdated = *nb
 -      writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil)
 -
 -      var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"}
 -      writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil)
 -
 -      payload := e2pdus.PackedX2setupRequest
 -      var xAction []byte
 -      var msgSrc unsafe.Pointer
 -      msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
 -
 -      rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 -
 -      header := http.Header{}
 -      header.Set("Content-Type", "application/json")
 -      httpRequest := tests.GetHttpRequest()
 -      httpRequest.Header = header
 -
 -      writer := httptest.NewRecorder()
 -      controller.X2Setup(writer, httpRequest)
 -
 -      assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
 -}
 -
 -func TestEndcSetupSuccess(t *testing.T) {
 -
 -      controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t)
 -
 -      ranName := "test"
 -      nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"}
 -      readerMock.On("GetNodeb", ranName).Return(nb, nil)
 -      var nbUpdated = *nb
 -      writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil)
 -
 -      var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"}
 -      writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil)
 -
 -      payload := e2pdus.PackedEndcX2setupRequest
 -      var xAction []byte
 -      var msgSrc unsafe.Pointer
 -      msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
 -
 -      rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 -
 -      header := http.Header{}
 -      header.Set("Content-Type", "application/json")
 -      httpRequest := tests.GetHttpRequest()
 -      httpRequest.Header = header
 -
 -      writer := httptest.NewRecorder()
 -      controller.EndcSetup(writer, httpRequest)
 -
 -      assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
 -}
 -
  func TestShutdownHandlerRnibError(t *testing.T) {
        controller, _, _, _, e2tInstancesManagerMock := setupControllerTest(t)
        e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError())
@@@ -223,7 -300,7 +223,7 @@@ func TestSetGeneralConfigurationInvalid
  
        writer := httptest.NewRecorder()
  
-       httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{}{}"))
+       httpRequest, _ := http.NewRequest("PUT", "https://localhost:3800/v1/nodeb/parameters", strings.NewReader("{\"enableRic\":false, \"someValue\":false}"))
  
        controller.SetGeneralConfiguration(writer, httpRequest)