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.contrailRouteResponseInformation;
 
  12 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
 
  13 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationOutput;
 
  14 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
 
  15 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
 
  16 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
 
  17 import static org.onap.sdnc.northbound.util.MDSALUtil.service;
 
  18 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData;
 
  19 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
 
  20 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus;
 
  21 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
 
  22 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceStatus;
 
  24 import java.time.Instant;
 
  26 import org.junit.Before;
 
  27 import org.junit.Test;
 
  28 import org.junit.runner.RunWith;
 
  29 import org.mockito.Mockito;
 
  30 import org.mockito.runners.MockitoJUnitRunner;
 
  31 import org.onap.sdnc.northbound.util.PropBuilder;
 
  32 import org.opendaylight.mdsal.binding.api.DataBroker;
 
  33 import org.opendaylight.mdsal.binding.api.TransactionChainClosedException;
 
  34 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 
  35 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 
  36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
 
  37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
 
  38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction;
 
  39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
 
  40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
 
  41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
 
  42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
 
  43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
 
  44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
 
  45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.information.ServiceInformation;
 
  46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
 
  47 import org.opendaylight.yangtools.yang.common.RpcResult;
 
  49 @RunWith(MockitoJUnitRunner.class)
 
  50 public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest {
 
  52     private static final String SVC_OPERATION = "contrail-route-topology-operation";
 
  56     public void setUp() throws Exception {
 
  58         svcClient.setScvOperation(SVC_OPERATION);
 
  62     public void should_fail_when_service_instance_id_not_present() throws Exception {
 
  64         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput());
 
  66         ContrailRouteTopologyOperationOutput output =
 
  67             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
  69         assertEquals("404", output.getResponseCode());
 
  70         assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
 
  71         assertEquals("Y", output.getAckFinalIndicator());
 
  76     public void should_fail_when_invalid_service_data() throws Exception {
 
  78         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
  79             .setSdncRequestHeader(build(sdncRequestHeader()
 
  80                 .setSvcRequestId("test-svc-request-id")
 
  81                 .setSvcAction(SvcAction.Assign)
 
  83             .setServiceInformation(build(serviceInformationBuilder()
 
  84                 .setServiceInstanceId("test-service-instance-id")
 
  88         ContrailRouteTopologyOperationOutput output =
 
  89             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
  91         assertEquals("404", output.getResponseCode());
 
  92         assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
 
  93         assertEquals("Y", output.getAckFinalIndicator());
 
  98     public void should_fail_when_client_execution_failed() throws Exception {
 
 100         svcClient.mockHasGraph(true);
 
 101         svcClient.mockExecute(new RuntimeException("test exception"));
 
 103         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 104             .setSdncRequestHeader(build(sdncRequestHeader()
 
 105                 .setSvcRequestId("test-svc-request-id")
 
 106                 .setSvcAction(SvcAction.Assign)
 
 108             .setServiceInformation(build(serviceInformationBuilder()
 
 109                 .setServiceInstanceId("test-service-instance-id")
 
 113         persistServiceInDataBroker(input);
 
 115         ContrailRouteTopologyOperationOutput output =
 
 116             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 118         assertEquals("500", output.getResponseCode());
 
 119         assertEquals("test exception", output.getResponseMessage());
 
 120         assertEquals("Y", output.getAckFinalIndicator());
 
 124     public void should_fail_when_client_has_no_graph() throws Exception {
 
 126         svcClient.mockHasGraph(false);
 
 128         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 129             .setSdncRequestHeader(build(sdncRequestHeader()
 
 130                 .setSvcRequestId("test-svc-request-id")
 
 131                 .setSvcAction(SvcAction.Assign)
 
 133             .setServiceInformation(build(serviceInformationBuilder()
 
 134                 .setServiceInstanceId("test-service-instance-id")
 
 138         persistServiceInDataBroker(input);
 
 140         ContrailRouteTopologyOperationOutput output =
 
 141             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 143         assertEquals("503", output.getResponseCode());
 
 144         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
 
 145         assertEquals("Y", output.getAckFinalIndicator());
 
 149     public void should_fail_when_failed_to_update_mdsal() throws Exception {
 
 151         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
 152         svcClient.mockExecute(svcResultProp);
 
 153         svcClient.mockHasGraph(true);
 
 154         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
 
 155         when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
 
 157         DataBroker spyDataBroker = Mockito.spy(dataBroker);
 
 158         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
 
 159         genericResourceApiProvider.setDataBroker(spyDataBroker);
 
 161         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 162             .setSdncRequestHeader(build(sdncRequestHeader()
 
 163                 .setSvcRequestId("test-svc-request-id")
 
 164                 .setSvcAction(SvcAction.Assign)
 
 166             .setServiceInformation(build(serviceInformationBuilder()
 
 167                 .setServiceInstanceId("test-service-instance-id")
 
 171         persistServiceInDataBroker(input);
 
 173         ContrailRouteTopologyOperationOutput output =
 
 174             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 176         assertEquals("500", output.getResponseCode());
 
 177         assertEquals("test exception", output.getResponseMessage());
 
 178         assertEquals("Y", output.getAckFinalIndicator());
 
 183     public void should_success_when_no_errors_encountered() throws Exception {
 
 185         svcClient.mockHasGraph(true);
 
 186         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
 187         svcResultProp.set("contrail-route-object-path", "contrailRouteObjectPath: XYZ");
 
 188         svcClient.mockExecute(svcResultProp);
 
 190         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
 
 191             .setSdncRequestHeader(build(sdncRequestHeader()
 
 192                 .setSvcRequestId("test-svc-request-id")
 
 193                 .setSvcAction(SvcAction.Assign)
 
 195             .setRequestInformation(build(requestInformation()
 
 196                 .setRequestId("test-request-id")
 
 197                 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
 
 199             .setServiceInformation(build(serviceInformationBuilder()
 
 200                 .setServiceInstanceId("test-service-instance-id")
 
 204         Service service = persistServiceInDataBroker(input);
 
 206         ContrailRouteTopologyOperationOutput output =
 
 207             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
 
 209         assertEquals("200", output.getResponseCode());
 
 210         assertEquals("OK", output.getResponseMessage());
 
 211         assertEquals("Y", output.getAckFinalIndicator());
 
 213         ContrailRouteTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
 
 214         assertEquals(expectedOutput, output);
 
 216         Service actualService = db
 
 217             .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
 
 219         Service expectedService = createExpectedService(input, service.getServiceData());
 
 220         assertEquals(expectedService, actualService);
 
 223     private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
 
 225         Service service = build(service()
 
 226             .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
 
 227             .setServiceData(build(serviceData()
 
 228                 .setServiceLevelOperStatus(build(serviceLevelOperStatus()
 
 229                     .setOrderStatus(OrderStatus.Created)
 
 230                     .setModifyTimestamp(Instant.now().toString())
 
 231                     .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
 
 232                     .setLastRpcAction(LastRpcAction.Activate)
 
 233                     .setLastOrderStatus(LastOrderStatus.PendingAssignment)
 
 234                     .setLastAction(LastAction.ActivateNetworkInstance)
 
 235                     .setCreateTimestamp(Instant.now().toString())
 
 239         db.write(true, service, LogicalDatastoreType.CONFIGURATION);
 
 243     private ContrailRouteTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
 
 244         ContrailRouteTopologyOperationInput input) {
 
 246         return build(contrailRouteTopologyOperationOutput()
 
 247             .setContrailRouteResponseInformation(build(contrailRouteResponseInformation()
 
 248                 .setObjectPath(propBuilder.get("contrail-route-object-path"))))
 
 249             .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
 
 250             .setResponseCode(propBuilder.get(svcClient.errorCode))
 
 251             .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
 
 252             .setResponseMessage(propBuilder.get(svcClient.errorMessage))
 
 253             .setServiceResponseInformation(build(serviceResponseInformation()
 
 254                 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
 
 255                 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath))
 
 260     private Service createExpectedService(
 
 261         ContrailRouteTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
 
 263         ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
 
 265         return build(service()
 
 266             .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
 
 267             .setServiceData(build(serviceData()))
 
 268             .setServiceData(expectedServiceData)
 
 269             .setServiceStatus(build(serviceStatus()))