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.so.db.request.beans.CloudApiRequests;
49 import org.onap.so.db.request.beans.InfraActiveRequests;
50 import org.onap.so.db.request.client.RequestsDbClient;
51 import org.onap.so.openstack.beans.CreateStackRequest;
52 import org.onap.so.openstack.exceptions.MsoException;
53 import org.onap.so.openstack.exceptions.MsoOpenstackException;
54 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
55 import org.springframework.core.env.Environment;
56 import com.fasterxml.jackson.databind.ObjectMapper;
57 import com.woorea.openstack.base.client.OpenStackResponseException;
58 import com.woorea.openstack.heat.Heat;
59 import com.woorea.openstack.heat.StackResource;
60 import com.woorea.openstack.heat.StackResource.CreateStack;
61 import com.woorea.openstack.heat.StackResource.DeleteStack;
62 import com.woorea.openstack.heat.model.CreateStackParam;
63 import com.woorea.openstack.heat.model.Resources;
64 import com.woorea.openstack.heat.model.Stack;
66 @RunWith(MockitoJUnitRunner.class)
67 public class MsoHeatUtilsTest extends MsoHeatUtils {
70 public ExpectedException exceptionRule = ExpectedException.none();
74 private MsoHeatUtils heatUtils;
77 private RequestsDbClient requestDbClient;
80 private Heat heatClient;
83 private StackStatusHandler stackStatusHandler;
86 private Environment env;
89 private StackResource stackResource;
92 private NovaClientImpl novaClient;
95 private DeleteStack mockDeleteStack;
98 private Resources mockResources;
101 private CreateStack mockCreateStack;
103 private String cloudSiteId = "cloudSiteId";
104 private String tenantId = "tenantId";
107 public void setup() {
108 doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
109 doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
113 public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
114 Stack stack = new Stack();
116 stack.setStackName("stackName");
117 stack.setStackStatus("CREATE_IN_PROGRESS");
118 stack.setStackStatusReason("Stack Finished");
120 Stack latestStack = new Stack();
121 latestStack.setId("id");
122 latestStack.setStackName("stackName");
123 latestStack.setStackStatus("CREATE_COMPLETE");
124 latestStack.setStackStatusReason("Stack Finished");
125 doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
126 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
127 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
128 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
129 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
130 assertEquals(true, actual != null);
135 public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
136 Stack stack = new Stack();
138 stack.setStackName("stackName");
139 stack.setStackStatus("CREATE_IN_PROGRESS");
140 stack.setStackStatusReason("Stack Finished");
141 doNothing().when(stackStatusHandler).updateStackStatus(stack);
142 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
143 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
144 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
145 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
146 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
147 assertEquals(true, actual != null);
151 public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
152 Stack stack = new Stack();
154 stack.setStackName("stackName");
155 stack.setStackStatus("CREATE_IN_PROGRESS");
156 stack.setStackStatusReason("Stack Finished");
157 CreateStackParam createStackParam = new CreateStackParam();
158 createStackParam.setStackName("stackName");
160 exceptionRule.expect(StackCreationException.class);
161 exceptionRule.expectMessage("Stack rollback suppressed, stack not deleted");
162 heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
166 public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
167 Stack stack = new Stack();
169 stack.setStackName("stackName");
170 stack.setStackStatus("CREATE_IN_PROGRESS");
171 stack.setStackStatusReason("Stack Finished");
173 Stack deletedStack = new Stack();
174 deletedStack.setId("id");
175 deletedStack.setStackName("stackName");
176 deletedStack.setStackStatus("DELETE_COMPLETE");
177 deletedStack.setStackStatusReason("Stack Deleted");
179 CreateStackParam createStackParam = new CreateStackParam();
180 createStackParam.setStackName("stackName");
181 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
182 exceptionRule.expect(StackCreationException.class);
183 exceptionRule.expectMessage(
184 "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");
185 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
186 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
190 public final void postProcessStackCreate_Backout_True_Delete_Fail_Test() throws MsoException, IOException {
191 Stack stack = new Stack();
193 stack.setStackName("stackName");
194 stack.setStackStatus("CREATE_IN_PROGRESS");
195 stack.setStackStatusReason("Stack Finished");
197 Stack deletedStack = new Stack();
198 deletedStack.setId("id");
199 deletedStack.setStackName("stackName");
200 deletedStack.setStackStatus("DELETE_COMPLETE");
201 deletedStack.setStackStatusReason("Stack Deleted");
203 CreateStackParam createStackParam = new CreateStackParam();
204 createStackParam.setStackName("stackName");
205 doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
206 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
207 exceptionRule.expect(MsoException.class);
208 exceptionRule.expectMessage(
209 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
210 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
211 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
215 public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
216 Stack stack = new Stack();
218 stack.setStackName("stackName");
219 stack.setStackStatus("CREATE_IN_PROGRESS");
220 stack.setStackStatusReason(
221 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
223 Stack createdStack = new Stack();
224 createdStack.setId("id");
225 createdStack.setStackName("stackName");
226 createdStack.setStackStatus("CREATE_COMPLETE");
227 createdStack.setStackStatusReason("Stack Created");
229 CreateStackParam createStackParam = new CreateStackParam();
230 createStackParam.setStackName("stackName");
231 doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
233 heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
234 Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
239 public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
241 Stack stack = new Stack();
243 stack.setStackName("stackName");
244 stack.setStackStatus("CREATE_FAILED");
245 stack.setStackStatusReason(
246 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
248 Stack deletedStack = new Stack();
249 deletedStack.setId("id");
250 deletedStack.setStackName("stackName");
251 deletedStack.setStackStatus("DELETE_COMPLETE");
252 deletedStack.setStackStatusReason("Stack Deleted");
254 CreateStackParam createStackParam = new CreateStackParam();
255 createStackParam.setStackName("stackName");
256 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
257 doNothing().when(heatUtils).postProcessStackDelete(deletedStack);
258 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
259 doReturn(stackResource).when(heatClient).getStacks();
260 doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
261 doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
264 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
265 Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
266 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId,
268 Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
273 public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
275 exceptionRule.expect(StackCreationException.class);
276 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
277 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
281 public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
282 Stack deletedStack = new Stack();
283 deletedStack.setId("id");
284 deletedStack.setStackName("stackName");
285 deletedStack.setStackStatus("DELETE_FAILED");
286 deletedStack.setStackStatusReason("Stack DID NOT DELETE");
287 exceptionRule.expect(StackRollbackException.class);
288 exceptionRule.expectMessage(
289 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
290 heatUtils.postProcessStackDelete(deletedStack);
294 public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
296 exceptionRule.expect(StackRollbackException.class);
297 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
298 heatUtils.postProcessStackDelete(stack);
302 public final void isKeyPairFailure_Test() throws MsoException, IOException {
303 boolean actual = heatUtils.isKeyPairFailure(
304 "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'");
305 assertEquals(true, actual);
309 public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
310 Stack stack = new Stack();
312 stack.setStackName("stackName");
313 stack.setStackStatus("CREATE_FAILED");
314 stack.setStackStatusReason(
315 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
317 Stack createdStack = new Stack();
318 createdStack.setId("id");
319 createdStack.setStackName("stackName");
320 createdStack.setStackStatus("CREATE_COMPLETE");
321 createdStack.setStackStatusReason("Stack Created");
323 CreateStackParam createStackParam = new CreateStackParam();
324 createStackParam.setStackName("stackName");
326 // doReturn(mockResources).when(heatUtils).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
327 // doNothing().when(novaClient).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
328 doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
329 doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
330 doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
331 createStackParam, false);
333 heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
334 Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
335 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
336 Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
337 Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
338 createStackParam, false);
342 public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
343 Stack stack = new Stack();
345 stack.setStackName("stackName");
346 stack.setStackStatus("CREATE_FAILED");
347 stack.setStackStatusReason(
348 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
350 Stack createdStack = new Stack();
351 createdStack.setId("id");
352 createdStack.setStackName("stackName");
353 createdStack.setStackStatus("CREATE_COMPLETE");
354 createdStack.setStackStatusReason("Stack Created");
357 CreateStackParam createStackParam = new CreateStackParam();
358 createStackParam.setStackName("stackName");
360 doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
362 doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
363 tenantId, createStackParam);
365 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
366 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
368 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
373 public final void processCreateStack_Exception_Backout_Test()
374 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 deletedStack = new Stack();
383 deletedStack.setId("id");
384 deletedStack.setStackName("stackName");
385 deletedStack.setStackStatus("DELETE_COMPLETE");
386 deletedStack.setStackStatusReason("Stack Deleted");
388 CreateStackParam createStackParam = new CreateStackParam();
389 createStackParam.setStackName("stackName");
391 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
392 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
393 exceptionRule.expect(MsoException.class);
394 exceptionRule.expectMessage("Error");
395 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
396 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
398 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
404 public final void createStack_Test() throws MsoException, IOException, NovaClientException {
405 CreateStackParam createStackParam = new CreateStackParam();
406 createStackParam.setStackName("stackName");
408 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
409 doReturn(stackResource).when(heatClient).getStacks();
410 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
412 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
414 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
415 Mockito.verify(stackResource, times(1)).create(createStackParam);
416 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
417 Mockito.verify(heatClient, times(1)).getStacks();
418 Mockito.verify(stackResource, times(1)).create(createStackParam);
422 public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
424 CreateStackParam createStackParam = new CreateStackParam();
425 createStackParam.setStackName("stackName");
426 Map<String, Object> parameters = new HashMap<String, Object>();
427 parameters.put("test", "value");
429 "parameters:\n mmn_volume_name_1: \"data-mn-v-vdb\"\n mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
430 createStackParam.setParameters(parameters);
431 createStackParam.setEnvironment(environment);
433 CreateStackRequest createStackRequest = new CreateStackRequest();
434 createStackRequest.setEnvironment(environment);
435 createStackRequest.setParameters(parameters);
436 ObjectMapper mapper = new ObjectMapper();
437 String stackRequest = mapper.writeValueAsString(createStackRequest);
439 InfraActiveRequests request = new InfraActiveRequests();
440 request.setRequestId("requestId");
441 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
442 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
443 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
444 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
445 assertNotNull(request.getCloudApiRequests().get(0));
446 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
447 assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
451 public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
452 CreateStackParam createStackParam = new CreateStackParam();
453 createStackParam.setStackName("stackName");
454 Map<String, Object> parameters = new HashMap<String, Object>();
455 parameters.put("test", "value");
456 createStackParam.setParameters(parameters);
457 InfraActiveRequests request = new InfraActiveRequests();
458 request.setRequestId("requestId");
459 CloudApiRequests cloudRequest = new CloudApiRequests();
460 cloudRequest.setCloudIdentifier("stackName");
461 cloudRequest.setRequestBody("testMe");
462 cloudRequest.setRequestId("requestId");
463 request.getCloudApiRequests().add(cloudRequest);
464 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
465 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
466 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
467 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
468 assertNotNull(request.getCloudApiRequests().get(0));
469 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
470 assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
474 public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
475 CreateStackParam createStackParam = new CreateStackParam();
476 createStackParam.setStackName("stackName");
478 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
479 doReturn(stackResource).when(heatClient).getStacks();
480 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
482 doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
483 .executeAndRecordOpenstackRequest(mockCreateStack);
484 exceptionRule.expect(MsoOpenstackException.class);
485 exceptionRule.expectMessage("Unknown Error");
486 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
487 Mockito.verify(stackResource, times(1)).create(createStackParam);
488 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
489 Mockito.verify(heatClient, times(1)).getStacks();
490 Mockito.verify(stackResource, times(1)).create(createStackParam);
494 public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
495 CreateStackParam createStackParam = new CreateStackParam();
496 createStackParam.setStackName("stackName");
498 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
499 doReturn(stackResource).when(heatClient).getStacks();
500 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
502 doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
503 .executeAndRecordOpenstackRequest(mockCreateStack);
504 exceptionRule.expect(MsoStackAlreadyExists.class);
505 exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
506 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
507 Mockito.verify(stackResource, times(1)).create(createStackParam);
508 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
509 Mockito.verify(heatClient, times(1)).getStacks();
510 Mockito.verify(stackResource, times(1)).create(createStackParam);
514 public final void processCreateStack_Exception_No_Backout_Test()
515 throws MsoException, IOException, NovaClientException {
516 Stack stack = new Stack();
518 stack.setStackName("stackName");
519 stack.setStackStatus("CREATE_FAILED");
520 stack.setStackStatusReason(
521 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
523 Stack deletedStack = new Stack();
524 deletedStack.setId("id");
525 deletedStack.setStackName("stackName");
526 deletedStack.setStackStatus("DELETE_COMPLETE");
527 deletedStack.setStackStatusReason("Stack Deleted");
529 CreateStackParam createStackParam = new CreateStackParam();
530 createStackParam.setStackName("stackName");
532 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
533 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
535 exceptionRule.expect(MsoException.class);
536 exceptionRule.expectMessage("Error");
537 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
538 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
540 Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);