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.exec;
10 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleInformationBuilder;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleResponseInformation;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleTopologyOperationInput;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.vfModuleTopologyOperationOutput;
18 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfInformationBuilder;
19 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfResponseInformation;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mockito;
25 import org.mockito.runners.MockitoJUnitRunner;
26 import org.onap.sdnc.northbound.util.PropBuilder;
27 import org.opendaylight.mdsal.binding.api.DataBroker;
28 import org.opendaylight.mdsal.binding.api.TransactionChainClosedException;
29 import org.opendaylight.mdsal.binding.api.WriteTransaction;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
34 import org.opendaylight.yangtools.yang.common.RpcResult;
36 @RunWith(MockitoJUnitRunner.class)
37 public class VfModuleTopologyOperationRPCTest extends GenericResourceApiProviderTest {
39 private static final String SVC_OPERATION = "vf-module-topology-operation";
42 public void setUp() throws Exception {
44 svcClient.setScvOperation(SVC_OPERATION);
48 public void should_fail_when_service_info_not_present() throws Exception {
50 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput().build();
52 VfModuleTopologyOperationOutput output =
53 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
55 assertEquals("403", output.getResponseCode());
56 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
57 assertEquals("Y", output.getAckFinalIndicator());
62 public void should_fail_when_invalid_vnf_id() throws Exception {
64 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput()
65 .setServiceInformation(serviceInformationBuilder()
66 .setServiceInstanceId("test-service-instance-id").build()
69 VfModuleTopologyOperationOutput output =
70 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
72 assertEquals("403", output.getResponseCode());
73 assertEquals("invalid input, null or empty vnf-id", output.getResponseMessage());
74 assertEquals("Y", output.getAckFinalIndicator());
78 public void should_fail_when_invalid_vf_module_id() throws Exception {
80 VfModuleTopologyOperationInput input = build(vfModuleTopologyOperationInput()
81 .setServiceInformation(build(serviceInformationBuilder()
82 .setServiceInstanceId("test-service-instance-id")
84 .setVnfInformation(build(vnfInformationBuilder()
85 .setVnfId("test-vnf-id")))
88 VfModuleTopologyOperationOutput output =
89 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
91 assertEquals("403", output.getResponseCode());
92 assertEquals("invalid input, vf-module-id is null or empty", 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 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput()
104 .setServiceInformation(serviceInformationBuilder()
105 .setServiceInstanceId("test-service-instance-id").build()
107 .setVnfInformation(vnfInformationBuilder()
108 .setVnfId("test-vnf-id").build()
110 .setVfModuleInformation(vfModuleInformationBuilder()
111 .setVfModuleId("test-vf-module-id").build()
114 VfModuleTopologyOperationOutput output =
115 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
117 assertEquals("500", output.getResponseCode());
118 assertEquals("test exception", output.getResponseMessage());
119 assertEquals("Y", output.getAckFinalIndicator());
123 public void should_fail_when_client_has_no_graph() throws Exception {
125 svcClient.mockHasGraph(false);
127 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput()
128 .setServiceInformation(serviceInformationBuilder()
129 .setServiceInstanceId("test-service-instance-id").build()
131 .setVnfInformation(vnfInformationBuilder()
132 .setVnfId("test-vnf-id").build()
134 .setVfModuleInformation(vfModuleInformationBuilder()
135 .setVfModuleId("test-vf-module-id").build()
138 VfModuleTopologyOperationOutput output =
139 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
141 assertEquals("503", output.getResponseCode());
142 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
143 assertEquals("Y", output.getAckFinalIndicator());
147 public void should_fail_when_failed_to_update_mdsal() throws Exception {
149 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
150 svcClient.mockExecute(svcResultProp);
151 svcClient.mockHasGraph(true);
152 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
153 when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
155 DataBroker spyDataBroker = Mockito.spy(dataBroker);
156 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
157 genericResourceApiProvider.setDataBroker(spyDataBroker);
159 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput()
160 .setServiceInformation(serviceInformationBuilder()
161 .setServiceInstanceId("test-service-instance-id").build()
163 .setVnfInformation(vnfInformationBuilder()
164 .setVnfId("test-vnf-id").build()
166 .setVfModuleInformation(vfModuleInformationBuilder()
167 .setVfModuleId("test-vf-module-id").build()
170 VfModuleTopologyOperationOutput output =
171 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
173 assertEquals("500", output.getResponseCode());
174 assertEquals("test exception", output.getResponseMessage());
175 assertEquals("Y", output.getAckFinalIndicator());
179 public void should_complete_with_success_when_no_errors() throws Exception {
181 svcClient.mockHasGraph(true);
182 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
183 svcClient.mockExecute(svcResultProp);
185 VfModuleTopologyOperationInput input = vfModuleTopologyOperationInput()
186 .setSdncRequestHeader(sdncRequestHeader()
187 .setSvcRequestId("test-svc-request-id")
188 .setSvcAction(SvcAction.Assign).build()
190 .setRequestInformation(requestInformation()
191 .setRequestId("test-request-id")
192 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance).build()
194 .setServiceInformation(serviceInformationBuilder()
195 .setServiceInstanceId("test-service-instance-id").build()
197 .setVnfInformation(vnfInformationBuilder()
198 .setVnfId("test-vnf-id").build()
200 .setVfModuleInformation(vfModuleInformationBuilder()
201 .setVfModuleId("test-vf-module-id").build()
204 VfModuleTopologyOperationOutput output =
205 exec(genericResourceApiProvider::vfModuleTopologyOperation, input, RpcResult::getResult);
207 assertEquals("200", output.getResponseCode());
208 assertEquals("OK", output.getResponseMessage());
209 assertEquals("Y", output.getAckFinalIndicator());
211 VfModuleTopologyOperationOutput expectedOutput = createExpectedVMTOO(svcResultProp, input);
212 assertEquals(expectedOutput, output);
215 private VfModuleTopologyOperationOutput createExpectedVMTOO(PropBuilder propBuilder,
216 VfModuleTopologyOperationInput input) {
217 return vfModuleTopologyOperationOutput()
218 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
219 .setResponseCode(propBuilder.get(svcClient.errorCode))
220 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
221 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
222 .setServiceResponseInformation(serviceResponseInformation()
223 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
224 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)).build()
226 .setVnfResponseInformation(vnfResponseInformation()
227 .setInstanceId(input.getVnfInformation().getVnfId())
228 .setObjectPath(propBuilder.get(svcClient.vnfObjectPath)).build()
230 .setVfModuleResponseInformation(vfModuleResponseInformation()
231 .setInstanceId(input.getVfModuleInformation().getVfModuleId())
232 .setObjectPath(propBuilder.get(svcClient.vfModuleObjectPath)).build()