Upgrade to ODL Aluminum
[sdnc/northbound.git] / generic-resource-api / provider / src / test / java / org / onap / sdnc / northbound / SecurityZoneTopologyOperationRPCTest.java
1 package org.onap.sdnc.northbound;
2
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.exec;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.requestInformation;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.sdncRequestHeader;
14 import static org.onap.sdnc.northbound.util.MDSALUtil.securityZoneResponseInformation;
15 import static org.onap.sdnc.northbound.util.MDSALUtil.securityZoneTopologyOperationInput;
16 import static org.onap.sdnc.northbound.util.MDSALUtil.securityZoneTopologyOperationOutput;
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;
23
24 import java.time.Instant;
25
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.OperStatusData.LastAction;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInput;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutput;
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;
48
49 @RunWith(MockitoJUnitRunner.class)
50 public class SecurityZoneTopologyOperationRPCTest extends GenericResourceApiProviderTest {
51
52
53     private static final String SVC_OPERATION = "security-zone-topology-operation";
54
55
56     @Before
57     public void setUp() throws Exception {
58         super.setUp();
59         svcClient.setScvOperation(SVC_OPERATION);
60     }
61
62     @Test
63     public void should_fail_when_service_instance_id_not_present() throws Exception {
64
65         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput());
66
67         SecurityZoneTopologyOperationOutput output =
68             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
69
70         assertEquals("404", output.getResponseCode());
71         assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
72         assertEquals("Y", output.getAckFinalIndicator());
73     }
74
75
76     @Test
77     public void should_fail_when_invalid_service_data() throws Exception {
78
79         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput()
80             .setSdncRequestHeader(build(sdncRequestHeader()
81                 .setSvcRequestId("test-svc-request-id")
82                 .setSvcAction(SvcAction.Assign)
83             ))
84             .setServiceInformation(build(serviceInformationBuilder()
85                 .setServiceInstanceId("test-service-instance-id")
86             ))
87         );
88
89         SecurityZoneTopologyOperationOutput output =
90             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
91
92         assertEquals("404", output.getResponseCode());
93         assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
94         assertEquals("Y", output.getAckFinalIndicator());
95     }
96
97
98     @Test
99     public void should_fail_when_client_execution_failed() throws Exception {
100
101         svcClient.mockHasGraph(true);
102         svcClient.mockExecute(new RuntimeException("test exception"));
103
104         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput()
105             .setSdncRequestHeader(build(sdncRequestHeader()
106                 .setSvcRequestId("test-svc-request-id")
107                 .setSvcAction(SvcAction.Assign)
108             ))
109             .setServiceInformation(build(serviceInformationBuilder()
110                 .setServiceInstanceId("test-service-instance-id")
111             ))
112         );
113
114         persistServiceInDataBroker(input);
115
116         SecurityZoneTopologyOperationOutput output =
117             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
118
119         assertEquals("500", output.getResponseCode());
120         assertEquals("test exception", output.getResponseMessage());
121         assertEquals("Y", output.getAckFinalIndicator());
122     }
123
124     @Test
125     public void should_fail_when_client_has_no_graph() throws Exception {
126
127         svcClient.mockHasGraph(false);
128
129         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput()
130             .setSdncRequestHeader(build(sdncRequestHeader()
131                 .setSvcRequestId("test-svc-request-id")
132                 .setSvcAction(SvcAction.Assign)
133             ))
134             .setServiceInformation(build(serviceInformationBuilder()
135                 .setServiceInstanceId("test-service-instance-id")
136             ))
137         );
138
139         persistServiceInDataBroker(input);
140
141         SecurityZoneTopologyOperationOutput output =
142             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
143
144         assertEquals("503", output.getResponseCode());
145         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
146         assertEquals("Y", output.getAckFinalIndicator());
147     }
148
149     @Test
150     public void should_fail_when_failed_to_update_mdsal() throws Exception {
151
152         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
153         svcClient.mockExecute(svcResultProp);
154         svcClient.mockHasGraph(true);
155         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
156         when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
157
158         DataBroker spyDataBroker = Mockito.spy(dataBroker);
159         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
160         genericResourceApiProvider.setDataBroker(spyDataBroker);
161
162         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput()
163             .setSdncRequestHeader(build(sdncRequestHeader()
164                 .setSvcRequestId("test-svc-request-id")
165                 .setSvcAction(SvcAction.Assign)
166             ))
167             .setServiceInformation(build(serviceInformationBuilder()
168                 .setServiceInstanceId("test-service-instance-id")
169             ))
170         );
171
172         persistServiceInDataBroker(input);
173
174         SecurityZoneTopologyOperationOutput output =
175             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
176
177         assertEquals("500", output.getResponseCode());
178         assertEquals("test exception", output.getResponseMessage());
179         assertEquals("Y", output.getAckFinalIndicator());
180     }
181
182     @Test
183     public void should_success_when_no_errors_encountered() throws Exception {
184
185         svcClient.mockHasGraph(true);
186         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
187         svcResultProp.set("security-zone-object-path", "securityZoneObjectPath: XYZ");
188         svcClient.mockExecute(svcResultProp);
189
190         SecurityZoneTopologyOperationInput input = build(securityZoneTopologyOperationInput()
191             .setSdncRequestHeader(build(sdncRequestHeader()
192                 .setSvcRequestId("test-svc-request-id")
193                 .setSvcAction(SvcAction.Assign)
194             ))
195             .setRequestInformation(build(requestInformation()
196                 .setRequestId("test-request-id")
197                 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
198             ))
199             .setServiceInformation(build(serviceInformationBuilder()
200                 .setServiceInstanceId("test-service-instance-id")
201             ))
202         );
203
204         Service service = persistServiceInDataBroker(input);
205
206         SecurityZoneTopologyOperationOutput output =
207             exec(genericResourceApiProvider::securityZoneTopologyOperation, input, RpcResult::getResult);
208
209         assertEquals("200", output.getResponseCode());
210         assertEquals("OK", output.getResponseMessage());
211         assertEquals("Y", output.getAckFinalIndicator());
212
213         SecurityZoneTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
214         assertEquals(expectedOutput, output);
215
216         Service actualService = db
217             .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
218
219         Service expectedService = createExpectedService(input, service.getServiceData());
220         assertEquals(expectedService, actualService);
221     }
222
223     private Service persistServiceInDataBroker(SecurityZoneTopologyOperationInput input) throws Exception {
224
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())
236                 ))
237             ))
238         );
239         db.write(true, service, LogicalDatastoreType.CONFIGURATION);
240         return service;
241     }
242
243     private SecurityZoneTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
244         SecurityZoneTopologyOperationInput input) {
245
246         return build(securityZoneTopologyOperationOutput()
247             .setSecurityZoneResponseInformation(build(securityZoneResponseInformation()
248                 .setObjectPath(propBuilder.get("security-zone-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))
256             ))
257         );
258     }
259
260     private Service createExpectedService(
261         SecurityZoneTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
262
263         ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
264
265         return build(service()
266             .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
267             .setServiceData(build(serviceData()))
268             .setServiceData(expectedServiceData)
269             .setServiceStatus(build(serviceStatus()))
270         );
271     }
272
273 }