[RICPLT-2787] Add new e2t controller and GetE2TInstances API 96/2096/1 PI3
authoris005q <idan.shalom@intl.att.com>
Mon, 23 Dec 2019 10:02:14 +0000 (12:02 +0200)
committeris005q <idan.shalom@intl.att.com>
Mon, 23 Dec 2019 10:02:20 +0000 (12:02 +0200)
Change-Id: Id337dc7b6d83e2dd72790ea42495a2ab5b13e579
Signed-off-by: is005q <idan.shalom@intl.att.com>
18 files changed:
E2Manager/app/main.go
E2Manager/controllers/e2t_controller.go [new file with mode: 0644]
E2Manager/controllers/nodeb_controller.go
E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler.go [new file with mode: 0644]
E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler_test.go [new file with mode: 0644]
E2Manager/httpserver/http_server.go
E2Manager/httpserver/http_server_test.go
E2Manager/managers/e2t_instances_manager.go
E2Manager/mocks/controllerMock.go [deleted file]
E2Manager/mocks/e2t_controller_mock.go [new file with mode: 0644]
E2Manager/mocks/nodebControllerMock.go [deleted file]
E2Manager/mocks/nodeb_controller_mock.go [new file with mode: 0644]
E2Manager/mocks/root_controller_mock.go [new file with mode: 0644]
E2Manager/models/get_e2t_instances_response.go [new file with mode: 0644]
E2Manager/models/get_nodeb_id_list_response.go
E2Manager/models/get_nodeb_response.go
E2Manager/models/i_response.go
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go

index a54b8b2..2581f56 100644 (file)
@@ -76,5 +76,6 @@ func main() {
        httpMsgHandlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager)
        rootController := controllers.NewRootController(rnibDataService)
        nodebController := controllers.NewNodebController(logger, httpMsgHandlerProvider)
-       _ = httpserver.Run(logger, config.Http.Port, rootController, nodebController)
+       e2tController := controllers.NewE2TController(logger, httpMsgHandlerProvider)
+       _ = httpserver.Run(logger, config.Http.Port, rootController, nodebController, e2tController)
 }
