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.connectionAttachmentResponseInformation;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.connectionAttachmentTopologyOperationInput;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.connectionAttachmentTopologyOperationOutput;
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;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mockito;
30 import org.mockito.runners.MockitoJUnitRunner;
31 import org.onap.sdnc.northbound.util.PropBuilder;
32 import org.opendaylight.mdsal.binding.api.DataBroker;
33 import org.opendaylight.mdsal.binding.api.TransactionChainClosedException;
34 import org.opendaylight.mdsal.binding.api.WriteTransaction;
35 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInput;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutput;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.information.ServiceInformation;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
47 import org.opendaylight.yangtools.yang.common.RpcResult;
49 @RunWith(MockitoJUnitRunner.class)
50 public class ConnectionAttachmentTopologyOperationRPCTest extends GenericResourceApiProviderTest {
52 private static final String SVC_OPERATION = "connection-attachment-topology-operation";
56 public void setUp() throws Exception {
58 svcClient.setScvOperation(SVC_OPERATION);
62 public void should_fail_when_service_instance_id_not_present() throws Exception {
64 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput());
66 ConnectionAttachmentTopologyOperationOutput output =
67 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
69 assertEquals("404", output.getResponseCode());
70 assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
71 assertEquals("Y", output.getAckFinalIndicator());
76 public void should_fail_when_invalid_service_data() throws Exception {
78 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput()
79 .setSdncRequestHeader(build(sdncRequestHeader()
80 .setSvcRequestId("test-svc-request-id")
81 .setSvcAction(SvcAction.Assign)
83 .setServiceInformation(build(serviceInformationBuilder()
84 .setServiceInstanceId("test-service-instance-id")
88 ConnectionAttachmentTopologyOperationOutput output =
89 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
91 assertEquals("404", output.getResponseCode());
92 assertEquals(INVALID_INPUT_ERROR_MESSAGE, 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 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput()
104 .setSdncRequestHeader(build(sdncRequestHeader()
105 .setSvcRequestId("test-svc-request-id")
106 .setSvcAction(SvcAction.Assign)
108 .setServiceInformation(build(serviceInformationBuilder()
109 .setServiceInstanceId("test-service-instance-id")
113 persistServiceInDataBroker(input);
115 ConnectionAttachmentTopologyOperationOutput output =
116 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
118 assertEquals("500", output.getResponseCode());
119 assertEquals("test exception", output.getResponseMessage());
120 assertEquals("Y", output.getAckFinalIndicator());
124 public void should_fail_when_client_has_no_graph() throws Exception {
126 svcClient.mockHasGraph(false);
128 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput()
129 .setSdncRequestHeader(build(sdncRequestHeader()
130 .setSvcRequestId("test-svc-request-id")
131 .setSvcAction(SvcAction.Assign)
133 .setServiceInformation(build(serviceInformationBuilder()
134 .setServiceInstanceId("test-service-instance-id")
138 persistServiceInDataBroker(input);
140 ConnectionAttachmentTopologyOperationOutput output =
141 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
143 assertEquals("503", output.getResponseCode());
144 assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
145 assertEquals("Y", output.getAckFinalIndicator());
149 public void should_fail_when_failed_to_update_mdsal() throws Exception {
151 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
152 svcClient.mockExecute(svcResultProp);
153 svcClient.mockHasGraph(true);
154 WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
155 when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
157 DataBroker spyDataBroker = Mockito.spy(dataBroker);
158 when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
159 genericResourceApiProvider.setDataBroker(spyDataBroker);
161 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput()
162 .setSdncRequestHeader(build(sdncRequestHeader()
163 .setSvcRequestId("test-svc-request-id")
164 .setSvcAction(SvcAction.Assign)
166 .setServiceInformation(build(serviceInformationBuilder()
167 .setServiceInstanceId("test-service-instance-id")
171 persistServiceInDataBroker(input);
173 ConnectionAttachmentTopologyOperationOutput output =
174 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
176 assertEquals("500", output.getResponseCode());
177 assertEquals("test exception", output.getResponseMessage());
178 assertEquals("Y", output.getAckFinalIndicator());
183 public void should_success_when_no_errors_encountered() throws Exception {
185 svcClient.mockHasGraph(true);
186 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
187 svcResultProp.set("contrail-route-object-path", "connectionAttachmentObjectPath: XYZ");
188 svcClient.mockExecute(svcResultProp);
190 ConnectionAttachmentTopologyOperationInput input = build(connectionAttachmentTopologyOperationInput()
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")
204 Service service = persistServiceInDataBroker(input);
206 ConnectionAttachmentTopologyOperationOutput output =
207 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
209 assertEquals("200", output.getResponseCode());
210 assertEquals("OK", output.getResponseMessage());
211 assertEquals("Y", output.getAckFinalIndicator());
213 ConnectionAttachmentTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
214 assertEquals(expectedOutput, output);
216 Service actualService = db
217 .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
219 Service expectedService = createExpectedService(input, service.getServiceData());
220 assertEquals(expectedService, actualService);
223 private Service persistServiceInDataBroker(ConnectionAttachmentTopologyOperationInput input) throws Exception {
225 Service service = build(service()
226 .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
227 .setServiceData(build(serviceData()
228 .setServiceLevelOperStatus(build(serviceLevelOperStatus()
229 .setOrderStatus(OrderStatus.Created)
230 .setModifyTimestamp(Instant.now().toString())
231 .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
232 .setLastRpcAction(LastRpcAction.Activate)
233 .setLastOrderStatus(LastOrderStatus.PendingAssignment)
234 .setLastAction(LastAction.ActivateNetworkInstance)
235 .setCreateTimestamp(Instant.now().toString())
239 db.write(true, service, LogicalDatastoreType.CONFIGURATION);
243 private ConnectionAttachmentTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
244 ConnectionAttachmentTopologyOperationInput input) {
246 return build(connectionAttachmentTopologyOperationOutput()
247 .setConnectionAttachmentResponseInformation(build(connectionAttachmentResponseInformation()
248 .setObjectPath(propBuilder.get("connection-attachement-object-path"))))
249 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
250 .setResponseCode(propBuilder.get(svcClient.errorCode))
251 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
252 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
253 .setServiceResponseInformation(build(serviceResponseInformation()
254 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
255 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath))
260 private Service createExpectedService(
261 ConnectionAttachmentTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
263 ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
265 return build(service()
266 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
267 .setServiceData(build(serviceData()))
268 .setServiceData(expectedServiceData)
269 .setServiceStatus(build(serviceStatus()))