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.vnfResponseInformation;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfTopologyOperationInput;
18 import static org.onap.sdnc.northbound.util.MDSALUtil.vnfTopologyOperationOutput;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.Mockito;
24 import org.mockito.runners.MockitoJUnitRunner;
25 import org.onap.sdnc.northbound.util.PropBuilder;
26 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
27 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
28 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInput;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
35 @RunWith(MockitoJUnitRunner.class)
36 public class VnfTopologyOperationRPCTest extends GenericResourceApiProviderTest {
38 private static final String SVC_OPERATION = "vnf-topology-operation";
41 public void setUp() throws Exception {
43 svcClient.setScvOperation(SVC_OPERATION);
47 public void should_fail_when_service_info_not_present() throws Exception {
49 VnfTopologyOperationInput input = build(vnfTopologyOperationInput());
51 VnfTopologyOperationOutput output =
52 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
54 assertEquals("404", output.getResponseCode());
55 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
56 assertEquals("Y", output.getAckFinalIndicator());
61 public void should_fail_when_invalid_vnf_id() throws Exception {
63 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
64 .setServiceInformation(build(serviceInformationBuilder().
65 setServiceInstanceId("test-service-instance-id")
69 VnfTopologyOperationOutput output =
70 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
72 assertEquals("404", output.getResponseCode());
73 assertEquals("invalid input, null or empty vnf-id", output.getResponseMessage());
74 assertEquals("Y", output.getAckFinalIndicator());
79 public void should_fail_when_client_execution_failed() throws Exception {
81 svcClient.mockHasGraph(true);
82 svcClient.mockExecute(new RuntimeException("test exception"));
84 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
85 .setServiceInformation(build(serviceInformationBuilder()
86 .setServiceInstanceId("test-service-instance-id")
88 .setVnfInformation(build(vnfInformationBuilder()
89 .setVnfId("test-vnf-id")
93 VnfTopologyOperationOutput output =
94 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
96 assertEquals("500", output.getResponseCode());
97 assertEquals("test exception", output.getResponseMessage());
98 assertEquals("Y", output.getAckFinalIndicator());
102 public void should_fail_when_client_has_no_graph() throws Exception {
104 svcClient.mockHasGraph(false);
106 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
107 .setServiceInformation(build(serviceInformationBuilder()
108 .setServiceInstanceId("test-service-instance-id")
110 .setVnfInformation(build(vnfInformationBuilder()
111 .setVnfId("test-vnf-id")
115 VnfTopologyOperationOutput output =
116 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
118 assertEquals("503", output.getResponseCode());
119 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
120 assertEquals("Y", output.getAckFinalIndicator());
124 public void should_fail_when_failed_to_update_mdsal() throws Exception {
126 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
127 svcClient.mockExecute(svcResultProp);
128 svcClient.mockHasGraph(true);
129 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
130 when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
132 DataBroker spyDataBroker = Mockito.spy(dataBroker);
133 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
134 genericResourceApiProvider.setDataBroker(spyDataBroker);
136 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
137 .setServiceInformation(build(serviceInformationBuilder()
138 .setServiceInstanceId("test-service-instance-id")
140 .setVnfInformation(build(vnfInformationBuilder()
141 .setVnfId("test-vnf-id")
145 VnfTopologyOperationOutput output =
146 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
148 assertEquals("500", output.getResponseCode());
149 assertEquals("test exception", output.getResponseMessage());
150 assertEquals("Y", output.getAckFinalIndicator());
154 public void should_complete_with_success_when_no_errors() throws Exception {
156 svcClient.mockHasGraph(true);
157 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
158 svcClient.mockExecute(svcResultProp);
160 VnfTopologyOperationInput input = build(vnfTopologyOperationInput()
161 .setSdncRequestHeader(build(sdncRequestHeader()
162 .setSvcRequestId("test-svc-request-id")
163 .setSvcAction(SvcAction.Assign)
165 .setRequestInformation(build(requestInformation()
166 .setRequestId("test-request-id")
167 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
169 .setServiceInformation(build(serviceInformationBuilder()
170 .setServiceInstanceId("test-service-instance-id")
172 .setVnfInformation(build(vnfInformationBuilder()
173 .setVnfId("test-vnf-id")
177 VnfTopologyOperationOutput output =
178 exec(genericResourceApiProvider::vnfTopologyOperation, input, RpcResult::getResult);
180 assertEquals("200", output.getResponseCode());
181 assertEquals("OK", output.getResponseMessage());
182 assertEquals("Y", output.getAckFinalIndicator());
184 VnfTopologyOperationOutput expectedVnfTopologyOperationOutput = createExpectedOutput(svcResultProp,
186 assertEquals(expectedVnfTopologyOperationOutput, output);
189 private VnfTopologyOperationOutput createExpectedOutput(PropBuilder svcResultProp,
190 VnfTopologyOperationInput vnfTopologyOperationInput) {
192 vnfTopologyOperationOutput()
193 .setSvcRequestId(vnfTopologyOperationInput.getSdncRequestHeader().getSvcRequestId())
194 .setResponseCode(svcResultProp.get(svcClient.errorCode))
195 .setAckFinalIndicator(svcResultProp.get(svcClient.ackFinal))
196 .setResponseMessage(svcResultProp.get(svcClient.errorMessage))
197 .setServiceResponseInformation(build(serviceResponseInformation()
198 .setInstanceId(vnfTopologyOperationInput.getServiceInformation().getServiceInstanceId())
199 .setObjectPath(svcResultProp.get(svcClient.serviceObjectPath))