[RICPLT-2590] RedButton flow changes + Automation 39/2139/1
authoris005q <idan.shalom@intl.att.com>
Thu, 2 Jan 2020 14:23:06 +0000 (16:23 +0200)
committeris005q <idan.shalom@intl.att.com>
Thu, 2 Jan 2020 14:23:09 +0000 (16:23 +0200)
Change-Id: I3109fc7c43576948accdaff29f825a40e9a8d193
Signed-off-by: is005q <idan.shalom@intl.att.com>
14 files changed:
Automation/Tests/ENDC-Setup/ENDC_Setup_request_test.robot
Automation/Tests/RSM_Resource_Status/resource_status_false_start.robot
Automation/Tests/RSM_Resource_Status/resource_status_true_start.robot
Automation/Tests/RedButton/RedButton_CONNECTED.robot
Automation/Tests/RedButton/RedButton_CONNECTED_SHUTDOWN_CONNECTED.robot
Automation/Tests/RedButton/RedButton_CONNECTION_FAILURE.robot
Automation/Tests/RedButton/RedButton_DISCONNECTED.robot
Automation/Tests/RedButton/RedButton_SHUTDOWN_SHUTDOWN.robot
Automation/Tests/RedButton/red_button_keywords.robot [new file with mode: 0644]
Automation/Tests/Resource/Keywords.robot
E2Manager/controllers/nodeb_controller_test.go
E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/models/red_button_partial_success_response.go [new file with mode: 0644]

index 13ef989..3397099 100644 (file)
@@ -40,7 +40,7 @@ Run Endc setup request
 
 Get request gnb
     Sleep    1s
-    Get Request node b enb test2
+    Get Request node b gnb test2
     Integer  response status  200
     String   response body ranName    test2
     String   response body ip    ${ip_e2adapter} 
index e6b969a..cf34c1f 100644 (file)
@@ -40,6 +40,7 @@ Put Http Start Request To RSM
     Integer  response status  204
 
 Verify RSM RAN Info Status Is Start And True In Redis
+    Sleep   1s
     ${result}=   rsmscripts.verify_rsm_ran_info_start_true
     Should Be Equal As Strings  ${result}    True
 
index 21f9217..2e40459 100644 (file)
@@ -38,6 +38,7 @@ Put Http Start Request To RSM
     Integer  response status  204
 
 Verify RSM RAN Info Status Is Start And True In Redis
+    Sleep   1s
     ${result}=   rsmscripts.verify_rsm_ran_info_start_true
     Should Be Equal As Strings  ${result}    True
 
index 9ef7430..ed75f4c 100644 (file)
@@ -22,8 +22,9 @@
 
 *** Settings ***
 Suite Setup   Prepare Enviorment
-Resource   ../Resource/resource.robot
-Resource   ../Resource/Keywords.robot
+Resource    ../Resource/resource.robot
+Resource    ../Resource/Keywords.robot
+Resource    red_button_keywords.robot
 Library     OperatingSystem
 Library     Collections
 Library     REST      ${url}
@@ -31,27 +32,12 @@ Library     REST      ${url}
 
 *** Test Cases ***
 
-Prepare Ran in Connected connectionStatus
-    Post Request setup node b x-2
-    Integer     response status       204
-    Sleep  1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    CONNECTED
+Execute X2 setup, verify nodeb connection status is CONNECTED and it's associated to an e2t instance
+   Execute setup and verify connected and associated
 
+Execute Shutdown
+   Execute Shutdown
 
-Disconnect Ran
-   PUT    /v1/nodeb/shutdown
-   Integer   response status   204
-
-
-
-Verfiy Shutdown ConnectionStatus
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    SHUT_DOWN
-
+Verify nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+   Verify shutdown for enb
 
index 04dee6d..4c9c974 100644 (file)
 Suite Setup   Prepare Enviorment
 Resource   ../Resource/resource.robot
 Resource   ../Resource/Keywords.robot
+Resource    red_button_keywords.robot
 Library     OperatingSystem
 Library     Collections
 Library     REST      ${url}
 
-
-
 *** Test Cases ***
 
