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.connectionAttachmentResponseInformation;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.connectionAttachmentTopologyOperationInput;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.connectionAttachmentTopologyOperationOutput;
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.ConnectionAttachmentTopologyOperationInput;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutput;
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 ConnectionAttachmentTopologyOperationRPCTest extends GenericResourceApiProviderTest {
51 private static final String SVC_OPERATION = "connection-attachment-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 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput().build();
65 ConnectionAttachmentTopologyOperationOutput output =
66 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, 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 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput()
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 ConnectionAttachmentTopologyOperationOutput output =
87 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, 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 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput()
102 .setSdncRequestHeader(sdncRequestHeader()
103 .setSvcRequestId("test-svc-request-id")
104 .setSvcAction(SvcAction.Assign).build()
106 .setServiceInformation(serviceInformationBuilder()
107 .setServiceInstanceId("test-service-instance-id").build()
111 persistServiceInDataBroker(input);
113 ConnectionAttachmentTopologyOperationOutput output =
114 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
116 assertEquals("500", output.getResponseCode());
117 assertEquals("test exception", output.getResponseMessage());
118 assertEquals("Y", output.getAckFinalIndicator());
122 public void should_fail_when_client_has_no_graph() throws Exception {
124 svcClient.mockHasGraph(false);
126 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput()
127 .setSdncRequestHeader(sdncRequestHeader()
128 .setSvcRequestId("test-svc-request-id")
129 .setSvcAction(SvcAction.Assign).build()
131 .setServiceInformation(serviceInformationBuilder()
132 .setServiceInstanceId("test-service-instance-id").build()
136 persistServiceInDataBroker(input);
138 ConnectionAttachmentTopologyOperationOutput output =
139 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, 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 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput()
160 .setSdncRequestHeader(sdncRequestHeader()
161 .setSvcRequestId("test-svc-request-id")
162 .setSvcAction(SvcAction.Assign).build()
164 .setServiceInformation(serviceInformationBuilder()
165 .setServiceInstanceId("test-service-instance-id").build()
169 persistServiceInDataBroker(input);
171 ConnectionAttachmentTopologyOperationOutput output =
172 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
174 assertEquals("500", output.getResponseCode());
175 assertEquals("test exception", output.getResponseMessage());
176 assertEquals("Y", output.getAckFinalIndicator());
181 public void should_success_when_no_errors_encountered() throws Exception {
183 svcClient.mockHasGraph(true);
184 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
185 svcResultProp.set("contrail-route-object-path", "connectionAttachmentObjectPath: XYZ");
186 svcClient.mockExecute(svcResultProp);
188 ConnectionAttachmentTopologyOperationInput input = connectionAttachmentTopologyOperationInput()
189 .setSdncRequestHeader(sdncRequestHeader()
190 .setSvcRequestId("test-svc-request-id")
191 .setSvcAction(SvcAction.Assign).build()
193 .setRequestInformation(requestInformation()
194 .setRequestId("test-request-id")
195 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance).build()
197 .setServiceInformation(serviceInformationBuilder()
198 .setServiceInstanceId("test-service-instance-id").build()
202 Service service = persistServiceInDataBroker(input);
204 ConnectionAttachmentTopologyOperationOutput output =
205 exec(genericResourceApiProvider::connectionAttachmentTopologyOperation, input, RpcResult::getResult);
207 assertEquals("200", output.getResponseCode());
208 assertEquals("OK", output.getResponseMessage());
209 assertEquals("Y", output.getAckFinalIndicator());
211 ConnectionAttachmentTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
212 assertEquals(expectedOutput, output);
214 Service actualService = db
215 .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
217 Service expectedService = createExpectedService(input, service.getServiceData());
218 assertEquals(expectedService, actualService);
221 private Service persistServiceInDataBroker(ConnectionAttachmentTopologyOperationInput input) throws Exception {
223 Service service = service()
224 .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
225 .setServiceData(serviceData()
226 .setServiceLevelOperStatus(serviceLevelOperStatus()
227 .setOrderStatus(OrderStatus.Created)
228 .setModifyTimestamp(Instant.now().toString())
229 .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
230 .setLastRpcAction(LastRpcAction.Activate)
231 .setLastOrderStatus(LastOrderStatus.PendingAssignment)
232 .setLastAction(LastAction.ActivateNetworkInstance)
233 .setCreateTimestamp(Instant.now().toString()).build()
237 db.write(true, service, LogicalDatastoreType.CONFIGURATION);
241 private ConnectionAttachmentTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
242 ConnectionAttachmentTopologyOperationInput input) {
244 return connectionAttachmentTopologyOperationOutput()
245 .setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformation()
246 .setObjectPath(propBuilder.get("connection-attachement-object-path")).build()
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(serviceResponseInformation()
253 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
254 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)).build()
259 private Service createExpectedService(
260 ConnectionAttachmentTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
262 ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
265 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
266 .setServiceData(serviceData().build())
267 .setServiceData(expectedServiceData)
268 .setServiceStatus(serviceStatus().build()).build();