2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.sdnc.vnfapi;
24 import com.google.common.util.concurrent.CheckedFuture;
25 import org.junit.Assert;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.runners.MockitoJUnitRunner;
30 import org.mockito.Mockito;
31 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
32 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
33 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
34 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter;
35 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
36 import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTestCustomizer;
37 import org.opendaylight.controller.md.sal.binding.test.ConcurrentDataBrokerTestCustomizer;
38 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
39 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VfModuleTopologyOperationInput;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VfModuleTopologyOperationOutput;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformation;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformation.RequestAction;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformationBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.request.information.VfModuleRequestInformation;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.request.information.VfModuleRequestInformationBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.service.data.VfModuleServiceDataBuilder;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VfModuleTopologyOperationInputBuilder;
52 import java.util.Properties;
53 import java.util.concurrent.ExecutionException;
55 class VfModuleExceptionThrowerConfigurator {
56 private boolean shouldThrowExceptionDuringTransactionPut;
58 public VfModuleExceptionThrowerConfigurator() {
59 this.shouldThrowExceptionDuringTransactionPut = true;
62 public boolean shouldThrowExceptionDuringTransactionPut() {
63 return shouldThrowExceptionDuringTransactionPut;
66 public void setShouldThrowExceptionDuringTransactionPut(boolean shouldThrowExceptionDuringTransactionPut) {
67 this.shouldThrowExceptionDuringTransactionPut = shouldThrowExceptionDuringTransactionPut;
71 class VfModuleDataBrokerErrorMsgConfigurator {
72 static public String JAVA_LANG_RUNTIME_EXCEPTION = "java.lang.RuntimeException: ";
73 static public String TRANSACTION_WRITE_ERROR = "transaction-write-error";
76 class VfModuleDataBrokerStab extends BindingDOMDataBrokerAdapter {
77 VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
79 public VfModuleDataBrokerStab(final DOMDataBroker domDataBroker,
80 final BindingToNormalizedNodeCodec codec, VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator) {
81 super(domDataBroker, codec);
82 this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
87 public WriteTransaction newWriteOnlyTransaction() {
88 if (exceptionThrowerConfigurator.shouldThrowExceptionDuringTransactionPut()) {
89 return newThrowingExceptionWriteOnlyTransaction();
91 return newNotThrowingExceptionWriteOnlyTransaction();
94 private WriteTransaction newThrowingExceptionWriteOnlyTransaction() {
95 WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
96 Mockito.doThrow(new RuntimeException(VfModuleDataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR))
97 .when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
98 return mockWriteTransaction;
101 private WriteTransaction newNotThrowingExceptionWriteOnlyTransaction() {
102 WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
103 CheckedFuture<Void, TransactionCommitFailedException> mockCheckedFuture =
104 Mockito.mock(CheckedFuture.class);
105 Mockito.doNothing().when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
106 Mockito.doReturn(mockCheckedFuture).when(mockWriteTransaction).submit();
107 return mockWriteTransaction;
111 class VfModuleProviderDataBrokerTestCustomizer extends ConcurrentDataBrokerTestCustomizer {
112 VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
114 public VfModuleProviderDataBrokerTestCustomizer(VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator) {
116 this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
119 public DataBroker createDataBroker() {
120 return new VfModuleDataBrokerStab(createDOMDataBroker(),
121 super.getBindingToNormalized(), this.exceptionThrowerConfigurator);
125 @RunWith(MockitoJUnitRunner.class)
126 public class VfModuleTopologyOperationTest extends VnfApiProviderTest {
127 protected static final Logger LOG = LoggerFactory.getLogger(VfModuleTopologyOperationTest.class);
129 private static final String INVALID_VFMODULEID = "invalid input, null or empty vf-module-id";
130 private static final String INVALID_VNFINSTANCEID = "invalid input, null or empty vnf-instance-id";
131 private static final String NO_SERVICE_LOGIC = "No service logic active for VNF-API: \'vf-module-topology-operation\'";
132 private static final String VF_MODULE_ID = "vfModule1";
133 private static final String VNF_INSTANCE_ID = "vnfInstance1";
134 private static final String PRELOAD_NAME = "preloadName";
135 private static final String PRELOAD_TYPE = "preloadType";
136 private static final String ERROR_CODE = "error-code";
138 private static final String ERROR_MESSAGE = "error-message";
139 private static final String ACK_FINAL = "ack-final";
140 private static final String SVC_OPERATION = "vf-module-topology-operation";
142 private VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
145 protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
146 this.exceptionThrowerConfigurator = new VfModuleExceptionThrowerConfigurator();
147 return new VfModuleProviderDataBrokerTestCustomizer(this.exceptionThrowerConfigurator);
151 public void setUp() throws Exception {
153 svcClient.setScvOperation(SVC_OPERATION);
157 public void vfModuleTopologyOperationInputIsNull() throws Exception {
158 VfModuleTopologyOperationInput input = null;
159 checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
163 public void vfModuleTopologyOperationInput_VfModuleRequestInformationIsNull() throws Exception {
164 VfModuleTopologyOperationInputBuilder builder = new VfModuleTopologyOperationInputBuilder();
165 builder.setVfModuleRequestInformation(null);
166 VfModuleTopologyOperationInput input = builder.build();
167 checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
171 public void vfModuleTopologyOperationInput_getVfModuleRequestInformationVfModuleIdIsNull() throws Exception {
172 RequestInformation reqInfo = createRequestInformation(RequestAction.PreloadVfModuleRequest);
173 VfModuleRequestInformation vfModuleRequestInformation = createVfModuleRequestInformation(VNF_INSTANCE_ID, null);
174 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(vfModuleRequestInformation, reqInfo);
175 VfModuleTopologyOperationInput input = builder.build();
176 checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
180 public void vfModuleTopologyOperationInput_VfModuleRequestInformationVfModuleIdIsZero() throws Exception {
181 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID,""), createRequestInformation(RequestAction.PreloadVfModuleRequest));
182 VfModuleTopologyOperationInput input = builder.build();
183 checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
187 public void vfModuleTopologyOperationInput_getVfModuleRequestInformationVnfInstanceIdIsNull() throws Exception {
188 RequestInformation reqInfo = createRequestInformation(RequestAction.PreloadVfModuleRequest);
189 VfModuleRequestInformation vfModuleRequestInformation = createVfModuleRequestInformation(null, VF_MODULE_ID);
190 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(vfModuleRequestInformation, reqInfo);
191 VfModuleTopologyOperationInput input = builder.build();
192 checkVfModuleTopologyOperation(input, "403", INVALID_VNFINSTANCEID);
196 public void vfModuleTopologyOperationInput_VfModuleRequestInformationVnfInstanceIdIsZero() throws Exception {
197 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation("",VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
198 VfModuleTopologyOperationInput input = builder.build();
199 checkVfModuleTopologyOperation(input, "403", INVALID_VNFINSTANCEID);
203 public void vfModuleTopologyOperationInput_svcLogicClientHasGrapheReturnFalse() throws Exception {
204 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
205 VfModuleTopologyOperationInput input = builder.build();
206 setReturnForSvcLogicServiceClientHasGraph(false);
207 checkVfModuleTopologyOperation(input, "503", NO_SERVICE_LOGIC);
211 public void vfModuleTopologyOperationInput_svcLogicClientExecuteThrowsSvcLogicException() throws Exception {
212 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
213 VfModuleTopologyOperationInput input = builder.build();
214 setReturnForSvcLogicServiceClientHasGraph(true);
215 setMockVNFSDNSvcLogicServiceClientToThrowException(SvcLogicException.class);
216 checkVfModuleTopologyOperation(input, "500", null);
220 public void vfModuleTopologyOperationInput_svcLogicClientExecuteThrowsException() throws Exception {
221 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
222 VfModuleTopologyOperationInput input = builder.build();
224 setReturnForSvcLogicServiceClientHasGraph(true);
225 setMockVNFSDNSvcLogicServiceClientToThrowException(Exception.class);
226 checkVfModuleTopologyOperation(input, "500", null);
230 public void vfModuleTopologyOperationInput_svcLogicClientExecuteReturnsNotNull() throws Exception {
231 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
232 VfModuleTopologyOperationInput input = builder.build();
234 Properties properties = prop().set(ERROR_CODE, "500")
235 .set(ERROR_MESSAGE, ERROR_MESSAGE)
239 setReturnForSvcLogicServiceClientHasGraph(true);
240 setReturnForSvcLogicServiceClientExecute(properties);
241 checkVfModuleTopologyOperation(input, "500", ERROR_MESSAGE);
245 public void vfModuleTopologyOperationInput_svcLogicClientExecuteReturnsNull() throws Exception {
246 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
247 VfModuleTopologyOperationInput input = builder.build();
249 setReturnForSvcLogicServiceClientHasGraph(true);
250 setReturnForSvcLogicServiceClientExecute(null);
251 String expectedErrorMsg = VfModuleDataBrokerErrorMsgConfigurator.JAVA_LANG_RUNTIME_EXCEPTION
252 + VfModuleDataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR;
253 checkVfModuleTopologyOperation(input, "500", expectedErrorMsg);
257 public void vfModuleTopologyOperationInput_ActivateNoErrorDuringTransactionWriting() throws Exception {
258 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.VfModuleActivateRequest));
259 VfModuleTopologyOperationInput input = builder.build();
261 setReturnForSvcLogicServiceClientHasGraph(true);
262 setReturnForSvcLogicServiceClientExecute(null);
263 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
264 checkVfModuleTopologyOperation(input, "200", null);
268 public void vfModuleTopologyOperationInput_ChangeNoErrorDuringTransactionWriting() throws Exception {
269 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.ChangeVfModuleActivateRequest));
270 VfModuleTopologyOperationInput input = builder.build();
272 setReturnForSvcLogicServiceClientHasGraph(true);
273 setReturnForSvcLogicServiceClientExecute(null);
274 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
275 checkVfModuleTopologyOperation(input, "200", null);
279 public void vfModuleTopologyOperationInput_DisconnectNoErrorDuringTransactionWriting() throws Exception {
280 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.DisconnectVfModuleRequest));
281 VfModuleTopologyOperationInput input = builder.build();
283 setReturnForSvcLogicServiceClientHasGraph(true);
284 setReturnForSvcLogicServiceClientExecute(null);
285 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
286 checkVfModuleTopologyOperation(input, "200", null);
290 public void vfModuleTopologyOperationInput_PreloadNoErrorDuringTransactionWriting() throws Exception {
291 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
292 VfModuleTopologyOperationInput input = builder.build();
294 setReturnForSvcLogicServiceClientHasGraph(true);
295 setReturnForSvcLogicServiceClientExecute(null);
296 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
297 checkVfModuleTopologyOperation(input, "200", null);
301 public void vfModuleTopologyOperationInput_DeletePreloadNoErrorDuringTransactionWriting() throws Exception {
302 VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.DeletePreloadVfModuleRequest));
303 VfModuleTopologyOperationInput input = builder.build();
305 setReturnForSvcLogicServiceClientHasGraph(true);
306 setReturnForSvcLogicServiceClientExecute(null);
307 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
308 checkVfModuleTopologyOperation(input, "200", null);
310 private void checkVfModuleTopologyOperation(VfModuleTopologyOperationInput input,
311 String expectedResponseCode, String expectedResponseMessage) throws ExecutionException, InterruptedException {
313 VfModuleTopologyOperationOutput output = executeVfModuleTopologyOperation(input);
314 checkVfModuleTopologyOperationOutput(output, expectedResponseCode, expectedResponseMessage);
317 private VfModuleTopologyOperationOutput executeVfModuleTopologyOperation(
318 VfModuleTopologyOperationInput input) throws ExecutionException, InterruptedException {
319 return vnfapiProvider
320 .vfModuleTopologyOperation(input)
325 private void checkVfModuleTopologyOperationOutput(VfModuleTopologyOperationOutput result,
326 String expectedResponseCode, String expectedResponseMessage) {
328 String expectedAckFinalIndicator = "Y";
330 Assert.assertEquals(expectedResponseCode , result.getResponseCode());
331 Assert.assertEquals(expectedResponseMessage, result.getResponseMessage());
332 Assert.assertEquals(expectedAckFinalIndicator, result.getAckFinalIndicator());
335 private void setReturnForSvcLogicServiceClientHasGraph(Boolean returnValue) throws Exception{
336 Mockito.when(mockVNFSDNSvcLogicServiceClient
337 .hasGraph(Mockito.any(),Mockito.any(), Mockito.any(),Mockito.any()))
338 .thenReturn(returnValue);
341 private void setReturnForSvcLogicServiceClientExecute(Properties properties) throws Exception{
342 Mockito.when(mockVNFSDNSvcLogicServiceClient
343 .execute(Mockito.any(),
347 Mockito.any(VfModuleServiceDataBuilder.class),
349 .thenReturn(properties);
352 private void setMockVNFSDNSvcLogicServiceClientToThrowException(Class exceptionClass) throws Exception {
353 Mockito.when(mockVNFSDNSvcLogicServiceClient
354 .execute(Mockito.any(),
358 Mockito.any(VfModuleServiceDataBuilder.class),
360 .thenThrow(exceptionClass.asSubclass(Throwable.class));
363 private VfModuleTopologyOperationInputBuilder createVfModuleTopologyOperationInputBuilder(VfModuleRequestInformation vfModuleRequestInformation, RequestInformation reqInfo) {
364 VfModuleTopologyOperationInputBuilder builder = new VfModuleTopologyOperationInputBuilder();
365 builder.setVfModuleRequestInformation(vfModuleRequestInformation);
366 builder.setRequestInformation(reqInfo);
372 private VfModuleRequestInformation createVfModuleRequestInformation(String vnfInstanceId, String vfModuleId) {
373 return new VfModuleRequestInformationBuilder()
374 .setVnfInstanceId(vnfInstanceId)
375 .setVfModuleId(vfModuleId)
376 .setVfModuleName(PRELOAD_NAME)
377 .setVfModuleModelId(PRELOAD_TYPE)
381 private RequestInformation createRequestInformation(RequestAction action) {
382 return new RequestInformationBuilder()
383 .setRequestAction(action)