-Prepare Ran in Connected connectionStatus
-    Post Request setup node b x-2
-    Integer     response status       204
-    Sleep  1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    CONNECTED
-
-
-Disconnect Ran
-   PUT    /v1/nodeb/shutdown
-   Integer   response status   204
-
-
-
-Verfiy Shutdown ConnectionStatus
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    SHUT_DOWN
-
-Restart simualtor
-    Restart simulator
-
-repare Ran in Connected connectionStatus
-    Post Request setup node b x-2
-    Integer     response status       204
-    Sleep  1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    CONNECTED
-
+Execute X2 setup, verify nodeb connection status is CONNECTED and it's associated to an e2t instance
+   Execute setup and verify connected and associated
 
+Execute Shutdown
+   Execute Shutdown
 
+Verify nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+   Verify shutdown for enb
 
+Restart simulator
+   Restart simulator
 
+Execute second X2 setup, verify nodeb connection status is CONNECTED and it's associated to an e2t instance
+   Execute setup and verify connected and associated
\ No newline at end of file
index 37865e4..0b96a94 100644 (file)
@@ -24,6 +24,7 @@
 Suite Setup   Prepare Enviorment
 Resource   ../Resource/resource.robot
 Resource   ../Resource/Keywords.robot
+Resource    red_button_keywords.robot
 Library     OperatingSystem
 Library    Collections
 Library     REST      ${url}
@@ -31,27 +32,12 @@ Library     REST      ${url}
 
 *** Test Cases ***
 
-Prepare Ran in CONNECTION FAILURE connectionStatus
-    Set Headers     ${header}
-    POST        /v1/nodeb/x2-setup   ${json}
-    Sleep    1s
-    POST        /v1/nodeb/x2-setup   ${json}
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer    response status       200
-    String     response body connectionStatus     CONNECTED_SETUP_FAILED
+Execute X2 setup twice and verify its connection status is CONNECTED_SETUP_FAILED
+    Execute setup twice and verify connected setup failed
 
-Disconnect Ran
-    PUT    /v1/nodeb/shutdown
-    Integer   response status   204
-
-
-
-Verfiy Shutdown ConnectionStatus
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    SHUT_DOWN
+Execute Shutdown
+    Execute Shutdown
 
+Verify nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+   Verify shutdown for enb
 
index 547d14b..1156bd2 100644 (file)
@@ -23,6 +23,7 @@
 Suite Setup   Prepare Enviorment
 Resource   ../Resource/resource.robot
 Resource   ../Resource/Keywords.robot
+Resource    red_button_keywords.robot
 Library     OperatingSystem
 Library    Collections
 Library     REST      ${url}
@@ -30,8 +31,6 @@ Library     REST      ${url}
 *** Variables ***
 ${stop_docker_e2}      docker stop e2adapter
 
-
-
 *** Test Cases ***
 
 Pre Condition for Connecting - no E2ADAPTER
@@ -39,7 +38,6 @@ Pre Condition for Connecting - no E2ADAPTER
     ${result}=  Run And Return Rc And Output     ${docker_command}
     Should Be Equal As Integers    ${result[1]}    ${docker_number-1}
 
-
 Prepare Ran in Connecting connectionStatus
     Post Request setup node b endc-setup
     Integer     response status       204
@@ -49,16 +47,8 @@ Prepare Ran in Connecting connectionStatus
     String   response body ranName    test2
     String   response body connectionStatus    DISCONNECTED
 
-Disconnect Ran
-    PUT    /v1/nodeb/shutdown
-    Integer   response status   204
-
-
-
-Verfiy Shutdown ConnectionStatus
-    Sleep    1s
-    GET      /v1/nodeb/test2
-    Integer  response status  200
-    String   response body ranName    test2
-    String   response body connectionStatus    SHUT_DOWN
+Execute Shutdown
+    Execute Shutdown
 
+Verify nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+    Verify shutdown for gnb
\ No newline at end of file
index b498646..f97e384 100644 (file)
 Suite Setup   Prepare Enviorment
 Resource   ../Resource/resource.robot
 Resource   ../Resource/Keywords.robot
+Resource    red_button_keywords.robot
 Library     OperatingSystem
 Library    Collections
 Library     REST      ${url}
 
-
 *** Test Cases ***
 
-Prepare Ran in Connected connectionStatus
-    Post Request setup node b x-2
-    Integer     response status       204
-    Sleep  1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    CONNECTED
-
-Disconnect Ran
-   PUT    /v1/nodeb/shutdown
-   Integer   response status   204
-
-Verfiy Shutdown ConnectionStatus
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    SHUT_DOWN
+Execute X2 setup, verify nodeb connection status is CONNECTED and it's associated to an e2t instance
+   Execute setup and verify connected and associated
 
