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.NO_SERVICE_LOGIC_ACTIVE;
8 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM;
9 import static org.onap.sdnc.northbound.util.MDSALUtil.build;
10 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfInformationBuilder;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfTopologyOperationInput;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfTopologyOperationOutput;
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.TransactionChainClosedException;
28 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInput;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
34 @RunWith(MockitoJUnitRunner.class)
35 public class VnfTopologyOperationRPCTest extends GenericResourceApiProviderTest {
37 private static final String SVC_OPERATION = "vnf-topology-operation";
40 public void setUp() throws Exception {
42 svcClient.setScvOperation(SVC_OPERATION);
46 public void should_fail_when_service_info_not_present() throws Exception {
48 VnfTopologyOperationInput input = build(vnfTopologyOperationInput());
50 VnfTopologyOperationOutput output =
51 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
53 assertEquals("404", output.getResponseCode());
54 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
55 assertEquals("Y", output.getAckFinalIndicator());
60 public void should_fail_when_invalid_vnf_id() throws Exception {
62 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
63 .setServiceInformation(build(serviceInformationBuilder().
64 setServiceInstanceId("test-service-instance-id")))
67 VnfTopologyOperationOutput output =
68 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
70 assertEquals("404", output.getResponseCode());
71 assertEquals("invalid input, null or empty vnf-id", output.getResponseMessage());
72 assertEquals("Y", output.getAckFinalIndicator());
77 public void should_fail_when_client_execution_failed() throws Exception {
79 svcClient.mockHasGraph(true);
80 svcClient.mockExecute(new RuntimeException("test exception"));
82 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
83 .setServiceInformation(build(serviceInformationBuilder()
84 .setServiceInstanceId("test-service-instance-id")))
85 .setVnfInformation(build(vnfInformationBuilder()
86 .setVnfId("test-vnf-id")))
89 VnfTopologyOperationOutput output =
90 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
92 assertEquals("500", output.getResponseCode());
93 assertEquals("test exception", output.getResponseMessage());
94 assertEquals("Y", output.getAckFinalIndicator());
98 public void should_fail_when_client_has_no_graph() throws Exception {
100 svcClient.mockHasGraph(false);
102 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
103 .setServiceInformation(build(serviceInformationBuilder()
104 .setServiceInstanceId("test-service-instance-id")))
105 .setVnfInformation(build(vnfInformationBuilder()
106 .setVnfId("test-vnf-id")))
109 VnfTopologyOperationOutput output =
110 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
112 assertEquals("503", output.getResponseCode());
113 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
114 assertEquals("Y", output.getAckFinalIndicator());
118 public void should_fail_when_failed_to_update_mdsal() throws Exception {
120 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
121 svcClient.mockExecute(svcResultProp);
122 svcClient.mockHasGraph(true);
123 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
124 when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
126 DataBroker spyDataBroker = Mockito.spy(dataBroker);
127 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
128 genericResourceApiProvider.setDataBroker(spyDataBroker);
130 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
131 .setServiceInformation(build(serviceInformationBuilder()
132 .setServiceInstanceId("test-service-instance-id")))
133 .setVnfInformation(build(vnfInformationBuilder()
134 .setVnfId("test-vnf-id")))
137 VnfTopologyOperationOutput output =
138 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
140 assertEquals("500", output.getResponseCode());
141 assertEquals("test exception", output.getResponseMessage());
142 assertEquals("Y", output.getAckFinalIndicator());
146 public void should_complete_with_success_when_no_errors() throws Exception {
148 svcClient.mockHasGraph(true);
149 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
150 svcClient.mockExecute(svcResultProp);
152 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
153 .setSdncRequestHeader(build(sdncRequestHeader()
154 .setSvcRequestId("test-svc-request-id")
155 .setSvcAction(SvcAction.Assign)
157 .setRequestInformation(build(requestInformation()
158 .setRequestId("test-request-id")
159 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
161 .setServiceInformation(build(serviceInformationBuilder()
162 .setServiceInstanceId("test-service-instance-id")))
163 .setVnfInformation(build(vnfInformationBuilder()
164 .setVnfId("test-vnf-id")))
168 VnfTopologyOperationOutput output =
169 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
171 assertEquals("200", output.getResponseCode());
172 assertEquals("OK", output.getResponseMessage());
173 assertEquals("Y", output.getAckFinalIndicator());
175 VnfTopologyOperationOutput expectedVnfTopologyOperationOutput = createExpectedVTOO(svcResultProp,
177 assertEquals(expectedVnfTopologyOperationOutput, output);
180 private VnfTopologyOperationOutput createExpectedVTOO(PropBuilder expectedSvcResultProp,
181 VnfTopologyOperationInput vnfTopologyOperationInput) {
183 vnfTopologyOperationOutput()
184 .setSvcRequestId(vnfTopologyOperationInput.getSdncRequestHeader().getSvcRequestId())
185 .setResponseCode(expectedSvcResultProp.get(svcClient.errorCode))
186 .setAckFinalIndicator(expectedSvcResultProp.get(svcClient.ackFinal))
187 .setResponseMessage(expectedSvcResultProp.get(svcClient.errorMessage))
188 .setServiceResponseInformation(build(serviceResponseInformation()
189 .setInstanceId(vnfTopologyOperationInput.getServiceInformation().getServiceInstanceId())
190 .setObjectPath(expectedSvcResultProp.get("vnf-object-path"))