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.build;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteResponseInformation;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationOutput;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.exec;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
17 import static org.onap.sdnc.northbound.util.MDSALUtil.service;
18 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData;
19 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder;
20 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus;
21 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceResponseInformation;
22 import static org.onap.sdnc.northbound.util.MDSALUtil.serviceStatus;
24 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.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
33 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
34 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
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 = build(contrailRouteTopologyOperationInput());
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 = build(contrailRouteTopologyOperationInput()
78 .setSdncRequestHeader(build(sdncRequestHeader()
79 .setSvcRequestId("test-svc-request-id")
80 .setSvcAction(SvcAction.Assign)
82 .setServiceInformation(build(serviceInformationBuilder()
83 .setServiceInstanceId("test-service-instance-id")
87 ContrailRouteTopologyOperationOutput output =
88 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
90 assertEquals("404", output.getResponseCode());
91 assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
92 assertEquals("Y", output.getAckFinalIndicator());
97 public void should_fail_when_client_execution_failed() throws Exception {
99 svcClient.mockHasGraph(true);
100 svcClient.mockExecute(new RuntimeException("test exception"));
102 ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
103 .setSdncRequestHeader(build(sdncRequestHeader()
104 .setSvcRequestId("test-svc-request-id")
105 .setSvcAction(SvcAction.Assign)
107 .setServiceInformation(build(serviceInformationBuilder()
108 .setServiceInstanceId("test-service-instance-id")
112 persistServiceInDataBroker(input);
114 ContrailRouteTopologyOperationOutput output =
115 exec(genericResourceApiProvider::contrailRouteTopologyOperation, 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 ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
128 .setSdncRequestHeader(build(sdncRequestHeader()
129 .setSvcRequestId("test-svc-request-id")
130 .setSvcAction(SvcAction.Assign)
132 .setServiceInformation(build(serviceInformationBuilder()
133 .setServiceInstanceId("test-service-instance-id")
137 persistServiceInDataBroker(input);
139 ContrailRouteTopologyOperationOutput output =
140 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
142 assertEquals("503", output.getResponseCode());
143 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
144 assertEquals("Y", output.getAckFinalIndicator());
148 public void should_fail_when_failed_to_update_mdsal() throws Exception {
150 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
151 svcClient.mockExecute(svcResultProp);
152 svcClient.mockHasGraph(true);
153 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
154 when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
156 DataBroker spyDataBroker = Mockito.spy(dataBroker);
157 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
158 genericResourceApiProvider.setDataBroker(spyDataBroker);
160 ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
161 .setSdncRequestHeader(build(sdncRequestHeader()
162 .setSvcRequestId("test-svc-request-id")
163 .setSvcAction(SvcAction.Assign)
165 .setServiceInformation(build(serviceInformationBuilder()
166 .setServiceInstanceId("test-service-instance-id")
170 persistServiceInDataBroker(input);
172 ContrailRouteTopologyOperationOutput output =
173 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
175 assertEquals("500", output.getResponseCode());
176 assertEquals("test exception", output.getResponseMessage());
177 assertEquals("Y", output.getAckFinalIndicator());
182 public void should_success_when_no_errors_encountered() throws Exception {
184 svcClient.mockHasGraph(true);
185 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
186 svcResultProp.set("contrail-route-object-path", "contrailRouteObjectPath: XYZ");
187 svcClient.mockExecute(svcResultProp);
189 ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
190 .setSdncRequestHeader(build(sdncRequestHeader()
191 .setSvcRequestId("test-svc-request-id")
192 .setSvcAction(SvcAction.Assign)
194 .setRequestInformation(build(requestInformation()
195 .setRequestId("test-request-id")
196 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
198 .setServiceInformation(build(serviceInformationBuilder()
199 .setServiceInstanceId("test-service-instance-id")
203 Service service = persistServiceInDataBroker(input);
205 ContrailRouteTopologyOperationOutput output =
206 exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
208 assertEquals("200", output.getResponseCode());
209 assertEquals("OK", output.getResponseMessage());
210 assertEquals("Y", output.getAckFinalIndicator());
212 ContrailRouteTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
213 assertEquals(expectedOutput, output);
215 Service actualService = db
216 .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
218 Service expectedService = createExpectedService(input, service.getServiceData());
219 assertEquals(expectedService, actualService);
222 private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
224 Service service = build(service()
225 .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
226 .setServiceData(build(serviceData()
227 .setServiceLevelOperStatus(build(serviceLevelOperStatus()
228 .setOrderStatus(OrderStatus.Created)
229 .setModifyTimestamp(Instant.now().toString())
230 .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
231 .setLastRpcAction(LastRpcAction.Activate)
232 .setLastOrderStatus(LastOrderStatus.PendingAssignment)
233 .setLastAction(LastAction.ActivateNetworkInstance)
234 .setCreateTimestamp(Instant.now().toString())
238 db.write(true, service, LogicalDatastoreType.CONFIGURATION);
242 private ContrailRouteTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
243 ContrailRouteTopologyOperationInput input) {
245 return build(contrailRouteTopologyOperationOutput()
246 .setContrailRouteResponseInformation(build(contrailRouteResponseInformation()
247 .setObjectPath(propBuilder.get("contrail-route-object-path"))))
248 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
249 .setResponseCode(propBuilder.get(svcClient.errorCode))
250 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
251 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
252 .setServiceResponseInformation(build(serviceResponseInformation()
253 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
254 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath))
259 private Service createExpectedService(
260 ContrailRouteTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
262 ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
264 return build(service()
265 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
266 .setServiceData(build(serviceData()))
267 .setServiceData(expectedServiceData)
268 .setServiceStatus(build(serviceStatus()))