-Disconnect Ran on shutdown Status
-   PUT    /v1/nodeb/shutdown
-   Integer   response status   204
+Execute Shutdown
+   Execute Shutdown
 
-Verfiy Shutdown ConnectionStatus second time
-    Sleep    1s
-    GET      /v1/nodeb/test1
-    Integer  response status  200
-    String   response body ranName    test1
-    String   response body connectionStatus    SHUT_DOWN
+Verify nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+   Verify shutdown for enb
 
+Execute second Shutdown
+   Execute Shutdown
 
+Verify again nodeb's connection status is SHUT_DOWN and it's NOT associated to an e2t instance
+   Verify shutdown for enb
\ No newline at end of file
diff --git a/Automation/Tests/RedButton/red_button_keywords.robot b/Automation/Tests/RedButton/red_button_keywords.robot
new file mode 100644 (file)
index 0000000..34bd6ef
--- /dev/null
@@ -0,0 +1,73 @@
+##############################################################################
+#
+#   Copyright (c) 2019 AT&T Intellectual Property.
+#
+#   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.
+#
+##############################################################################
+
+*** Settings ***
+Documentation   Keywords file
+Resource    ../Resource/resource.robot
+Resource    ../Resource/Keywords.robot
+Library     ../Scripts/e2mdbscripts.py
+Library    Collections
+Library    OperatingSystem
+Library    json
+Library    REST      ${url}
+
+*** Keywords ***
+Execute setup and verify connected and associated
+    Post Request setup node b x-2
+    Integer  response status       204
+    Get Request node b enb test1
+    Integer  response status  200
+    String   response body ranName    test1
+    String   response body connectionStatus    CONNECTED
+    String   response body associatedE2tInstanceAddress     e2t.att.com:38000
+
+Execute setup twice and verify connected setup failed
+    Post Request setup node b x-2
+    Sleep    1s
+    Post Request setup node b x-2
+    Get Request node b enb test1
+    String     response body connectionStatus     CONNECTED_SETUP_FAILED
+
+
+Verify shutdown for enb
+    Get Request node b enb test1
+    Integer  response status  200
+    String   response body ranName    test1
+    String   response body connectionStatus    SHUT_DOWN
+    Missing  response body associatedE2tInstanceAddress
+    ${result}    e2mdbscripts.verify_ran_is_associated_with_e2t_instance     test1    e2t.att.com:38000
+    Should Be True    ${result} == False
+
+
+Verify shutdown for gnb
+    Get Request node b gnb test2
+    Integer  response status  200
+    String   response body ranName    test2
+    String   response body connectionStatus    SHUT_DOWN
+    Missing  response body associatedE2tInstanceAddress
+    ${result}    e2mdbscripts.verify_ran_is_associated_with_e2t_instance     test2    e2t.att.com:38000
+    Should Be True    ${result} == False
+
+Execute Shutdown
+   PUT       /v1/nodeb/shutdown
+   Integer   response status   204
+
+
+
+
+
index 0f24653..1022890 100644 (file)
@@ -26,21 +26,15 @@ Library     ../Scripts/cleanup_db.py
 Resource   ../Resource/resource.robot
 Library     OperatingSystem
 
-
-
-
-
 *** Keywords ***
 Post Request setup node b x-2
     Set Headers     ${header}
     POST        /v1/nodeb/x2-setup    ${json}
 
-
 Put Request Resource Status Start
     Set Headers     ${header}
     PUT        /v1/general/resourcestatus  ${resource_status_start_json}
 
-
 Put Request Resource Status Stop
     Set Headers     ${header}
     PUT        /v1/general/resourcestatus  ${resource_status_stop_json}
@@ -49,12 +43,10 @@ Get Request node b enb test1
     Sleep    1s
     GET      /v1/nodeb/test1
 
-
-Get Request node b enb test2
+Get Request node b gnb test2
     Sleep    1s
     GET      /v1/nodeb/test2
 
-
 Remove log files
     Remove File  ${EXECDIR}/${gnb_log_filename}
     Remove File  ${EXECDIR}/${e2mgr_log_filename}
index 726e8c3..88983f4 100644 (file)
@@ -345,6 +345,19 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) {
        assert.Equal(t, errorResponse.Message, err.Message)
 }
 
