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.vnfResponseInformation;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleResponseInformation;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleInformationBuilder;
18 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleTopologyOperationInput;
19 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleTopologyOperationOutput;
20 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfInformationBuilder;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.Mockito;
26 import org.mockito.runners.MockitoJUnitRunner;
27 import org.onap.sdnc.northbound.util.PropBuilder;
28 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
29 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
30 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
35 import org.opendaylight.yangtools.yang.common.RpcResult;
37 @RunWith(MockitoJUnitRunner.class)
38 public class VfModuleTopologyOperationRPCTest extends GenericResourceApiProviderTest {
40 private static final String SVC_OPERATION = "vf-module-topology-operation";
43 public void setUp() throws Exception {
45 svcClient.setScvOperation(SVC_OPERATION);
49 public void should_fail_when_service_info_not_present() throws Exception {
51 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput());
53 VfModuleTopologyOperationOutput output =
54 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
56 assertEquals("403", output.getResponseCode());
57 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
58 assertEquals("Y", output.getAckFinalIndicator());
63 public void should_fail_when_invalid_vnf_id() throws Exception {
65 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
66 .setServiceInformation(build(serviceInformationBuilder()
67 .setServiceInstanceId("test-service-instance-id")
71 VfModuleTopologyOperationOutput output =
72 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
74 assertEquals("403", output.getResponseCode());
75 assertEquals("invalid input, null or empty vnf-id", output.getResponseMessage());
76 assertEquals("Y", output.getAckFinalIndicator());
80 public void should_fail_when_invalid_vf_module_id() throws Exception {
82 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
83 .setServiceInformation(build(serviceInformationBuilder()
84 .setServiceInstanceId("test-service-instance-id")
86 .setVnfInformation(build(vnfInformationBuilder()
87 .setVnfId("test-vnf-id")))
90 VfModuleTopologyOperationOutput output =
91 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
93 assertEquals("403", output.getResponseCode());
94 assertEquals("invalid input, vf-module-id is null or empty", output.getResponseMessage());
95 assertEquals("Y", output.getAckFinalIndicator());
100 public void should_fail_when_client_execution_failed() throws Exception {
102 svcClient.mockHasGraph(true);
103 svcClient.mockExecute(new RuntimeException("test exception"));
105 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
106 .setServiceInformation(build(serviceInformationBuilder()
107 .setServiceInstanceId("test-service-instance-id")
109 .setVnfInformation(build(vnfInformationBuilder()
110 .setVnfId("test-vnf-id")
112 .setVfModuleInformation(build(vfModuleInformationBuilder()
113 .setVfModuleId("test-vf-module-id")
117 VfModuleTopologyOperationOutput output =
118 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
120 assertEquals("500", output.getResponseCode());
121 assertEquals("test exception", output.getResponseMessage());
122 assertEquals("Y", output.getAckFinalIndicator());
126 public void should_fail_when_client_has_no_graph() throws Exception {
128 svcClient.mockHasGraph(false);
130 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
131 .setServiceInformation(build(serviceInformationBuilder()
132 .setServiceInstanceId("test-service-instance-id")
134 .setVnfInformation(build(vnfInformationBuilder()
135 .setVnfId("test-vnf-id")
137 .setVfModuleInformation(build(vfModuleInformationBuilder()
138 .setVfModuleId("test-vf-module-id")
142 VfModuleTopologyOperationOutput output =
143 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
145 assertEquals("503", output.getResponseCode());
146 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
147 assertEquals("Y", output.getAckFinalIndicator());
151 public void should_fail_when_failed_to_update_mdsal() throws Exception {
153 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
154 svcClient.mockExecute(svcResultProp);
155 svcClient.mockHasGraph(true);
156 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
157 when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
159 DataBroker spyDataBroker = Mockito.spy(dataBroker);
160 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
161 genericResourceApiProvider.setDataBroker(spyDataBroker);
163 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
164 .setServiceInformation(build(serviceInformationBuilder()
165 .setServiceInstanceId("test-service-instance-id")
167 .setVnfInformation(build(vnfInformationBuilder()
168 .setVnfId("test-vnf-id")
170 .setVfModuleInformation(build(vfModuleInformationBuilder()
171 .setVfModuleId("test-vf-module-id")
175 VfModuleTopologyOperationOutput output =
176 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
178 assertEquals("500", output.getResponseCode());
179 assertEquals("test exception", output.getResponseMessage());
180 assertEquals("Y", output.getAckFinalIndicator());
184 public void should_complete_with_success_when_no_errors() throws Exception {
186 svcClient.mockHasGraph(true);
187 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
188 svcClient.mockExecute(svcResultProp);
190 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
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")
202 .setVnfInformation(build(vnfInformationBuilder()
203 .setVnfId("test-vnf-id")
205 .setVfModuleInformation(build(vfModuleInformationBuilder()
206 .setVfModuleId("test-vf-module-id")
210 VfModuleTopologyOperationOutput output =
211 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
213 assertEquals("200", output.getResponseCode());
214 assertEquals("OK", output.getResponseMessage());
215 assertEquals("Y", output.getAckFinalIndicator());
217 VfModuleTopologyOperationOutput expectedOutput = createExpectedVMTOO(svcResultProp, input);
218 assertEquals(expectedOutput, output);
221 private VfModuleTopologyOperationOutput createExpectedVMTOO(PropBuilder propBuilder,
222 VfModuleTopologyOperationInput input) {
223 return build(vfModuleTopologyOperationOutput()
224 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
225 .setResponseCode(propBuilder.get(svcClient.errorCode))
226 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
227 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
228 .setServiceResponseInformation(build(serviceResponseInformation()
229 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
230 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)))
232 .setVnfResponseInformation(build(vnfResponseInformation()
233 .setInstanceId(input.getVnfInformation().getVnfId())
234 .setObjectPath(propBuilder.get(svcClient.vnfObjectPath)))
236 .setVfModuleResponseInformation(build(vfModuleResponseInformation()
237 .setInstanceId(input.getVfModuleInformation().getVfModuleId())
238 .setObjectPath(propBuilder.get(svcClient.vfModuleObjectPath)))