package org.onap.sdnc.northbound; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.onap.sdnc.northbound.GenericResourceApiProvider.APP_NAME; import static org.onap.sdnc.northbound.GenericResourceApiProvider.INVALID_INPUT_ERROR_MESSAGE; import static org.onap.sdnc.northbound.GenericResourceApiProvider.NO_SERVICE_LOGIC_ACTIVE; import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM; import static org.onap.sdnc.northbound.util.MDSALUtil.build; import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput; import static org.onap.sdnc.northbound.util.MDSALUtil.exec; import static org.onap.sdnc.northbound.util.MDSALUtil.service; import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData; import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder; import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus; import java.time.Instant; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.onap.sdnc.northbound.util.PropBuilder; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service; import org.opendaylight.yangtools.yang.common.RpcResult; @RunWith(MockitoJUnitRunner.class) public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest { private static final String SVC_OPERATION = "contrail-route-topology-operation"; @Before public void setUp() throws Exception { super.setUp(); svcClient.setScvOperation(SVC_OPERATION); } @Test public void should_fail_when_service_instance_id_not_present() throws Exception { ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()); ContrailRouteTopologyOperationOutput output = exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); assertEquals("404", output.getResponseCode()); assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage()); assertEquals("Y", output.getAckFinalIndicator()); } @Test public void should_fail_when_invalid_service_data() throws Exception { ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() .setServiceInformation(build(serviceInformationBuilder() .setServiceInstanceId("test-service-instance-id") )) ); ContrailRouteTopologyOperationOutput output = exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); assertEquals("404", output.getResponseCode()); assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage()); assertEquals("Y", output.getAckFinalIndicator()); } @Test public void should_fail_when_client_execution_failed() throws Exception { svcClient.mockHasGraph(true); svcClient.mockExecute(new RuntimeException("test exception")); ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() .setServiceInformation(build(serviceInformationBuilder() .setServiceInstanceId("test-service-instance-id") )) ); persistServiceInDataBroker(input); ContrailRouteTopologyOperationOutput output = exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); assertEquals("500", output.getResponseCode()); assertEquals("test exception", output.getResponseMessage()); assertEquals("Y", output.getAckFinalIndicator()); } @Test public void should_fail_when_client_has_no_graph() throws Exception { svcClient.mockHasGraph(false); ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() .setServiceInformation(build(serviceInformationBuilder() .setServiceInstanceId("test-service-instance-id") )) ); persistServiceInDataBroker(input); ContrailRouteTopologyOperationOutput output = exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); assertEquals("503", output.getResponseCode()); assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage()); assertEquals("Y", output.getAckFinalIndicator()); } @Test public void should_fail_when_failed_to_update_mdsal() throws Exception { PropBuilder svcResultProp = svcClient.createExecuteOKResult(); svcClient.mockExecute(svcResultProp); svcClient.mockHasGraph(true); WriteTransaction mockWriteTransaction = mock(WriteTransaction.class); when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception")); DataBroker spyDataBroker = Mockito.spy(dataBroker); when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction); genericResourceApiProvider.setDataBroker(spyDataBroker); ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() .setServiceInformation(build(serviceInformationBuilder() .setServiceInstanceId("test-service-instance-id") )) ); persistServiceInDataBroker(input); ContrailRouteTopologyOperationOutput output = exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); assertEquals("500", output.getResponseCode()); assertEquals("test exception", output.getResponseMessage()); assertEquals("Y", output.getAckFinalIndicator()); } private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception { Service service = build(service() .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId()) .setServiceData(build(serviceData() .setServiceLevelOperStatus(build(serviceLevelOperStatus() .setOrderStatus(OrderStatus.Created) .setModifyTimestamp(Instant.now().toString()) .setLastSvcRequestId("svc-request-id: abc") .setLastRpcAction(LastRpcAction.Activate) .setLastOrderStatus(LastOrderStatus.PendingAssignment) .setLastAction(LastAction.ActivateNetworkInstance) .setCreateTimestamp(Instant.now().toString()) )) )) ); db.write(true, service, LogicalDatastoreType.CONFIGURATION); return service; } }