\ No newline at end of file
diff --git a/E2Manager/controllers/e2t_controller.go b/E2Manager/controllers/e2t_controller.go
new file mode 100644 (file)
index 0000000..2d95542
--- /dev/null
@@ -0,0 +1,121 @@
+//
+// 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.
+//
+
+package controllers
+
+import (
+       "e2mgr/e2managererrors"
+       "e2mgr/logger"
+       "e2mgr/models"
+       "e2mgr/providers/httpmsghandlerprovider"
+       "encoding/json"
+       "net/http"
+       "net/http/httputil"
+       "strings"
+)
+
+type IE2TController interface {
+       GetE2TInstances(writer http.ResponseWriter, r *http.Request)
+}
+
+type E2TController struct {
+       logger          *logger.Logger
+       handlerProvider *httpmsghandlerprovider.IncomingRequestHandlerProvider
+}
+
+func NewE2TController(logger *logger.Logger, handlerProvider *httpmsghandlerprovider.IncomingRequestHandlerProvider) *E2TController {
+       return &E2TController{
+               logger:          logger,
+               handlerProvider: handlerProvider,
+       }
+}
+
+func (c *E2TController) GetE2TInstances(writer http.ResponseWriter, r *http.Request) {
+       c.logger.Infof("[Client -> E2 Manager] #E2TController.GetE2TInstances - request: %v", c.prettifyRequest(r))
+       c.handleRequest(writer, &r.Header, httpmsghandlerprovider.GetE2TInstancesRequest, nil, false)
+}
+
+func (c *E2TController) handleRequest(writer http.ResponseWriter, header *http.Header, requestName httpmsghandlerprovider.IncomingRequest, request models.Request, validateHeader bool) {
+
+       handler, err := c.handlerProvider.GetHandler(requestName)
+
+       if err != nil {
+               c.handleErrorResponse(err, writer)
+               return
+       }
+
+       response, err := handler.Handle(request)
+
+       if err != nil {
+               c.handleErrorResponse(err, writer)
+               return
+       }
+
+       if response == nil {
+               writer.WriteHeader(http.StatusNoContent)
+               c.logger.Infof("[E2 Manager -> Client] #E2TController.handleRequest - status response: %v", http.StatusNoContent)
+               return
+       }
+
+       result, err := response.Marshal()
+
+       if err != nil {
+               c.handleErrorResponse(err, writer)
+               return
+       }
+
+       c.logger.Infof("[E2 Manager -> Client] #E2TController.handleRequest - response: %s", result)
+       writer.Header().Set("Content-Type", "application/json")
+       writer.Write(result)
+}
+
+func (c *E2TController) handleErrorResponse(err error, writer http.ResponseWriter) {
+
+       var errorResponseDetails models.ErrorResponse
+       var httpError int
+
+       if err != nil {
+               switch err.(type) {
+               case *e2managererrors.RnibDbError:
+                       e2Error, _ := err.(*e2managererrors.RnibDbError)
+                       errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
+                       httpError = http.StatusInternalServerError
+               default:
+                       e2Error := e2managererrors.NewInternalError()
+                       errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
+                       httpError = http.StatusInternalServerError
+               }
+       }
+
+       errorResponse, _ := json.Marshal(errorResponseDetails)
+
+       c.logger.Errorf("[E2 Manager -> Client] #E2TController.handleErrorResponse - http status: %d, error response: %+v", httpError, errorResponseDetails)
+
+       writer.Header().Set("Content-Type", "application/json")
+       writer.WriteHeader(httpError)
+       _, err = writer.Write(errorResponse)
+
+       if err != nil {
+               c.logger.Errorf("#E2TController.handleErrorResponse - Cannot send response. writer:%v", writer)
+       }
+}
+
+func (c *E2TController) prettifyRequest(request *http.Request) string {
+       dump, _ := httputil.DumpRequest(request, true)
+       requestPrettyPrint := strings.Replace(string(dump), "\r\n", " ", -1)
+       return strings.Replace(requestPrettyPrint, "\n", "", -1)
+}
index a8afc33..ed5cf66 100644 (file)
@@ -173,7 +173,7 @@ func (c *NodebController) handleRequest(writer http.ResponseWriter, header *http
 
        c.logger.Infof("[E2 Manager -> Client] #NodebController.handleRequest - response: %s", result)
        writer.Header().Set("Content-Type", "application/json")
-       writer.Write([]byte(result))
+       writer.Write(result)
 }
 
 func (c *NodebController) validateRequestHeader(header *http.Header) error {
diff --git a/E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler.go b/E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler.go
new file mode 100644 (file)
index 0000000..fd20bdf
--- /dev/null
@@ -0,0 +1,54 @@
+//
+// 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.
+//
+
+package httpmsghandlers
+
+import (
+       "e2mgr/logger"
+       "e2mgr/managers"
+       "e2mgr/models"
+)
+
+type GetE2TInstancesRequestHandler struct {
+       e2tInstancesManager managers.IE2TInstancesManager
+       logger              *logger.Logger
+}
+
+func NewGetE2TInstancesRequestHandler(logger *logger.Logger, e2tInstancesManager managers.IE2TInstancesManager) *GetE2TInstancesRequestHandler {
+       return &GetE2TInstancesRequestHandler{
+               logger:              logger,
+               e2tInstancesManager: e2tInstancesManager,
+       }
+}
+
+func (h *GetE2TInstancesRequestHandler) Handle(request models.Request) (models.IResponse, error) {
+
+       e2tInstances, err := h.e2tInstancesManager.GetE2TInstances()
+
+       if err != nil {
+               h.logger.Errorf("#GetE2TInstancesRequestHandler.Handle - Error fetching E2T instances from rNib: %s", err)
+               return nil, err
+       }
+
+       mapped := make([]*models.E2TInstanceResponseModel, len(e2tInstances))
+
+       for i, v := range e2tInstances {
+               mapped[i] = models.NewE2TInstanceResponseModel(v.Address, v.AssociatedRanList)
+       }
+
+       return models.E2TInstancesResponse(mapped), nil
+}
diff --git a/E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/get_e2t_instances_request_handler_test.go
new file mode 100644 (file)
index 0000000..b4ee6b4
--- /dev/null
@@ -0,0 +1,75 @@
+//
+// 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.
+//
+
+package httpmsghandlers
+
+import (
+       "e2mgr/configuration"
+       "e2mgr/managers"
+       "e2mgr/mocks"
+       "e2mgr/models"
+       "e2mgr/services"
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "github.com/pkg/errors"
+       "github.com/stretchr/testify/assert"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
+       "testing"
+)
+
+const E2TAddress2 = "10.0.2.15:3213"
+
+func setupGetE2TInstancesListRequestHandlerTest(t *testing.T) (*GetE2TInstancesRequestHandler, *mocks.RnibReaderMock) {
+       log := initLog(t)
+       config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
+       readerMock := &mocks.RnibReaderMock{}
+       rnibDataService := services.NewRnibDataService(log, config, readerMock, nil)
+       e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log)
+       handler := NewGetE2TInstancesRequestHandler(log, e2tInstancesManager)
+       return handler, readerMock
+}
+
+func TestGetE2TInstancesFailure(t *testing.T) {
+       handler, rnibReaderMock := setupGetE2TInstancesListRequestHandlerTest(t)
+       rnibReaderMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(errors.New("error")))
+       _, err := handler.Handle(nil)
+       assert.NotNil(t, err)
+}
+
+func TestGetE2TInstancesNoInstances(t *testing.T) {
+       handler, rnibReaderMock := setupGetE2TInstancesListRequestHandlerTest(t)
+       rnibReaderMock.On("GetE2TAddresses").Return([]string{}, nil)
+       resp, err := handler.Handle(nil)
+       assert.Nil(t, err)
+       assert.IsType(t, models.E2TInstancesResponse{}, resp)
+       assert.Len(t, resp, 0)
+}
+
+func TestGetE2TInstancesSuccess(t *testing.T) {
+       handler, rnibReaderMock := setupGetE2TInstancesListRequestHandlerTest(t)
+
+       e2tAddresses := []string{E2TAddress, E2TAddress2}
+       rnibReaderMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
+       e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"test1", "test2"}}
+       e2tInstance2 := entities.E2TInstance{Address: E2TAddress2, AssociatedRanList: []string{"test3", "test4", "test5"}}
+
+       rnibReaderMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{&e2tInstance, &e2tInstance2}, nil)
+       resp, err := handler.Handle(nil)
+       assert.Nil(t, err)
+       assert.IsType(t, models.E2TInstancesResponse{}, resp)
+       assert.Len(t, resp, 2)
+}
index 741018f..58fa417 100644 (file)
@@ -25,10 +25,10 @@ import (
        "net/http"
 )
 