+func TestHandleRoutingManagerError(t *testing.T) {
+       controller, _, _, _, _ := setupControllerTest(t)
+       writer := httptest.NewRecorder()
+       err := e2managererrors.NewRoutingManagerError()
+
+       controller.handleErrorResponse(err, writer)
+       var errorResponse = parseJsonRequest(t, writer.Body)
+
+       assert.Equal(t, http.StatusServiceUnavailable, writer.Result().StatusCode)
+       assert.Equal(t, errorResponse.Code, err.Code)
+       assert.Equal(t, errorResponse.Message, err.Message)
+}
+
 func TestHandleE2TInstanceAbsenceError(t *testing.T) {
        controller, _, _, _, _ := setupControllerTest(t)
 
index 7edc13c..869890a 100644 (file)
@@ -67,9 +67,9 @@ func (h *DeleteAllRequestHandler) Handle(request models.Request) (models.IRespon
                return nil, err
        }
 
-       err = h.rmClient.DissociateAllRans(e2tAddresses)
+       dissocErr := h.rmClient.DissociateAllRans(e2tAddresses)
 
-       if err != nil {
+       if dissocErr != nil {
                h.logger.Warnf("#DeleteAllRequestHandler.Handle - routing manager failure. continue flow.")
        }
 
@@ -95,6 +95,11 @@ func (h *DeleteAllRequestHandler) Handle(request models.Request) (models.IRespon
        }
 
        if allRansAreShutDown {
+
+               if dissocErr != nil {
+                       return models.NewRedButtonPartialSuccessResponseModel("Operation succeeded, except Routing Manager failure"), nil
+               }
+
                return nil, nil
        }
 
@@ -102,7 +107,16 @@ func (h *DeleteAllRequestHandler) Handle(request models.Request) (models.IRespon
        h.logger.Infof("#DeleteAllRequestHandler.Handle - timer expired")
 
        err, _ = h.updateNodebs(h.updateNodebInfoShutDown)
-       return nil, err
+
+       if err != nil {
+               return nil, err
+       }
+
+       if dissocErr != nil {
+               return models.NewRedButtonPartialSuccessResponseModel("Operation succeeded, except Routing Manager failure"), nil
+       }
+
+       return nil, nil
 }
 
 func (h *DeleteAllRequestHandler) updateNodebs(updateCb func(node *entities.NodebInfo) error) (error, bool) {
@@ -120,14 +134,18 @@ func (h *DeleteAllRequestHandler) updateNodebs(updateCb func(node *entities.Node
 
                if err != nil {
                        h.logger.Errorf("#DeleteAllRequestHandler.updateNodebs - failed to get nodeB entity for ran name: %s from rNib. error: %s", nbIdentity.InventoryName, err)
-                       continue
+                       return e2managererrors.NewRnibDbError(), false
                }
 
                if node.ConnectionStatus != entities.ConnectionStatus_SHUT_DOWN {
                        allRansAreShutdown = false
                }
 
-               _ = updateCb(node)
+               err = updateCb(node)
+
+               if err != nil {
+                       return err, false
+               }
        }
 
        return nil, allRansAreShutdown
@@ -169,8 +187,8 @@ func (h *DeleteAllRequestHandler) updateNodebInfo(node *entities.NodebInfo, conn
        err := h.rnibDataService.UpdateNodebInfo(node)
 
        if err != nil {
-               h.logger.Errorf("#DeleteAllRequestHandler.updateNodebInfo - RAN name: %s - failed saving nodeB entity to rNib. error: %s", node.RanName, err)
-               return err
+               h.logger.Errorf("#DeleteAllRequestHandler.updateNodebInfo - RAN name: %s - failed updating nodeB entity in rNib. error: %s", node.RanName, err)
+               return e2managererrors.NewRnibDbError()
        }
 
        h.logger.Infof("#DeleteAllRequestHandler.updateNodebInfo - RAN name: %s, connection status: %s", node.RanName, connectionStatus)
index 5332bd9..9b8731c 100644 (file)
@@ -90,7 +90,7 @@ func mockHttpClientDissociateAllRans(httpClientMock *mocks.HttpClientMock, e2tAd
 
 func TestGetE2TAddressesFailure(t *testing.T) {
        h, readerMock, _, _, _ := setupDeleteAllRequestHandlerTest(t)
-       readerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError())
+       readerMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(errors.New("error")))
        _, err := h.Handle(nil)
        assert.IsType(t, &e2managererrors.RnibDbError{}, err)
        readerMock.AssertExpectations(t)
@@ -123,7 +123,7 @@ func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
        var nb2 *entities.NodebInfo
        readerMock.On("GetNodeb", "RanName_2").Return(nb2, common.NewInternalError(errors.New("error")))
        _, err := h.Handle(nil)
-       assert.Nil(t, err)
+       assert.IsType(t,&e2managererrors.RnibDbError{}, err)
        writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
        readerMock.AssertExpectations(t)
 }
@@ -144,7 +144,7 @@ func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T)
        updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
        writerMock.On("UpdateNodebInfo", updatedNb2).Return(common.NewInternalError(errors.New("error")))
        _, err := h.Handle(nil)
-       assert.Nil(t, err)
+       assert.IsType(t,&e2managererrors.RnibDbError{}, err)
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
 }
@@ -223,11 +223,11 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
        writerMock.AssertExpectations(t)
 }
 
-func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T) {
+func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t *testing.T, partial bool) {
        h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
        e2tAddresses := []string{E2TAddress}
        readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
-       mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
+       mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
        nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}}
        readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
        nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
