1 package org.onap.sdnc.northbound;
 
   3 import static org.junit.Assert.assertEquals;
 
   4 import static org.mockito.Mockito.mock;
 
   5 import static org.mockito.Mockito.when;
 
   6 import static org.onap.sdnc.northbound.GenericResourceApiProvider.APP_NAME;
 
   7 import static org.onap.sdnc.northbound.GenericResourceApiProvider.INVALID_INPUT_ERROR_MESSAGE;
 
   8 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NO_SERVICE_LOGIC_ACTIVE;
 
   9 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM;
 
  10 import static org.onap.sdnc.northbound.util.MDSALUtil.build;
 
  11 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
 
  12 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
 
  13 import static org.onap.sdnc.northbound.util.MDSALUtil.service;
 
  14 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData;
 
  15 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
 
  16 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus;
 
  18 import java.time.Instant;
 
  19 import org.junit.Before;
 
  20 import org.junit.Test;
 
  21 import org.junit.runner.RunWith;
 
  22 import org.mockito.Mockito;
 
  23 import org.mockito.runners.MockitoJUnitRunner;
 
  24 import org.onap.sdnc.northbound.util.PropBuilder;
 
  25 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 
  26 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 
  27 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 
  28 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
 
  29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
 
  30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
 
  31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction;
 
  32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
 
  33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
 
  34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
 
  35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
 
  36 import org.opendaylight.yangtools.yang.common.RpcResult;
 
  38 @RunWith(MockitoJUnitRunner.class)
 
  39 public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest {
 
  41     private static final String SVC_OPERATION = "contrail-route-topology-operation";
 
  45     public void setUp() throws Exception {
 
  47         svcClient.setScvOperation(SVC_OPERATION);
 
  51     public void should_fail_when_service_instance_id_not_present() throws Exception {
 
  53         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput());
 
  55         ContrailRouteTopologyOperationOutput output =
 
  56             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
  58         assertEquals("404", output.getResponseCode());
 
  59         assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
 
  60         assertEquals("Y", output.getAckFinalIndicator());
 
  65     public void should_fail_when_invalid_service_data() throws Exception {
 
  67         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
  68             .setServiceInformation(build(serviceInformationBuilder()
 
  69                 .setServiceInstanceId("test-service-instance-id")
 
  73         ContrailRouteTopologyOperationOutput output =
 
  74             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
  76         assertEquals("404", output.getResponseCode());
 
  77         assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
 
  78         assertEquals("Y", output.getAckFinalIndicator());
 
  83     public void should_fail_when_client_execution_failed() throws Exception {
 
  85         svcClient.mockHasGraph(true);
 
  86         svcClient.mockExecute(new RuntimeException("test exception"));
 
  88         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
  89             .setServiceInformation(build(serviceInformationBuilder()
 
  90                 .setServiceInstanceId("test-service-instance-id")
 
  94         persistServiceInDataBroker(input);
 
  96         ContrailRouteTopologyOperationOutput output =
 
  97             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
  99         assertEquals("500", output.getResponseCode());
 
 100         assertEquals("test exception", output.getResponseMessage());
 
 101         assertEquals("Y", output.getAckFinalIndicator());
 
 105     public void should_fail_when_client_has_no_graph() throws Exception {
 
 107         svcClient.mockHasGraph(false);
 
 109         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 110             .setServiceInformation(build(serviceInformationBuilder()
 
 111                 .setServiceInstanceId("test-service-instance-id")
 
 115         persistServiceInDataBroker(input);
 
 117         ContrailRouteTopologyOperationOutput output =
 
 118             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 120         assertEquals("503", output.getResponseCode());
 
 121         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
 
 122         assertEquals("Y", output.getAckFinalIndicator());
 
 126     public void should_fail_when_failed_to_update_mdsal() throws Exception {
 
 128         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
 129         svcClient.mockExecute(svcResultProp);
 
 130         svcClient.mockHasGraph(true);
 
 131         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
 
 132         when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
 
 134         DataBroker spyDataBroker = Mockito.spy(dataBroker);
 
 135         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
 
 136         genericResourceApiProvider.setDataBroker(spyDataBroker);
 
 138         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 139             .setServiceInformation(build(serviceInformationBuilder()
 
 140                 .setServiceInstanceId("test-service-instance-id")
 
 144         persistServiceInDataBroker(input);
 
 146         ContrailRouteTopologyOperationOutput output =
 
 147             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 149         assertEquals("500", output.getResponseCode());
 
 150         assertEquals("test exception", output.getResponseMessage());
 
 151         assertEquals("Y", output.getAckFinalIndicator());
 
 155     private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
 
 157         Service service = build(service()
 
 158             .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
 
 159             .setServiceData(build(serviceData()
 
 160                 .setServiceLevelOperStatus(build(serviceLevelOperStatus()
 
 161                     .setOrderStatus(OrderStatus.Created)
 
 162                     .setModifyTimestamp(Instant.now().toString())
 
 163                     .setLastSvcRequestId("svc-request-id: abc")
 
 164                     .setLastRpcAction(LastRpcAction.Activate)
 
 165                     .setLastOrderStatus(LastOrderStatus.PendingAssignment)
 
 166                     .setLastAction(LastAction.ActivateNetworkInstance)
 
 167                     .setCreateTimestamp(Instant.now().toString())
 
 171         db.write(true, service, LogicalDatastoreType.CONFIGURATION);