2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.sdnc.northbound;
 
  24 import static org.junit.Assert.assertEquals;
 
  25 import static org.mockito.Mockito.mock;
 
  26 import static org.mockito.Mockito.when;
 
  27 import static org.onap.sdnc.northbound.GenericResourceApiProvider.APP_NAME;
 
  28 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NO_SERVICE_LOGIC_ACTIVE;
 
  29 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM;
 
  30 import static org.onap.sdnc.northbound.util.MDSALUtil.build;
 
  31 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
 
  32 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
 
  33 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
 
  34 import static org.onap.sdnc.northbound.util.MDSALUtil.service;
 
  35 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData;
 
  36 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
 
  37 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
 
  38 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceStatus;
 
  39 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceTopologyOperationInput;
 
  40 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceTopologyOperationOutput;
 
  42 import org.junit.Before;
 
  43 import org.junit.Test;
 
  44 import org.junit.runner.RunWith;
 
  45 import org.mockito.Mockito;
 
  46 import org.mockito.runners.MockitoJUnitRunner;
 
  47 import org.onap.sdnc.northbound.util.PropBuilder;
 
  48 import org.opendaylight.mdsal.binding.api.DataBroker;
 
  49 import org.opendaylight.mdsal.binding.api.TransactionChainClosedException;
 
  50 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 
  51 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 
  52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInput;
 
  53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutput;
 
  54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
 
  55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader;
 
  56 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
 
  57 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.information.ServiceInformation;
 
  58 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
 
  59 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus;
 
  60 import org.opendaylight.yangtools.yang.common.RpcResult;
 
  64  * This class test the ServiceTopologyOperation mdsal RPC.
 
  66 @RunWith(MockitoJUnitRunner.class)
 
  67 public class ServiceTopologyOperationRPCTest extends GenericResourceApiProviderTest {
 
  69     final String SVC_OPERATION = "service-topology-operation";
 
  72     public void setUp() throws Exception {
 
  74         svcClient.setScvOperation(SVC_OPERATION);
 
  78      * Verify  ServiceTopologyOperation RPC executes a DG then produces the expected {@link
 
  79      * ServiceTopologyOperationOutput} and persisted the expected {@link Service} in the {@link DataBroker}
 
  82     public void testServiceTopologyOperationRPC_ExecuteDG_Success() throws Exception {
 
  84         //mock svcClient to perform a successful execution with the expected parameters
 
  85         svcClient.mockHasGraph(true);
 
  86         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
  87         svcClient.mockExecute(svcResultProp);
 
  89         // create the ServiceTopologyOperationInput from the template
 
  90         ServiceTopologyOperationInput input = createSTOI();
 
  92         //execute the mdsal exec
 
  93         ServiceTopologyOperationOutput output = exec(
 
  94             genericResourceApiProvider::serviceTopologyOperation
 
  96             , RpcResult::getResult
 
  99         assertEquals("200", output.getResponseCode());
 
 100         assertEquals("OK", output.getResponseMessage());
 
 101         assertEquals("Y", output.getAckFinalIndicator());
 
 103         //verify the returned ServiceTopologyOperationOutput
 
 104         ServiceTopologyOperationOutput expectedServiceTopologyOperationOutput = createExpectedSTOO(svcResultProp,
 
 106         assertEquals(expectedServiceTopologyOperationOutput, output);
 
 108         //verify the persisted Service
 
 109         Service actualService = db.read(input.getServiceInformation().getServiceInstanceId(),
 
 110             LogicalDatastoreType.CONFIGURATION);
 
 111         Service expectedService = createExpectedService(
 
 112             expectedServiceTopologyOperationOutput,
 
 115         assertEquals(expectedService, actualService);
 
 121     public void should_fail_when_service_info_not_present() throws Exception {
 
 122         // create the ServiceTopologyOperationInput from the template
 
 123         ServiceTopologyOperationInput input = build(
 
 124             serviceTopologyOperationInput()
 
 125                 .setSdncRequestHeader(build(sdncRequestHeader()
 
 126                     .setSvcRequestId("svc-request-id: xyz")
 
 127                     .setSvcAction(SvcAction.Assign)
 
 129                 .setRequestInformation(build(requestInformation()
 
 130                     .setRequestId("request-id: xyz")
 
 131                     .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
 
 134         //execute the mdsal exec
 
 135         ServiceTopologyOperationOutput output = exec(
 
 136             genericResourceApiProvider::serviceTopologyOperation
 
 138             , RpcResult::getResult
 
 141         assertEquals("404", output.getResponseCode());
 
 142         assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
 
 143         assertEquals("Y", output.getAckFinalIndicator());
 
 148     public void should_fail_when_client_execution_failed() throws Exception {
 
 150         svcClient.mockHasGraph(true);
 
 151         svcClient.mockExecute(new RuntimeException("test exception"));
 
 153         ServiceTopologyOperationInput input = createSTOI();
 
 155         //execute the mdsal exec
 
 156         ServiceTopologyOperationOutput output = exec(
 
 157             genericResourceApiProvider::serviceTopologyOperation
 
 159             , RpcResult::getResult
 
 162         assertEquals("500", output.getResponseCode());
 
 163         assertEquals("test exception", output.getResponseMessage());
 
 164         assertEquals("Y", output.getAckFinalIndicator());
 
 168     public void delete_fail_when_client_execution_failed() throws Exception {
 
 170         //mock svcClient to perform a successful execution with the expected parameters
 
 171         svcClient.mockHasGraph(true);
 
 172         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
 173         svcClient.mockExecute(svcResultProp);
 
 175         ServiceTopologyOperationInput input = deleteSTOI();
 
 177         //execute the mdsal exec
 
 178         ServiceTopologyOperationOutput output = exec(
 
 179                 genericResourceApiProvider::serviceTopologyOperation
 
 181                 , RpcResult::getResult
 
 184         assertEquals("200", output.getResponseCode());
 
 185         assertEquals("OK", output.getResponseMessage());
 
 186         assertEquals("Y", output.getAckFinalIndicator());
 
 190     public void delete_service_fail_when_client_execution_failed() throws Exception {
 
 192         //mock svcClient to perform a successful execution with the expected parameters
 
 193         svcClient.mockHasGraph(true);
 
 194         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
 
 195         svcClient.mockExecute(svcResultProp);
 
 197         ServiceTopologyOperationInput input = deleteServiceSTOI();
 
 199         //execute the mdsal exec
 
 200         ServiceTopologyOperationOutput output = exec(
 
 201                 genericResourceApiProvider::serviceTopologyOperation
 
 203                 , RpcResult::getResult
 
 206         assertEquals("200", output.getResponseCode());
 
 207         assertEquals("Y", output.getAckFinalIndicator());
 
 211     public void should_fail_when_client_has_no_graph() throws Exception {
 
 212         svcClient.mockHasGraph(false);
 
 214         ServiceTopologyOperationInput input = createSTOI();
 
 216         //execute the mdsal exec
 
 217         ServiceTopologyOperationOutput output = exec(
 
 218             genericResourceApiProvider::serviceTopologyOperation
 
 220             , RpcResult::getResult
 
 223         assertEquals("503", output.getResponseCode());
 
 224         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
 
 225         assertEquals("Y", output.getAckFinalIndicator());
 
 230     public void should_fail_when_failed_to_update_mdsal() throws Exception {
 
 232         svcClient.mockHasGraph(true);
 
 233         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
 
 234         when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
 
 236         DataBroker spyDataBroker = Mockito.spy(dataBroker);
 
 237         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
 
 238         genericResourceApiProvider.setDataBroker(spyDataBroker);
 
 240         ServiceTopologyOperationInput input = createSTOI();
 
 242         //execute the mdsal exec
 
 243         ServiceTopologyOperationOutput output = exec(
 
 244             genericResourceApiProvider::serviceTopologyOperation
 
 246             , RpcResult::getResult
 
 249         assertEquals("500", output.getResponseCode());
 
 250         assertEquals("test exception", output.getResponseMessage());
 
 251         assertEquals("Y", output.getAckFinalIndicator());
 
 254     private ServiceTopologyOperationInput createSTOI() {
 
 257             serviceTopologyOperationInput()
 
 258                 .setSdncRequestHeader(build(sdncRequestHeader()
 
 259                     .setSvcRequestId("svc-request-id: xyz")
 
 260                     .setSvcAction(SvcAction.Assign)
 
 262                 .setRequestInformation(build(requestInformation()
 
 263                     .setRequestId("request-id: xyz")
 
 264                     .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
 
 266                 .setServiceInformation(build(serviceInformationBuilder()
 
 267                     .setServiceInstanceId("service-instance-id: xyz")
 
 272     private ServiceTopologyOperationInput deleteSTOI() {
 
 275                 serviceTopologyOperationInput()
 
 276                         .setSdncRequestHeader(build(sdncRequestHeader()
 
 277                                 .setSvcRequestId("svc-request-id: xyz")
 
 278                                 .setSvcAction(SvcAction.Unassign)
 
 280                         .setRequestInformation(build(requestInformation()
 
 281                                 .setRequestId("request-id: xyz")
 
 282                                 .setRequestAction(RequestInformation.RequestAction.DeleteServiceInstance)
 
 284                         .setServiceInformation(build(serviceInformationBuilder()
 
 285                                 .setServiceInstanceId("service-instance-id: xyz")
 
 290     private ServiceTopologyOperationInput deleteServiceSTOI() {
 
 293                 serviceTopologyOperationInput()
 
 294                         .setSdncRequestHeader(build(sdncRequestHeader()
 
 295                                 .setSvcRequestId("svc-request-id: xyz")
 
 296                                 .setSvcAction(SvcAction.Delete)
 
 298                         .setRequestInformation(build(requestInformation()
 
 299                                 .setRequestId("request-id: xyz")
 
 300                                 .setRequestAction(RequestInformation.RequestAction.DeleteServiceInstance)
 
 302                         .setServiceInformation(build(serviceInformationBuilder()
 
 303                                 .setServiceInstanceId("service-instance-id: xyz")
 
 309     private ServiceTopologyOperationOutput createExpectedSTOO(PropBuilder expectedSvcResultProp,
 
 310         ServiceTopologyOperationInput expectedServiceTopologyOperationInput) {
 
 312             serviceTopologyOperationOutput()
 
 313                 .setSvcRequestId(expectedServiceTopologyOperationInput.getSdncRequestHeader().getSvcRequestId())
 
 314                 .setResponseCode(expectedSvcResultProp.get(svcClient.errorCode))
 
 315                 .setAckFinalIndicator(expectedSvcResultProp.get(svcClient.ackFinal))
 
 316                 .setResponseMessage(expectedSvcResultProp.get(svcClient.errorMessage))
 
 317                 .setServiceResponseInformation(build(serviceResponseInformation()
 
 318                     .setInstanceId(expectedServiceTopologyOperationInput.getServiceInformation().getServiceInstanceId())
 
 319                     .setObjectPath(expectedSvcResultProp.get(svcClient.serviceObjectPath))
 
 324     private Service createExpectedService(
 
 325         ServiceTopologyOperationOutput expectedServiceTopologyOperationOutput,
 
 326         ServiceTopologyOperationInput expectedServiceTopologyOperationInput,
 
 327         Service actualService
 
 330         //We cannot predict the timeStamp value so just steal it from the actual
 
 331         //we need this to prevent the equals method from returning false as a result of the timestamp
 
 332         String responseTimeStamp = actualService == null || actualService.getServiceStatus() == null ?
 
 333             null : actualService.getServiceStatus().getResponseTimestamp();
 
 335         SdncRequestHeader expectedSdncRequestHeader = expectedServiceTopologyOperationInput.getSdncRequestHeader();
 
 336         ServiceInformation expectedServiceInformation = expectedServiceTopologyOperationInput.getServiceInformation();
 
 337         RequestInformation expectedRequestInformation = expectedServiceTopologyOperationInput.getRequestInformation();
 
 341                 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
 
 342                 .setServiceData(build(serviceData()))
 
 346                             .setAction(expectedRequestInformation.getRequestAction().name())
 
 347                             .setFinalIndicator(expectedServiceTopologyOperationOutput.getAckFinalIndicator())
 
 348                             .setResponseCode(expectedServiceTopologyOperationOutput.getResponseCode())
 
 349                             .setResponseMessage(expectedServiceTopologyOperationOutput.getResponseMessage())
 
 350                             .setRpcAction(toRpcAction(expectedSdncRequestHeader.getSvcAction()))
 
 351                             .setRpcName(SVC_OPERATION)
 
 352                             .setRequestStatus(ServiceStatus.RequestStatus.Synccomplete)
 
 353                             .setResponseTimestamp(responseTimeStamp)
 
 360     public ServiceStatus.RpcAction toRpcAction(SvcAction fromEnum) {
 
 361         return fromEnum == null ? null : ServiceStatus.RpcAction.valueOf(fromEnum.name());