2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.openstack.utils;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.mockito.ArgumentMatchers.eq;
29 import static org.mockito.ArgumentMatchers.isA;
30 import static org.mockito.ArgumentMatchers.isNull;
31 import static org.mockito.Mockito.doNothing;
32 import static org.mockito.Mockito.doReturn;
33 import static org.mockito.Mockito.doThrow;
34 import static org.mockito.Mockito.times;
35 import java.io.IOException;
36 import java.util.HashMap;
38 import org.junit.Before;
39 import org.junit.Rule;
40 import org.junit.Test;
41 import org.junit.rules.ExpectedException;
42 import org.junit.runner.RunWith;
43 import org.mockito.InjectMocks;
44 import org.mockito.Mock;
45 import org.mockito.Mockito;
46 import org.mockito.Spy;
47 import org.mockito.junit.MockitoJUnitRunner;
48 import org.onap.logging.ref.slf4j.ONAPLogConstants;
49 import org.onap.so.db.catalog.beans.HeatTemplate;
50 import org.onap.so.db.catalog.beans.NetworkResource;
51 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
52 import org.onap.so.db.catalog.beans.VfModule;
53 import org.onap.so.db.catalog.beans.VfModuleCustomization;
54 import org.onap.so.db.catalog.client.CatalogDbClient;
55 import org.onap.so.db.request.beans.CloudApiRequests;
56 import org.onap.so.db.request.beans.InfraActiveRequests;
57 import org.onap.so.db.request.client.RequestsDbClient;
58 import org.onap.so.openstack.beans.CreateStackRequest;
59 import org.onap.so.openstack.exceptions.MsoException;
60 import org.onap.so.openstack.exceptions.MsoOpenstackException;
61 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
63 import org.springframework.core.env.Environment;
64 import com.fasterxml.jackson.databind.ObjectMapper;
65 import com.woorea.openstack.base.client.OpenStackResponseException;
66 import com.woorea.openstack.heat.Heat;
67 import com.woorea.openstack.heat.StackResource;
68 import com.woorea.openstack.heat.StackResource.CreateStack;
69 import com.woorea.openstack.heat.StackResource.DeleteStack;
70 import com.woorea.openstack.heat.model.CreateStackParam;
71 import com.woorea.openstack.heat.model.Resources;
72 import com.woorea.openstack.heat.model.Stack;
73 import java.util.UUID;
75 @RunWith(MockitoJUnitRunner.class)
76 public class MsoHeatUtilsTest extends MsoHeatUtils {
79 public ExpectedException exceptionRule = ExpectedException.none();
83 private MsoHeatUtils heatUtils;
86 private RequestsDbClient requestDbClient;
89 private Heat heatClient;
92 private StackStatusHandler stackStatusHandler;
95 private Environment env;
98 private StackResource stackResource;
101 private NovaClientImpl novaClient;
104 private DeleteStack mockDeleteStack;
107 private Resources mockResources;
110 private CreateStack mockCreateStack;
113 private CatalogDbClient catalogDbClient;
115 private String cloudSiteId = "cloudSiteId";
116 private String tenantId = "tenantId";
118 private String getRequestId() {
119 return MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
123 public void setup() {
124 doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
125 String requestId = UUID.randomUUID().toString();
126 MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
130 public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
131 Stack stack = new Stack();
133 stack.setStackName("stackName");
134 stack.setStackStatus("CREATE_IN_PROGRESS");
135 stack.setStackStatusReason("Stack Finished");
137 String requestId = getRequestId();
138 Stack latestStack = new Stack();
139 latestStack.setId("id");
140 latestStack.setStackName("stackName");
141 latestStack.setStackStatus("CREATE_COMPLETE");
142 latestStack.setStackStatusReason("Stack Finished");
143 doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
144 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
145 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
146 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack, requestId);
147 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
148 assertEquals(true, actual != null);
152 public final void pollStackForStatus_No_Polling_Test() throws MsoException, IOException {
153 Stack stack = new Stack();
155 stack.setStackName("stackName");
156 stack.setStackStatus("CREATE_IN_PROGRESS");
157 stack.setStackStatusReason("Stack Finished");
158 String requestId = getRequestId();
159 doNothing().when(stackStatusHandler).updateStackStatus(stack, requestId);
160 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
161 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
162 doReturn("61").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
163 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
164 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack, requestId);
165 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
166 assertEquals(true, actual != null);
170 public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
171 Stack stack = new Stack();
173 stack.setStackName("stackName");
174 stack.setStackStatus("CREATE_IN_PROGRESS");
175 stack.setStackStatusReason("Stack Finished");
176 String requestId = getRequestId();
177 doNothing().when(stackStatusHandler).updateStackStatus(stack, requestId);
178 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
179 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
180 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
181 Mockito.verify(stackStatusHandler, times(5)).updateStackStatus(stack, requestId);
182 Mockito.verify(heatUtils, times(5)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
183 assertEquals(true, actual != null);
187 public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
188 Stack stack = new Stack();
190 stack.setStackName("stackName");
191 stack.setStackStatus("CREATE_IN_PROGRESS");
192 stack.setStackStatusReason("Stack In Progress");
193 CreateStackParam createStackParam = new CreateStackParam();
194 createStackParam.setStackName("stackName");
196 exceptionRule.expect(StackCreationException.class);
197 exceptionRule.expectMessage(
198 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack In Progress. Stack rollback suppressed, stack not deleted");
199 heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
203 public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
204 Stack stack = new Stack();
206 stack.setStackName("stackName");
207 stack.setStackStatus("CREATE_IN_PROGRESS");
208 stack.setStackStatusReason("Stack Finished");
210 Stack deletedStack = new Stack();
211 deletedStack.setId("id");
212 deletedStack.setStackName("stackName");
213 deletedStack.setStackStatus("DELETE_COMPLETE");
214 deletedStack.setStackStatusReason("Stack Deleted");
216 CreateStackParam createStackParam = new CreateStackParam();
217 createStackParam.setStackName("stackName");
218 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
219 exceptionRule.expect(StackCreationException.class);
220 exceptionRule.expectMessage(
221 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation completed with status: DELETE_COMPLETE Status Reason: Stack Deleted");
222 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
223 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
227 public final void postProcessStackCreate_Backout_True_Delete_Fail_Test() throws MsoException, IOException {
228 Stack stack = new Stack();
230 stack.setStackName("stackName");
231 stack.setStackStatus("CREATE_IN_PROGRESS");
232 stack.setStackStatusReason("Stack Finished");
234 Stack deletedStack = new Stack();
235 deletedStack.setId("id");
236 deletedStack.setStackName("stackName");
237 deletedStack.setStackStatus("DELETE_COMPLETE");
238 deletedStack.setStackStatusReason("Stack Deleted");
240 CreateStackParam createStackParam = new CreateStackParam();
241 createStackParam.setStackName("stackName");
242 doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
243 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
244 exceptionRule.expect(MsoException.class);
245 exceptionRule.expectMessage(
246 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
247 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
248 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
252 public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
253 Stack stack = new Stack();
255 stack.setStackName("stackName");
256 stack.setStackStatus("CREATE_IN_PROGRESS");
257 stack.setStackStatusReason(
258 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
260 Stack createdStack = new Stack();
261 createdStack.setId("id");
262 createdStack.setStackName("stackName");
263 createdStack.setStackStatus("CREATE_COMPLETE");
264 createdStack.setStackStatusReason("Stack Created");
266 CreateStackParam createStackParam = new CreateStackParam();
267 createStackParam.setStackName("stackName");
268 doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
270 heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
271 Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
276 public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
278 Stack stack = new Stack();
280 stack.setStackName("stackName");
281 stack.setStackStatus("CREATE_FAILED");
282 stack.setStackStatusReason(
283 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
285 Stack deletedStack = new Stack();
286 deletedStack.setId("id");
287 deletedStack.setStackName("stackName");
288 deletedStack.setStackStatus("DELETE_COMPLETE");
289 deletedStack.setStackStatusReason("Stack Deleted");
291 CreateStackParam createStackParam = new CreateStackParam();
292 createStackParam.setStackName("stackName");
293 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
294 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
295 doReturn(stackResource).when(heatClient).getStacks();
296 doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
298 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
299 Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
300 Mockito.verify(heatUtils, times(0)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId,
302 Mockito.verify(heatUtils, times(0)).postProcessStackDelete(deletedStack);
307 public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
309 exceptionRule.expect(StackCreationException.class);
310 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
311 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
315 public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
316 Stack deletedStack = new Stack();
317 deletedStack.setId("id");
318 deletedStack.setStackName("stackName");
319 deletedStack.setStackStatus("DELETE_FAILED");
320 deletedStack.setStackStatusReason("Stack DID NOT DELETE");
321 exceptionRule.expect(StackRollbackException.class);
322 exceptionRule.expectMessage(
323 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
324 heatUtils.postProcessStackDelete(deletedStack);
328 public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
330 exceptionRule.expect(StackRollbackException.class);
331 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
332 heatUtils.postProcessStackDelete(stack);
336 public final void isKeyPairFailure_Test() throws MsoException, IOException {
337 boolean actual = heatUtils.isKeyPairFailure(
338 "Exception during create VF 0 : Stack error (CREATE_FAILED): Resource CREATE failed: Conflict: resources.bfnm_my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID:req-941b0af6-63ae-4d6a-afbc-90b728bacf82) - stack successfully deleted'rolledBack='true'");
339 assertEquals(true, actual);
343 public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
344 Stack stack = new Stack();
346 stack.setStackName("stackName");
347 stack.setStackStatus("CREATE_FAILED");
348 stack.setStackStatusReason(
349 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
351 Stack createdStack = new Stack();
352 createdStack.setId("id");
353 createdStack.setStackName("stackName");
354 createdStack.setStackStatus("CREATE_COMPLETE");
355 createdStack.setStackStatusReason("Stack Created");
357 CreateStackParam createStackParam = new CreateStackParam();
358 createStackParam.setStackName("stackName");
360 doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
361 doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
362 doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
363 createStackParam, false);
365 heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
366 Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
367 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
368 Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
369 Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
370 createStackParam, false);
374 public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
375 Stack stack = new Stack();
377 stack.setStackName("stackName");
378 stack.setStackStatus("CREATE_FAILED");
379 stack.setStackStatusReason(
380 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
382 Stack createdStack = new Stack();
383 createdStack.setId("id");
384 createdStack.setStackName("stackName");
385 createdStack.setStackStatus("CREATE_COMPLETE");
386 createdStack.setStackStatusReason("Stack Created");
389 CreateStackParam createStackParam = new CreateStackParam();
390 createStackParam.setStackName("stackName");
392 doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
394 doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
395 tenantId, createStackParam);
397 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
398 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
400 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
405 public final void processCreateStack_Exception_Backout_Test()
406 throws MsoException, IOException, NovaClientException {
407 Stack stack = new Stack();
409 stack.setStackName("stackName");
410 stack.setStackStatus("CREATE_FAILED");
411 stack.setStackStatusReason(
412 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
414 Stack deletedStack = new Stack();
415 deletedStack.setId("id");
416 deletedStack.setStackName("stackName");
417 deletedStack.setStackStatus("DELETE_COMPLETE");
418 deletedStack.setStackStatusReason("Stack Deleted");
420 CreateStackParam createStackParam = new CreateStackParam();
421 createStackParam.setStackName("stackName");
423 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
424 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
425 exceptionRule.expect(MsoException.class);
426 exceptionRule.expectMessage("Error");
427 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
428 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
430 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
436 public final void createStack_Test() throws MsoException, IOException, NovaClientException {
437 CreateStackParam createStackParam = new CreateStackParam();
438 createStackParam.setStackName("stackName");
440 String requestId = getRequestId();
441 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
442 doNothing().when(heatUtils).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
443 doReturn(stackResource).when(heatClient).getStacks();
444 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
446 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
448 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
449 Mockito.verify(stackResource, times(1)).create(createStackParam);
450 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), eq(requestId), eq("stackName"));
451 Mockito.verify(heatClient, times(1)).getStacks();
452 Mockito.verify(stackResource, times(1)).create(createStackParam);
456 public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
458 CreateStackParam createStackParam = new CreateStackParam();
459 createStackParam.setStackName("stackName");
460 Map<String, Object> parameters = new HashMap<String, Object>();
461 parameters.put("test", "value");
463 "parameters:\n mmn_volume_name_1: \"data-mn-v-vdb\"\n mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
464 createStackParam.setParameters(parameters);
465 createStackParam.setEnvironment(environment);
467 CreateStackRequest createStackRequest = new CreateStackRequest();
468 createStackRequest.setEnvironment(environment);
469 createStackRequest.setParameters(parameters);
470 ObjectMapper mapper = new ObjectMapper();
471 String stackRequest = mapper.writeValueAsString(createStackRequest);
473 InfraActiveRequests request = new InfraActiveRequests();
474 request.setRequestId("requestId");
475 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
476 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
477 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
478 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
479 assertNotNull(request.getCloudApiRequests().get(0));
480 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
481 assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
485 public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
486 CreateStackParam createStackParam = new CreateStackParam();
487 createStackParam.setStackName("stackName");
488 Map<String, Object> parameters = new HashMap<String, Object>();
489 parameters.put("test", "value");
490 createStackParam.setParameters(parameters);
491 InfraActiveRequests request = new InfraActiveRequests();
492 request.setRequestId("requestId");
493 CloudApiRequests cloudRequest = new CloudApiRequests();
494 cloudRequest.setCloudIdentifier("stackName");
495 cloudRequest.setRequestBody("testMe");
496 cloudRequest.setRequestId("requestId");
497 request.getCloudApiRequests().add(cloudRequest);
498 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
499 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
500 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
501 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
502 assertNotNull(request.getCloudApiRequests().get(0));
503 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
504 assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
508 public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
509 CreateStackParam createStackParam = new CreateStackParam();
510 createStackParam.setStackName("stackName");
512 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
513 doReturn(stackResource).when(heatClient).getStacks();
514 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
516 doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
517 .executeAndRecordOpenstackRequest(mockCreateStack);
518 exceptionRule.expect(MsoOpenstackException.class);
519 exceptionRule.expectMessage("Unknown Error");
520 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
521 Mockito.verify(stackResource, times(1)).create(createStackParam);
522 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
523 Mockito.verify(heatClient, times(1)).getStacks();
524 Mockito.verify(stackResource, times(1)).create(createStackParam);
528 public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
529 CreateStackParam createStackParam = new CreateStackParam();
530 createStackParam.setStackName("stackName");
532 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
533 doReturn(stackResource).when(heatClient).getStacks();
534 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
536 doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
537 .executeAndRecordOpenstackRequest(mockCreateStack);
538 exceptionRule.expect(MsoStackAlreadyExists.class);
539 exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
540 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
541 Mockito.verify(stackResource, times(1)).create(createStackParam);
542 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
543 Mockito.verify(heatClient, times(1)).getStacks();
544 Mockito.verify(stackResource, times(1)).create(createStackParam);
548 public final void processCreateStack_Exception_No_Backout_Test()
549 throws MsoException, IOException, NovaClientException {
550 Stack stack = new Stack();
552 stack.setStackName("stackName");
553 stack.setStackStatus("CREATE_FAILED");
554 stack.setStackStatusReason(
555 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
557 Stack deletedStack = new Stack();
558 deletedStack.setId("id");
559 deletedStack.setStackName("stackName");
560 deletedStack.setStackStatus("DELETE_COMPLETE");
561 deletedStack.setStackStatusReason("Stack Deleted");
563 CreateStackParam createStackParam = new CreateStackParam();
564 createStackParam.setStackName("stackName");
566 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
567 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
569 exceptionRule.expect(MsoException.class);
570 exceptionRule.expectMessage("Error");
571 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
572 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
574 Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
578 public void testGetVfHeatTimeoutValue() {
580 VfModuleCustomization vfmc = new VfModuleCustomization();
581 VfModule vf = new VfModule();
582 HeatTemplate heat = new HeatTemplate();
583 heat.setTimeoutMinutes(110);
584 vf.setModuleHeatTemplate(heat);
585 vfmc.setVfModule(vf);
587 Mockito.when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("uuid")).thenReturn(vfmc);
589 int timeout = heatUtils.getVfHeatTimeoutValue("uuid", false);
590 assertEquals(110, timeout);
591 Mockito.verify(catalogDbClient, times(1)).getVfModuleCustomizationByModelCuztomizationUUID("uuid");
595 public void testGetNetworkHeatTimeoutValue() {
597 NetworkResourceCustomization mc = new NetworkResourceCustomization();
598 NetworkResource nr = new NetworkResource();
599 HeatTemplate heat = new HeatTemplate();
600 heat.setTimeoutMinutes(110);
601 nr.setHeatTemplate(heat);
602 mc.setNetworkResource(nr);
604 Mockito.when(catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID("uuid")).thenReturn(mc);
606 int timeout = heatUtils.getNetworkHeatTimeoutValue("uuid", "type");
607 assertEquals(110, timeout);
608 Mockito.verify(catalogDbClient, times(1)).getNetworkResourceCustomizationByModelCustomizationUUID("uuid");