GenericResourceApiProvider unit tests part 6.
[sdnc/northbound.git] / generic-resource-api / provider / src / test / java / org / onap / sdnc / northbound / ContrailRouteTopologyOperationRPCTest.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.contrailRouteResponseInformation;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
13 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationOutput;
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;
23
24 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.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
33 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
34 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
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;
47
48 @RunWith(MockitoJUnitRunner.class)
49 public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest {
50
51     private static final String SVC_OPERATION = "contrail-route-topology-operation";
52
53
54     @Before
55     public void setUp() throws Exception {
56         super.setUp();
57         svcClient.setScvOperation(SVC_OPERATION);
58     }
59
60     @Test
61     public void should_fail_when_service_instance_id_not_present() throws Exception {
62
63         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput());
64
65         ContrailRouteTopologyOperationOutput output =
66             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
67
68         assertEquals("404", output.getResponseCode());
69         assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage());
70         assertEquals("Y", output.getAckFinalIndicator());
71     }
72
73
74     @Test
75     public void should_fail_when_invalid_service_data() throws Exception {
76
77         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
78             .setSdncRequestHeader(build(sdncRequestHeader()
79                 .setSvcRequestId("test-svc-request-id")
80                 .setSvcAction(SvcAction.Assign)
81             ))
82             .setServiceInformation(build(serviceInformationBuilder()
83                 .setServiceInstanceId("test-service-instance-id")
84             ))
85         );
86
87         ContrailRouteTopologyOperationOutput output =
88             exec(genericResourceApiProvider::contrailRouteTopologyOperation, 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         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
103             .setSdncRequestHeader(build(sdncRequestHeader()
104                 .setSvcRequestId("test-svc-request-id")
105                 .setSvcAction(SvcAction.Assign)
106             ))
107             .setServiceInformation(build(serviceInformationBuilder()
108                 .setServiceInstanceId("test-service-instance-id")
109             ))
110         );
111
112         persistServiceInDataBroker(input);
113
114         ContrailRouteTopologyOperationOutput output =
115             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
116
117         assertEquals("500", output.getResponseCode());
118         assertEquals("test exception", output.getResponseMessage());
119         assertEquals("Y", output.getAckFinalIndicator());
120     }
121
122     @Test
123     public void should_fail_when_client_has_no_graph() throws Exception {
124
125         svcClient.mockHasGraph(false);
126
127         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
128             .setSdncRequestHeader(build(sdncRequestHeader()
129                 .setSvcRequestId("test-svc-request-id")
130                 .setSvcAction(SvcAction.Assign)
131             ))
132             .setServiceInformation(build(serviceInformationBuilder()
133                 .setServiceInstanceId("test-service-instance-id")
134             ))
135         );
136
137         persistServiceInDataBroker(input);
138
139         ContrailRouteTopologyOperationOutput output =
140             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
141
142         assertEquals("503", output.getResponseCode());
143         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
144         assertEquals("Y", output.getAckFinalIndicator());
145     }
146
147     @Test
148     public void should_fail_when_failed_to_update_mdsal() throws Exception {
149
150         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
151         svcClient.mockExecute(svcResultProp);
152         svcClient.mockHasGraph(true);
153         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
154         when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception"));
155
156         DataBroker spyDataBroker = Mockito.spy(dataBroker);
157         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
158         genericResourceApiProvider.setDataBroker(spyDataBroker);
159
160         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
161             .setSdncRequestHeader(build(sdncRequestHeader()
162                 .setSvcRequestId("test-svc-request-id")
163                 .setSvcAction(SvcAction.Assign)
164             ))
165             .setServiceInformation(build(serviceInformationBuilder()
166                 .setServiceInstanceId("test-service-instance-id")
167             ))
168         );
169
170         persistServiceInDataBroker(input);
171
172         ContrailRouteTopologyOperationOutput output =
173             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
174
175         assertEquals("500", output.getResponseCode());
176         assertEquals("test exception", output.getResponseMessage());
177         assertEquals("Y", output.getAckFinalIndicator());
178     }
179
180
181     @Test
182     public void should_success_when_no_errors_encountered() throws Exception {
183
184         svcClient.mockHasGraph(true);
185         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
186         svcResultProp.set("contrail-route-object-path", "contrailRouteObjectPath: XYZ");
187         svcClient.mockExecute(svcResultProp);
188
189         ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()
190             .setSdncRequestHeader(build(sdncRequestHeader()
191                 .setSvcRequestId("test-svc-request-id")
192                 .setSvcAction(SvcAction.Assign)
193             ))
194             .setRequestInformation(build(requestInformation()
195                 .setRequestId("test-request-id")
196                 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance)
197             ))
198             .setServiceInformation(build(serviceInformationBuilder()
199                 .setServiceInstanceId("test-service-instance-id")
200             ))
201         );
202
203         Service service = persistServiceInDataBroker(input);
204
205         ContrailRouteTopologyOperationOutput output =
206             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
207
208         assertEquals("200", output.getResponseCode());
209         assertEquals("OK", output.getResponseMessage());
210         assertEquals("Y", output.getAckFinalIndicator());
211
212         ContrailRouteTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
213         assertEquals(expectedOutput, output);
214
215         Service actualService = db
216             .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
217
218         Service expectedService = createExpectedService(input, service.getServiceData());
219         assertEquals(expectedService, actualService);
220     }
221
222     private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
223
224         Service service = build(service()
225             .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
226             .setServiceData(build(serviceData()
227                 .setServiceLevelOperStatus(build(serviceLevelOperStatus()
228                     .setOrderStatus(OrderStatus.Created)
229                     .setModifyTimestamp(Instant.now().toString())
230                     .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
231                     .setLastRpcAction(LastRpcAction.Activate)
232                     .setLastOrderStatus(LastOrderStatus.PendingAssignment)
233                     .setLastAction(LastAction.ActivateNetworkInstance)
234                     .setCreateTimestamp(Instant.now().toString())
235                 ))
236             ))
237         );
238         db.write(true, service, LogicalDatastoreType.CONFIGURATION);
239         return service;
240     }
241
242     private ContrailRouteTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
243         ContrailRouteTopologyOperationInput input) {
244
245         return build(contrailRouteTopologyOperationOutput()
246             .setContrailRouteResponseInformation(build(contrailRouteResponseInformation()
247                 .setObjectPath(propBuilder.get("contrail-route-object-path"))))
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(build(serviceResponseInformation()
253                 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
254                 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath))
255             ))
256         );
257     }
258
259     private Service createExpectedService(
260         ContrailRouteTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
261
262         ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
263
264         return build(service()
265             .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
266             .setServiceData(build(serviceData()))
267             .setServiceData(expectedServiceData)
268             .setServiceStatus(build(serviceStatus()))
269         );
270     }
271 }