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}
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
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
*** 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}
*** 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
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
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 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
Suite Setup Prepare Enviorment
Resource ../Resource/resource.robot
Resource ../Resource/Keywords.robot
+Resource red_button_keywords.robot
Library OperatingSystem
Library Collections
Library REST ${url}
*** Variables ***
${stop_docker_e2} docker stop e2adapter
-
-
*** Test Cases ***
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
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
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
--- /dev/null
+##############################################################################
+#
+# 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
+
+
+
+
+
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}
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}
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)
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.")
}
}
if allRansAreShutDown {
+
+ if dissocErr != nil {
+ return models.NewRedButtonPartialSuccessResponseModel("Operation succeeded, except Routing Manager failure"), nil
+ }
+
return nil, nil
}
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) {
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
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)
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)
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)
}
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)
}
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}
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}
// 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}
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}
--- /dev/null
+//
+// 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
+
+}