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.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.securityZoneResponseInformation;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.securityZoneTopologyOperationInput;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.securityZoneTopologyOperationOutput;
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.OperStatusData.LastAction;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInput;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutput;
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 SecurityZoneTopologyOperationRPCTest extends GenericResourceApiProviderTest {
52 private static final String SVC_OPERATION = "security-zone-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 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput().build();
66 SecurityZoneTopologyOperationOutput output =
67 exec(genericResourceApiProvider::securityZoneTopologyOperation, 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 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput()
79 .setSdncRequestHeader(sdncRequestHeader()
80 .setSvcRequestId("test-svc-request-id")
81 .setSvcAction(SvcAction.Assign).build()
83 .setServiceInformation(serviceInformationBuilder()
84 .setServiceInstanceId("test-service-instance-id").build()
87 SecurityZoneTopologyOperationOutput output =
88 exec(genericResourceApiProvider::securityZoneTopologyOperation, 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 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput()
103 .setSdncRequestHeader(sdncRequestHeader()
104 .setSvcRequestId("test-svc-request-id")
105 .setSvcAction(SvcAction.Assign).build()
107 .setServiceInformation(serviceInformationBuilder()
108 .setServiceInstanceId("test-service-instance-id").build()
111 persistServiceInDataBroker(input);
113 SecurityZoneTopologyOperationOutput output =
114 exec(genericResourceApiProvider::securityZoneTopologyOperation, 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 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput()
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 SecurityZoneTopologyOperationOutput output =
139 exec(genericResourceApiProvider::securityZoneTopologyOperation, 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 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput()
160 .setSdncRequestHeader(sdncRequestHeader()
161 .setSvcRequestId("test-svc-request-id")
162 .setSvcAction(SvcAction.Assign).build()
164 .setServiceInformation(serviceInformationBuilder()
165 .setServiceInstanceId("test-service-instance-id").build()
168 persistServiceInDataBroker(input);
170 SecurityZoneTopologyOperationOutput output =
171 exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
173 assertEquals("500", output.getResponseCode());
174 assertEquals("test exception", output.getResponseMessage());
175 assertEquals("Y", output.getAckFinalIndicator());
179 public void should_success_when_no_errors_encountered() throws Exception {
181 svcClient.mockHasGraph(true);
182 PropBuilder svcResultProp = svcClient.createExecuteOKResult();
183 svcResultProp.set("security-zone-object-path", "securityZoneObjectPath: XYZ");
184 svcClient.mockExecute(svcResultProp);
186 SecurityZoneTopologyOperationInput input = securityZoneTopologyOperationInput()
187 .setSdncRequestHeader(sdncRequestHeader()
188 .setSvcRequestId("test-svc-request-id")
189 .setSvcAction(SvcAction.Assign).build()
191 .setRequestInformation(requestInformation()
192 .setRequestId("test-request-id")
193 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance).build()
195 .setServiceInformation(serviceInformationBuilder()
196 .setServiceInstanceId("test-service-instance-id").build()
199 Service service = persistServiceInDataBroker(input);
201 SecurityZoneTopologyOperationOutput output =
202 exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
204 assertEquals("200", output.getResponseCode());
205 assertEquals("OK", output.getResponseMessage());
206 assertEquals("Y", output.getAckFinalIndicator());
208 SecurityZoneTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
209 assertEquals(expectedOutput, output);
211 Service actualService = db
212 .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
214 Service expectedService = createExpectedService(input, service.getServiceData());
215 assertEquals(expectedService, actualService);
218 private Service persistServiceInDataBroker(SecurityZoneTopologyOperationInput input) throws Exception {
220 Service service = service()
221 .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
222 .setServiceData(serviceData()
223 .setServiceLevelOperStatus(serviceLevelOperStatus()
224 .setOrderStatus(OrderStatus.Created)
225 .setModifyTimestamp(Instant.now().toString())
226 .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
227 .setLastRpcAction(LastRpcAction.Activate)
228 .setLastOrderStatus(LastOrderStatus.PendingAssignment)
229 .setLastAction(LastAction.ActivateNetworkInstance)
230 .setCreateTimestamp(Instant.now().toString()).build()
234 db.write(true, service, LogicalDatastoreType.CONFIGURATION);
238 private SecurityZoneTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
239 SecurityZoneTopologyOperationInput input) {
241 return securityZoneTopologyOperationOutput()
242 .setSecurityZoneResponseInformation(securityZoneResponseInformation()
243 .setObjectPath(propBuilder.get("security-zone-object-path")).build()
245 .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
246 .setResponseCode(propBuilder.get(svcClient.errorCode))
247 .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
248 .setResponseMessage(propBuilder.get(svcClient.errorMessage))
249 .setServiceResponseInformation(serviceResponseInformation()
250 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
251 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)).build()
255 private Service createExpectedService(
256 SecurityZoneTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
258 ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
261 .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
262 .setServiceData(serviceData().build()
264 .setServiceData(expectedServiceData)
265 .setServiceStatus(serviceStatus().build()