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.INVALID_INPUT_ERROR_MESSAGE;
8 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NO_SERVICE_LOGIC_ACTIVE;
9 import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM;
10 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteResponseInformation;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationOutput;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.service;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData;
18 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
19 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus;
20 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
21 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceStatus;
23 import java.time.Instant;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.Mockito;
29 import org.mockito.runners.MockitoJUnitRunner;
30 import org.onap.sdnc.northbound.util.PropBuilder;
31 import org.opendaylight.mdsal.binding.api.DataBroker;
32 import org.opendaylight.mdsal.binding.api.TransactionChainClosedException;
33 import org.opendaylight.mdsal.binding.api.WriteTransaction;
34 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.information.ServiceInformation;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
46 import org.opendaylight.yangtools.yang.common.RpcResult;
48 @RunWith(MockitoJUnitRunner.class)
49 public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest {
51 private static final String SVC_OPERATION = "contrail-route-topology-operation";
55 public void setUp() throws Exception {
57 svcClient.setScvOperation(SVC_OPERATION);
61 public void should_fail_when_service_instance_id_not_present() throws Exception {
63 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput().build();
65 ContrailRouteTopologyOperationOutput output =
66 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
68 assertEquals("404", output.getResponseCode());
69 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
70 assertEquals("Y", output.getAckFinalIndicator());
75 public void should_fail_when_invalid_service_data() throws Exception {
77 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
78 .setSdncRequestHeader(sdncRequestHeader()
79 .setSvcRequestId("test-svc-request-id")
80 .setSvcAction(SvcAction.Assign).build()
82 .setServiceInformation(serviceInformationBuilder()
83 .setServiceInstanceId("test-service-instance-id").build()
86 ContrailRouteTopologyOperationOutput output =
87 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
89 assertEquals("404", output.getResponseCode());
90 assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
91 assertEquals("Y", output.getAckFinalIndicator());
96 public void should_fail_when_client_execution_failed() throws Exception {
98 svcClient.mockHasGraph(true);
99 svcClient.mockExecute(new RuntimeException("test exception"));
101 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
102 .setSdncRequestHeader(sdncRequestHeader()
103 .setSvcRequestId("test-svc-request-id")
104 .setSvcAction(SvcAction.Assign).build()
106 .setServiceInformation(serviceInformationBuilder()
107 .setServiceInstanceId("test-service-instance-id").build()
110 persistServiceInDataBroker(input);
112 ContrailRouteTopologyOperationOutput output =
113 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
115 assertEquals("500", output.getResponseCode());
116 assertEquals("test exception", output.getResponseMessage());
117 assertEquals("Y", output.getAckFinalIndicator());
121 public void should_fail_when_client_has_no_graph() throws Exception {
123 svcClient.mockHasGraph(false);
125 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
126 .setSdncRequestHeader(sdncRequestHeader()
127 .setSvcRequestId("test-svc-request-id")
128 .setSvcAction(SvcAction.Assign).build()
130 .setServiceInformation(serviceInformationBuilder()
131 .setServiceInstanceId("test-service-instance-id").build()
134 persistServiceInDataBroker(input);
136 ContrailRouteTopologyOperationOutput output =
137 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
139 assertEquals("503", output.getResponseCode());
140 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
141 assertEquals("Y", output.getAckFinalIndicator());
145 public void should_fail_when_failed_to_update_mdsal() throws Exception {
147 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
148 svcClient.mockExecute(svcResultProp);
149 svcClient.mockHasGraph(true);
150 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
151 when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
153 DataBroker spyDataBroker = Mockito.spy(dataBroker);
154 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
155 genericResourceApiProvider.setDataBroker(spyDataBroker);
157 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
158 .setSdncRequestHeader(sdncRequestHeader()
159 .setSvcRequestId("test-svc-request-id")
160 .setSvcAction(SvcAction.Assign).build()
162 .setServiceInformation(serviceInformationBuilder()
163 .setServiceInstanceId("test-service-instance-id").build()
166 persistServiceInDataBroker(input);
168 ContrailRouteTopologyOperationOutput output =
169 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
171 assertEquals("500", output.getResponseCode());
172 assertEquals("test exception", output.getResponseMessage());
173 assertEquals("Y", output.getAckFinalIndicator());
178 public void should_success_when_no_errors_encountered() throws Exception {
180 svcClient.mockHasGraph(true);
181 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
182 svcResultProp.set("contrail-route-object-path", "contrailRouteObjectPath: XYZ");
183 svcClient.mockExecute(svcResultProp);
185 ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
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()
198 Service service = persistServiceInDataBroker(input);
200 ContrailRouteTopologyOperationOutput output =
201 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
203 assertEquals("200", output.getResponseCode());
204 assertEquals("OK", output.getResponseMessage());
205 assertEquals("Y", output.getAckFinalIndicator());
207 ContrailRouteTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
208 assertEquals(expectedOutput, output);
210 Service actualService = db
211 .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
213 Service expectedService = createExpectedService(input, service.getServiceData());
214 assertEquals(expectedService, actualService);
217 private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
219 Service service = service()
220 .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
221 .setServiceData(serviceData()
222 .setServiceLevelOperStatus(serviceLevelOperStatus()
223 .setOrderStatus(OrderStatus.Created)
224 .setModifyTimestamp(Instant.now().toString())
225 .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
226 .setLastRpcAction(LastRpcAction.Activate)
227 .setLastOrderStatus(LastOrderStatus.PendingAssignment)
228 .setLastAction(LastAction.ActivateNetworkInstance)
229 .setCreateTimestamp(Instant.now().toString()).build()
232 db.write(true, service, LogicalDatastoreType.CONFIGURATION);
236 private ContrailRouteTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
237 ContrailRouteTopologyOperationInput input) {
239 return contrailRouteTopologyOperationOutput()
240 .setContrailRouteResponseInformation(contrailRouteResponseInformation()
241 .setObjectPath(propBuilder.get("contrail-route-object-path")).build()
243 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
244 .setResponseCode(propBuilder.get(svcClient.errorCode))
245 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
246 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
247 .setServiceResponseInformation(serviceResponseInformation()
248 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
249 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)).build()
253 private Service createExpectedService(
254 ContrailRouteTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
256 ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
259 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
260 .setServiceData(serviceData().build())
261 .setServiceData(expectedServiceData)
262 .setServiceStatus(serviceStatus().build()).build();