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