@@ -244,13 +244,28 @@ func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdow
        rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
        mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
-       _, err := h.Handle(nil)
+       resp, err := h.Handle(nil)
        assert.Nil(t, err)
+
+       if partial {
+               assert.IsType(t, &models.RedButtonPartialSuccessResponseModel{}, resp)
+       } else {
+               assert.Nil(t, resp)
+       }
+
        rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
 }
 
+func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownSuccess(t *testing.T) {
+       testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, false)
+}
+
+func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdownPartialSuccess(t *testing.T) {
+       testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdown(t, true)
+}
+
 //func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsAlreadyShutdown(t *testing.T) {
 //     h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
 //     e2tAddresses := []string{E2TAddress}
@@ -285,11 +300,45 @@ func TestTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdow
 //     writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
 //}
 
-func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t *testing.T) {
+//func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownUpdateFailure(t *testing.T) {
+//     h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
+//     e2tAddresses := []string{E2TAddress}
+//     readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
+//     mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
+//     nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
+//     readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
+//     //nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
+//     //readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+//     updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
+//     writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil)
+//     readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
+//     e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}}
+//     readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance}, nil)
+//     updatedE2tInstance := e2tInstance
+//     updatedE2tInstance.AssociatedRanList = []string{}
+//     writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
+//
+//     rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
+//     mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+//     rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
+//
+//     readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
+//     readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil)
+//     updatedNb2 := *updatedNb1
+//     updatedNb2.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
+//     writerMock.On("UpdateNodebInfo", &updatedNb2).Return(common.NewInternalError(errors.New("error")))
+//     _, err := h.Handle(nil)
+//     assert.IsType(t,&e2managererrors.RnibDbError{}, err)
+//     rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true)
+//     readerMock.AssertExpectations(t)
+//     writerMock.AssertExpectations(t)
+//}
+
+func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t *testing.T, partial bool) {
        h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
        e2tAddresses := []string{E2TAddress}
        readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil)
-       mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true)
+       mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial)
        nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
        readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
        //nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress}
@@ -319,6 +368,14 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin
        writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
 }
 
+func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownSuccess (t *testing.T) {
+       testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, false)
+}
+
+func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDownPartialSuccess (t *testing.T) {
+       testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttingDown(t, true)
+}
+
 func TestSuccessTwoE2TInstancesSixRans(t *testing.T) {
        h, readerMock, writerMock, rmrMessengerMock, httpClientMock := setupDeleteAllRequestHandlerTest(t)
        e2tAddresses := []string{E2TAddress, E2TAddress2}
diff --git a/E2Manager/models/red_button_partial_success_response.go b/E2Manager/models/red_button_partial_success_response.go
new file mode 100644 (file)
index 0000000..115bcef
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// 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 (
+       "e2mgr/e2managererrors"
+       "encoding/json"
+)
+
+type RedButtonPartialSuccessResponseModel struct {
+       Message string   `json:"message"`
+}
+
+func NewRedButtonPartialSuccessResponseModel(message string) *RedButtonPartialSuccessResponseModel {
+       return &RedButtonPartialSuccessResponseModel{
+               Message: message,
+       }
+}
+
+func (response RedButtonPartialSuccessResponseModel) Marshal() ([]byte, error) {
+
+       data, err := json.Marshal(response)
+
+       if err != nil {
+               return nil, e2managererrors.NewInternalError()
+       }
+
+       return data, nil
+
+}