1cb8ecbb0f9eb7eec63cae6a7c6b3353def60a1d
[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.contrailRouteResponseInformation;
11 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput;
12 import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationOutput;
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;
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.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 = contrailRouteTopologyOperationInput().build();
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 = contrailRouteTopologyOperationInput()
78             .setSdncRequestHeader(sdncRequestHeader()
79                 .setSvcRequestId("test-svc-request-id")
80                 .setSvcAction(SvcAction.Assign).build()
81             )
82             .setServiceInformation(serviceInformationBuilder()
83                 .setServiceInstanceId("test-service-instance-id").build()
84             ).build();
85
86         ContrailRouteTopologyOperationOutput output =
87             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
88
89         assertEquals("404", output.getResponseCode());
90         assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage());
91         assertEquals("Y", output.getAckFinalIndicator());
92     }
93
94
95     @Test
96     public void should_fail_when_client_execution_failed() throws Exception {
97
98         svcClient.mockHasGraph(true);
99         svcClient.mockExecute(new RuntimeException("test exception"));
100
101         ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
102             .setSdncRequestHeader(sdncRequestHeader()
103                 .setSvcRequestId("test-svc-request-id")
104                 .setSvcAction(SvcAction.Assign).build()
105             )
106             .setServiceInformation(serviceInformationBuilder()
107                 .setServiceInstanceId("test-service-instance-id").build()
108             ).build();
109
110         persistServiceInDataBroker(input);
111
112         ContrailRouteTopologyOperationOutput output =
113             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
114
115         assertEquals("500", output.getResponseCode());
116         assertEquals("test exception", output.getResponseMessage());
117         assertEquals("Y", output.getAckFinalIndicator());
118     }
119
120     @Test
121     public void should_fail_when_client_has_no_graph() throws Exception {
122
123         svcClient.mockHasGraph(false);
124
125         ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
126             .setSdncRequestHeader(sdncRequestHeader()
127                 .setSvcRequestId("test-svc-request-id")
128                 .setSvcAction(SvcAction.Assign).build()
129             )
130             .setServiceInformation(serviceInformationBuilder()
131                 .setServiceInstanceId("test-service-instance-id").build()
132             ).build();
133
134         persistServiceInDataBroker(input);
135
136         ContrailRouteTopologyOperationOutput output =
137             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
138
139         assertEquals("503", output.getResponseCode());
140         assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage());
141         assertEquals("Y", output.getAckFinalIndicator());
142     }
143
144     @Test
145     public void should_fail_when_failed_to_update_mdsal() throws Exception {
146
147         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
148         svcClient.mockExecute(svcResultProp);
149         svcClient.mockHasGraph(true);
150         WriteTransaction mockWriteTransaction = mock(WriteTransaction.class);
151         when(mockWriteTransaction.commit()).thenThrow(new TransactionChainClosedException("test exception"));
152
153         DataBroker spyDataBroker = Mockito.spy(dataBroker);
154         when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction);
155         genericResourceApiProvider.setDataBroker(spyDataBroker);
156
157         ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
158             .setSdncRequestHeader(sdncRequestHeader()
159                 .setSvcRequestId("test-svc-request-id")
160                 .setSvcAction(SvcAction.Assign).build()
161             )
162             .setServiceInformation(serviceInformationBuilder()
163                 .setServiceInstanceId("test-service-instance-id").build()
164             ).build();
165
166         persistServiceInDataBroker(input);
167
168         ContrailRouteTopologyOperationOutput output =
169             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
170
171         assertEquals("500", output.getResponseCode());
172         assertEquals("test exception", output.getResponseMessage());
173         assertEquals("Y", output.getAckFinalIndicator());
174     }
175
176
177     @Test
178     public void should_success_when_no_errors_encountered() throws Exception {
179
180         svcClient.mockHasGraph(true);
181         PropBuilder svcResultProp = svcClient.createExecuteOKResult();
182         svcResultProp.set("contrail-route-object-path", "contrailRouteObjectPath: XYZ");
183         svcClient.mockExecute(svcResultProp);
184
185         ContrailRouteTopologyOperationInput input = contrailRouteTopologyOperationInput()
186             .setSdncRequestHeader(sdncRequestHeader()
187                 .setSvcRequestId("test-svc-request-id")
188                 .setSvcAction(SvcAction.Assign).build()
189             )
190             .setRequestInformation(requestInformation()
191                 .setRequestId("test-request-id")
192                 .setRequestAction(RequestInformation.RequestAction.CreateServiceInstance).build()
193             )
194             .setServiceInformation(serviceInformationBuilder()
195                 .setServiceInstanceId("test-service-instance-id").build()
196             ).build();
197
198         Service service = persistServiceInDataBroker(input);
199
200         ContrailRouteTopologyOperationOutput output =
201             exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult);
202
203         assertEquals("200", output.getResponseCode());
204         assertEquals("OK", output.getResponseMessage());
205         assertEquals("Y", output.getAckFinalIndicator());
206
207         ContrailRouteTopologyOperationOutput expectedOutput = createExpectedOutput(svcResultProp, input);
208         assertEquals(expectedOutput, output);
209
210         Service actualService = db
211             .read(input.getServiceInformation().getServiceInstanceId(), LogicalDatastoreType.CONFIGURATION);
212
213         Service expectedService = createExpectedService(input, service.getServiceData());
214         assertEquals(expectedService, actualService);
215     }
216
217     private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception {
218
219         Service service = service()
220             .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId())
221             .setServiceData(serviceData()
222                 .setServiceLevelOperStatus(serviceLevelOperStatus()
223                     .setOrderStatus(OrderStatus.Created)
224                     .setModifyTimestamp(Instant.now().toString())
225                     .setLastSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
226                     .setLastRpcAction(LastRpcAction.Activate)
227                     .setLastOrderStatus(LastOrderStatus.PendingAssignment)
228                     .setLastAction(LastAction.ActivateNetworkInstance)
229                     .setCreateTimestamp(Instant.now().toString()).build()
230                 ).build()
231             ).build();
232         db.write(true, service, LogicalDatastoreType.CONFIGURATION);
233         return service;
234     }
235
236     private ContrailRouteTopologyOperationOutput createExpectedOutput(PropBuilder propBuilder,
237         ContrailRouteTopologyOperationInput input) {
238
239         return contrailRouteTopologyOperationOutput()
240             .setContrailRouteResponseInformation(contrailRouteResponseInformation()
241                 .setObjectPath(propBuilder.get("contrail-route-object-path")).build()
242             )
243             .setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId())
244             .setResponseCode(propBuilder.get(svcClient.errorCode))
245             .setAckFinalIndicator(propBuilder.get(svcClient.ackFinal))
246             .setResponseMessage(propBuilder.get(svcClient.errorMessage))
247             .setServiceResponseInformation(serviceResponseInformation()
248                 .setInstanceId(input.getServiceInformation().getServiceInstanceId())
249                 .setObjectPath(propBuilder.get(svcClient.serviceObjectPath)).build()
250             ).build();
251     }
252
253     private Service createExpectedService(
254         ContrailRouteTopologyOperationInput expectedInput, ServiceData expectedServiceData) {
255
256         ServiceInformation expectedServiceInformation = expectedInput.getServiceInformation();
257
258         return service()
259             .setServiceInstanceId(expectedServiceInformation.getServiceInstanceId())
260             .setServiceData(serviceData().build())
261             .setServiceData(expectedServiceData)
262             .setServiceStatus(serviceStatus().build()).build();
263     }
264 }