-func Run(log *logger.Logger, port int, controller controllers.IRootController, newController controllers.INodebController) error {
+func Run(log *logger.Logger, port int, rootController controllers.IRootController, nodebController controllers.INodebController, e2tController controllers.IE2TController) error {
 
        router := mux.NewRouter();
-       initializeRoutes(router, controller, newController)
+       initializeRoutes(router, rootController, nodebController, e2tController)
 
        addr := fmt.Sprintf(":%d", port)
 
@@ -38,7 +38,7 @@ func Run(log *logger.Logger, port int, controller controllers.IRootController, n
        return err
 }
 
-func initializeRoutes(router *mux.Router, rootController controllers.IRootController, nodebController controllers.INodebController) {
+func initializeRoutes(router *mux.Router, rootController controllers.IRootController, nodebController controllers.INodebController, e2tController controllers.IE2TController) {
        r := router.PathPrefix("/v1").Subrouter()
        r.HandleFunc("/health", rootController.HandleHealthCheckRequest).Methods("GET")
 
@@ -49,4 +49,7 @@ func initializeRoutes(router *mux.Router, rootController controllers.IRootContro
        rr.HandleFunc("/{ranName}/reset", nodebController.X2Reset).Methods("PUT")
        rr.HandleFunc("/x2-setup", nodebController.X2Setup).Methods("POST")
        rr.HandleFunc("/endc-setup", nodebController.EndcSetup).Methods("POST")
+
+       rrr := r.PathPrefix("/e2t").Subrouter()
+       rrr.HandleFunc("/list", e2tController.GetE2TInstances).Methods("GET")
 }
index 059e017..13d1665 100644 (file)
@@ -28,29 +28,29 @@ import (
        "time"
 )
 
-func setupRouterAndMocks() (*mux.Router, *mocks.ControllerMock, *mocks.NodebControllerMock) {
-       controllerMock := &mocks.ControllerMock{}
-       controllerMock.On("Shutdown").Return(nil)
-       controllerMock.On("X2Reset").Return(nil)
-       controllerMock.On("X2Setup").Return(nil)
-       controllerMock.On("EndcSetup").Return(nil)
-       controllerMock.On("GetNodeb").Return(nil)
-       controllerMock.On("GetNodebIdList").Return(nil)
-
-
+func setupRouterAndMocks() (*mux.Router, *mocks.RootControllerMock, *mocks.NodebControllerMock, *mocks.E2TControllerMock) {
+       rootControllerMock := &mocks.RootControllerMock{}
+       rootControllerMock.On("HandleHealthCheckRequest").Return(nil)
 
        nodebControllerMock := &mocks.NodebControllerMock{}
+       nodebControllerMock.On("Shutdown").Return(nil)
+       nodebControllerMock.On("X2Reset").Return(nil)
+       nodebControllerMock.On("X2Setup").Return(nil)
+       nodebControllerMock.On("EndcSetup").Return(nil)
+       nodebControllerMock.On("GetNodeb").Return(nil)
        nodebControllerMock.On("GetNodebIdList").Return(nil)
-       nodebControllerMock.On("GetNodeb").Return(nil) // TODO: remove
-       nodebControllerMock.On("HandleHealthCheckRequest").Return(nil)
+
+       e2tControllerMock := &mocks.E2TControllerMock{}
+
+       e2tControllerMock.On("GetE2TInstances").Return(nil)
 
        router := mux.NewRouter()
-       initializeRoutes(router, nodebControllerMock, controllerMock)
-       return router, controllerMock, nodebControllerMock
+       initializeRoutes(router, rootControllerMock, nodebControllerMock, e2tControllerMock)
+       return router, rootControllerMock, nodebControllerMock, e2tControllerMock
 }
 
 func TestRoutePostEndcSetup(t *testing.T) {
-       router, controllerMock, _ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("POST", "/v1/nodeb/endc-setup", nil)
        if err != nil {
@@ -59,11 +59,11 @@ func TestRoutePostEndcSetup(t *testing.T) {
        rr := httptest.NewRecorder()
        router.ServeHTTP(rr, req)
 
-       controllerMock.AssertNumberOfCalls(t,"EndcSetup", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "EndcSetup", 1)
 }
 
 func TestRoutePostX2Setup(t *testing.T) {
-       router, controllerMock, _ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("POST", "/v1/nodeb/x2-setup", nil)
        if err != nil {
@@ -72,11 +72,11 @@ func TestRoutePostX2Setup(t *testing.T) {
        rr := httptest.NewRecorder()
        router.ServeHTTP(rr, req)
 
-       controllerMock.AssertNumberOfCalls(t,"X2Setup", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "X2Setup", 1)
 }
 
 func TestRouteGetNodebIds(t *testing.T) {
-       router, controllerMock, _ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("GET", "/v1/nodeb/ids", nil)
        if err != nil {
@@ -85,11 +85,11 @@ func TestRouteGetNodebIds(t *testing.T) {
        rr := httptest.NewRecorder()
        router.ServeHTTP(rr, req)
 
-       controllerMock.AssertNumberOfCalls(t, "GetNodebIdList", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "GetNodebIdList", 1)
 }
 
 func TestRouteGetNodebRanName(t *testing.T) {
-       router, controllerMock,_ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("GET", "/v1/nodeb/ran1", nil)
        if err != nil {
@@ -100,11 +100,11 @@ func TestRouteGetNodebRanName(t *testing.T) {
 
        assert.Equal(t, http.StatusOK, rr.Code, "handler returned wrong status code")
        assert.Equal(t, "ran1", rr.Body.String(), "handler returned wrong body")
-       controllerMock.AssertNumberOfCalls(t, "GetNodeb", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "GetNodeb", 1)
 }
 
 func TestRouteGetHealth(t *testing.T) {
-       router, _, nodebControllerMock := setupRouterAndMocks()
+       router, rootControllerMock, _, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("GET", "/v1/health", nil)
        if err != nil {
@@ -113,11 +113,11 @@ func TestRouteGetHealth(t *testing.T) {
        rr := httptest.NewRecorder()
        router.ServeHTTP(rr, req)
 
-       nodebControllerMock.AssertNumberOfCalls(t, "HandleHealthCheckRequest", 1)
+       rootControllerMock.AssertNumberOfCalls(t, "HandleHealthCheckRequest", 1)
 }
 
 func TestRoutePutNodebShutdown(t *testing.T) {
-       router, controllerMock, _ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("PUT", "/v1/nodeb/shutdown", nil)
        if err != nil {
@@ -126,11 +126,11 @@ func TestRoutePutNodebShutdown(t *testing.T) {
        rr := httptest.NewRecorder()
        router.ServeHTTP(rr, req)
 
-       controllerMock.AssertNumberOfCalls(t, "Shutdown", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "Shutdown", 1)
 }
 
 func TestRoutePutNodebResetRanName(t *testing.T) {
-       router, controllerMock, _ := setupRouterAndMocks()
+       router, _, nodebControllerMock, _ := setupRouterAndMocks()
 
        req, err := http.NewRequest("PUT", "/v1/nodeb/ran1/reset", nil)
        if err != nil {
@@ -141,11 +141,11 @@ func TestRoutePutNodebResetRanName(t *testing.T) {
 
        assert.Equal(t, http.StatusOK, rr.Code, "handler returned wrong status code")
        assert.Equal(t, "ran1", rr.Body.String(), "handler returned wrong body")
-       controllerMock.AssertNumberOfCalls(t, "X2Reset", 1)
+       nodebControllerMock.AssertNumberOfCalls(t, "X2Reset", 1)
 }
 
 func TestRouteNotFound(t *testing.T) {
-       router, _, _ := setupRouterAndMocks()
+       router, _, _,_ := setupRouterAndMocks()
 
        req, err := http.NewRequest("GET", "/v1/no/such/route", nil)
        if err != nil {
@@ -159,14 +159,14 @@ func TestRouteNotFound(t *testing.T) {
 
 func TestRunError(t *testing.T) {
        log := initLog(t)
-       err := Run(log, 1234567, &mocks.NodebControllerMock{}, &mocks.ControllerMock{})
+       err := Run(log, 1234567, &mocks.RootControllerMock{}, &mocks.NodebControllerMock{}, &mocks.E2TControllerMock{})
        assert.NotNil(t, err)
 }
 
 func TestRun(t *testing.T) {
        log := initLog(t)
-       _, controllerMock, nodebControllerMock := setupRouterAndMocks()
-       go Run(log,11223, nodebControllerMock, controllerMock)
+       _, rootControllerMock, nodebControllerMock, e2tControllerMock := setupRouterAndMocks()
+       go Run(log, 11223, rootControllerMock, nodebControllerMock, e2tControllerMock)
 
        time.Sleep(time.Millisecond * 100)
        resp, err := http.Get("http://localhost:11223/v1/health")
@@ -182,4 +182,4 @@ func initLog(t *testing.T) *logger.Logger {
                t.Errorf("#initLog test - failed to initialize logger, error: %s", err)
        }
        return log
-}
\ No newline at end of file
+}
index 1873473..74f6a51 100644 (file)
@@ -79,8 +79,10 @@ func (m *E2TInstancesManager) GetE2TInstancesNoLogs() ([]*entities.E2TInstance,
 
                if !ok {
                        m.logger.Errorf("#E2TInstancesManager.GetE2TInstancesNoLogs - Failed retrieving E2T addresses. error: %s", err)
+                       return nil, e2managererrors.NewRnibDbError()
                }
-               return nil, err
+
+               return []*entities.E2TInstance{}, nil
        }
 
        if len(e2tAddresses) == 0 {
@@ -105,8 +107,16 @@ func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error)
        e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
 
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T addresses. error: %s", err)
-               return nil, err
+
+               _, ok := err.(*common.ResourceNotFoundError)
+
+               if !ok {
+                       m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T addresses. error: %s", err)
+                       return nil, e2managererrors.NewRnibDbError()
+               }
+
+               m.logger.Infof("#E2TInstancesManager.GetE2TInstances - Empty E2T addresses list")
+               return []*entities.E2TInstance{}, nil
        }
 
        if len(e2tAddresses) == 0 {
@@ -118,7 +128,7 @@ func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error)
 
        if err != nil {
                m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T instances list. error: %s", err)
-               return e2tInstances, err
+               return e2tInstances, e2managererrors.NewRnibDbError()
        }
 
        if len(e2tInstances) == 0 {
@@ -255,7 +265,7 @@ func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
        e2tInstances, err := m.GetE2TInstances()
 
        if err != nil {
-               return "", e2managererrors.NewRnibDbError()
+               return "", err
        }
 
        if len(e2tInstances) == 0 {
diff --git a/E2Manager/mocks/controllerMock.go b/E2Manager/mocks/controllerMock.go
deleted file mode 100644 (file)
index 7575f72..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-package mocks
-
-import (
-       "github.com/gorilla/mux"
-       "github.com/stretchr/testify/mock"
-       "net/http"
-)
-
-type ControllerMock struct {
-       mock.Mock
-}
-
-func (c *ControllerMock) GetNodeb(writer http.ResponseWriter, r *http.Request){
-               writer.Header().Set("Content-Type", "application/json")
-               writer.WriteHeader(http.StatusOK)
-
-               vars := mux.Vars(r)
-               ranName := vars["ranName"]
-
-               writer.Write([]byte(ranName))
-
-               c.Called()
-}
-
-func (c *ControllerMock) GetNodebIdList(writer http.ResponseWriter, r *http.Request){
-       c.Called()
-}
-
-
-func (c *ControllerMock) Shutdown(writer http.ResponseWriter, r *http.Request){
-       c.Called()
-}
-
-func (c *ControllerMock) X2Reset(writer http.ResponseWriter, r *http.Request){
-       writer.Header().Set("Content-Type", "application/json")
-       writer.WriteHeader(http.StatusOK)
-
-       vars := mux.Vars(r)
-       ranName := vars["ranName"]
-
-       writer.Write([]byte(ranName))
-
-       c.Called()
-}
-
-func (c *ControllerMock) X2Setup(writer http.ResponseWriter, r *http.Request){
-       writer.Header().Set("Content-Type", "application/json")
-       writer.WriteHeader(http.StatusOK)
-
-       c.Called()
-}
-
-func (c *ControllerMock) EndcSetup(writer http.ResponseWriter, r *http.Request){
-       writer.Header().Set("Content-Type", "application/json")
-       writer.WriteHeader(http.StatusOK)
-
-       c.Called()
-}
\ No newline at end of file
diff --git a/E2Manager/mocks/e2t_controller_mock.go b/E2Manager/mocks/e2t_controller_mock.go
new file mode 100644 (file)
index 0000000..d72c292
--- /dev/null
@@ -0,0 +1,35 @@
+//
+// 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.
+//
+
+package mocks
+
+import (
+       "github.com/stretchr/testify/mock"
+       "net/http"
+)
+
+type E2TControllerMock struct {
+       mock.Mock
+}
+
+func (m *E2TControllerMock) HandleRequest(writer http.ResponseWriter, request *http.Request) {
+       m.Called()
+}
+
+func (m *E2TControllerMock) GetE2TInstances(writer http.ResponseWriter, request *http.Request) {
+       m.Called()
+}
diff --git a/E2Manager/mocks/nodebControllerMock.go b/E2Manager/mocks/nodebControllerMock.go
deleted file mode 100644 (file)
index 51b5bf0..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-package mocks
-
-import (
-       "github.com/gorilla/mux"
-       "github.com/stretchr/testify/mock"
-       "net/http"
-)
-
-type NodebControllerMock struct {
-       mock.Mock
-}
-
-func (rc *NodebControllerMock) HandleRequest(writer http.ResponseWriter, request *http.Request) {
-       rc.Called()
-}
-
-func (rc *NodebControllerMock) GetNodebIdList (writer http.ResponseWriter, request *http.Request) {
-       rc.Called()
-}
-
-func (rc *NodebControllerMock) GetNodeb(writer http.ResponseWriter, request *http.Request) {
-       writer.Header().Set("Content-Type", "application/json")
-       writer.WriteHeader(http.StatusOK)
-
-       vars := mux.Vars(request)
-       ranName := vars["ranName"]
-
-       writer.Write([]byte(ranName))
-
-       rc.Called()
-}
-
-func (rc *NodebControllerMock) HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request) {
-       rc.Called()
-}
diff --git a/E2Manager/mocks/nodeb_controller_mock.go b/E2Manager/mocks/nodeb_controller_mock.go
new file mode 100644 (file)
index 0000000..eafc935
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// 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.
+//
+
+package mocks
+
+import (
+       "github.com/gorilla/mux"
+       "github.com/stretchr/testify/mock"
+       "net/http"
+)
+
+type NodebControllerMock struct {
+       mock.Mock
+}
+
+func (c *NodebControllerMock) GetNodeb(writer http.ResponseWriter, r *http.Request) {
+       writer.Header().Set("Content-Type", "application/json")
+       writer.WriteHeader(http.StatusOK)
+
+       vars := mux.Vars(r)
+       ranName := vars["ranName"]
+
+       writer.Write([]byte(ranName))
+       c.Called()
+}
+
+func (c *NodebControllerMock) GetNodebIdList(writer http.ResponseWriter, r *http.Request) {
+       c.Called()
+}
+
+func (c *NodebControllerMock) Shutdown(writer http.ResponseWriter, r *http.Request) {
+       c.Called()
+}
+
+func (c *NodebControllerMock) X2Reset(writer http.ResponseWriter, r *http.Request) {
+       writer.Header().Set("Content-Type", "application/json")
+       writer.WriteHeader(http.StatusOK)
+
+       vars := mux.Vars(r)
+       ranName := vars["ranName"]
+
+       writer.Write([]byte(ranName))
+
+       c.Called()
+}
+
+func (c *NodebControllerMock) X2Setup(writer http.ResponseWriter, r *http.Request) {
+       writer.Header().Set("Content-Type", "application/json")
+       writer.WriteHeader(http.StatusOK)
+
+       c.Called()
+}
+
+func (c *NodebControllerMock) EndcSetup(writer http.ResponseWriter, r *http.Request) {
+       writer.Header().Set("Content-Type", "application/json")
+       writer.WriteHeader(http.StatusOK)
+
+       c.Called()
+}
diff --git a/E2Manager/mocks/root_controller_mock.go b/E2Manager/mocks/root_controller_mock.go
new file mode 100644 (file)
index 0000000..df58b61
--- /dev/null
@@ -0,0 +1,31 @@
+//
+// 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.
+//
+
+package mocks
+
+import (
+       "github.com/stretchr/testify/mock"
+       "net/http"
+)
+
+type RootControllerMock struct {
+       mock.Mock
+}
+
+func (rc *RootControllerMock) HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request) {
+       rc.Called()
+}
diff --git a/E2Manager/models/get_e2t_instances_response.go b/E2Manager/models/get_e2t_instances_response.go
new file mode 100644 (file)
index 0000000..f39c1ff
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// 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.
+//
+
+package models
+
+import (
+       "e2mgr/e2managererrors"
+       "encoding/json"
+)
+
+type E2TInstancesResponse []*E2TInstanceResponseModel
+
+type E2TInstanceResponseModel struct {
+       E2TAddress string   `json:"e2tAddress"`
+       RanNames   []string `json:"ranNames"`
+}
+
+func NewE2TInstanceResponseModel(e2tAddress string, ranNames []string) *E2TInstanceResponseModel {
+       return &E2TInstanceResponseModel{
+               E2TAddress: e2tAddress,
+               RanNames:   ranNames,
+       }
+}
+
+func (response E2TInstancesResponse) Marshal() ([]byte, error) {
+
+       data, err := json.Marshal(response)
+
+       if err != nil {
+               return nil, e2managererrors.NewInternalError()
+       }
+
+       return data, nil
+
+}
index 03f095d..b9780df 100644 (file)
@@ -33,13 +33,13 @@ func NewGetNodebIdListResponse(nodebIdList []*entities.NbIdentity) *GetNodebIdLi
        }
 }
 
-func (response *GetNodebIdListResponse) Marshal() (string, error) {
+func (response *GetNodebIdListResponse) Marshal() ([]byte, error) {
        pmList := utils.ConvertNodebIdListToProtoMessageList(response.nodebIdList)
        result, err := utils.MarshalProtoMessageListToJsonArray(pmList)
 
        if err != nil {
-               return "", e2managererrors.NewInternalError();
+               return nil, e2managererrors.NewInternalError();
        }
 
-       return result, nil
+       return []byte(result), nil
 }
index 9c2bd8a..f1896a9 100644 (file)
@@ -33,14 +33,14 @@ func NewGetNodebResponse(nodebInfo *entities.NodebInfo) *GetNodebResponse {
        }
 }
 
-func (response *GetNodebResponse) Marshal() (string, error) {
+func (response *GetNodebResponse) Marshal() ([]byte, error) {
        m := jsonpb.Marshaler{}
        result, err := m.MarshalToString(response.nodebInfo)
 
        if err != nil {
-               return "", e2managererrors.NewInternalError()
+               return nil, e2managererrors.NewInternalError()
        }
 
-       return result, nil
+       return []byte(result), nil
 
 }
index 27423ce..7e7b759 100644 (file)
@@ -18,5 +18,5 @@
 package models
 
 type IResponse interface {
-       Marshal() (string, error)
+       Marshal() ([]byte, error)
 }
index a2221ce..52b55db 100644 (file)
@@ -30,12 +30,13 @@ import (
 type IncomingRequest string
 
 const (
-       ShutdownRequest       IncomingRequest = "Shutdown"
-       ResetRequest          IncomingRequest = "Reset"
-       X2SetupRequest        IncomingRequest = "X2SetupRequest"
-       EndcSetupRequest      IncomingRequest = "EndcSetupRequest"
-       GetNodebRequest       IncomingRequest = "GetNodebRequest"
-       GetNodebIdListRequest IncomingRequest = "GetNodebIdListRequest"
+       ShutdownRequest        IncomingRequest = "Shutdown"
+       ResetRequest           IncomingRequest = "Reset"
+       X2SetupRequest         IncomingRequest = "X2SetupRequest"
+       EndcSetupRequest       IncomingRequest = "EndcSetupRequest"
+       GetNodebRequest        IncomingRequest = "GetNodebRequest"
+       GetNodebIdListRequest  IncomingRequest = "GetNodebIdListRequest"
+       GetE2TInstancesRequest IncomingRequest = "GetE2TInstancesRequest"
 )
 
 type IncomingRequestHandlerProvider struct {
@@ -51,15 +52,16 @@ func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrSender *rmrsend
        }
 }
 
-func initRequestHandlerMap(logger *logger.Logger, rmrSender *rmrsender.RmrSender, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager,e2tInstancesManager managers.IE2TInstancesManager) map[IncomingRequest]httpmsghandlers.RequestHandler {
+func initRequestHandlerMap(logger *logger.Logger, rmrSender *rmrsender.RmrSender, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager, e2tInstancesManager managers.IE2TInstancesManager) map[IncomingRequest]httpmsghandlers.RequestHandler {
 
        return map[IncomingRequest]httpmsghandlers.RequestHandler{
-               ShutdownRequest:  httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrSender, config, rNibDataService), //TODO change to pointer
-               ResetRequest:     httpmsghandlers.NewX2ResetRequestHandler(logger, rmrSender, rNibDataService),
-               X2SetupRequest:   httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, e2tInstancesManager),
-               EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, e2tInstancesManager),
-               GetNodebRequest:  httpmsghandlers.NewGetNodebRequestHandler(logger, rNibDataService),
-               GetNodebIdListRequest: httpmsghandlers.NewGetNodebIdListRequestHandler(logger, rNibDataService),
+               ShutdownRequest:        httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrSender, config, rNibDataService), //TODO change to pointer
+               ResetRequest:           httpmsghandlers.NewX2ResetRequestHandler(logger, rmrSender, rNibDataService),
+               X2SetupRequest:         httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, e2tInstancesManager),
+               EndcSetupRequest:       httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, e2tInstancesManager),
+               GetNodebRequest:        httpmsghandlers.NewGetNodebRequestHandler(logger, rNibDataService),
+               GetNodebIdListRequest:  httpmsghandlers.NewGetNodebIdListRequestHandler(logger, rNibDataService),
+               GetE2TInstancesRequest: httpmsghandlers.NewGetE2TInstancesRequestHandler(logger, e2tInstancesManager),
        }
 }