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.ArrayList;
37 import java.util.HashMap;
38 import java.util.List;
40 import org.junit.Before;
41 import org.junit.Rule;
42 import org.junit.Test;
43 import org.junit.rules.ExpectedException;
44 import org.junit.runner.RunWith;
45 import org.mockito.InjectMocks;
46 import org.mockito.Mock;
47 import org.mockito.Mockito;
48 import org.mockito.Spy;
49 import org.mockito.junit.MockitoJUnitRunner;
50 import org.onap.so.db.request.beans.CloudApiRequests;
51 import org.onap.so.db.request.beans.InfraActiveRequests;
52 import org.onap.so.db.request.client.RequestsDbClient;
53 import org.onap.so.openstack.exceptions.MsoException;
54 import org.onap.so.openstack.exceptions.MsoOpenstackException;
55 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
56 import org.springframework.core.env.Environment;
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.Resource;
64 import com.woorea.openstack.heat.model.Resources;
65 import com.woorea.openstack.heat.model.Stack;
67 @RunWith(MockitoJUnitRunner.class)
68 public class MsoHeatUtilsTest extends MsoHeatUtils {
71 public ExpectedException exceptionRule = ExpectedException.none();
75 private MsoHeatUtils heatUtils;
78 private RequestsDbClient requestDbClient;
81 private Heat heatClient;
84 private StackStatusHandler stackStatusHandler;
87 private Environment env;
90 private StackResource stackResource;
93 private NovaClientImpl novaClient;
96 private DeleteStack mockDeleteStack;
99 private Resources mockResources;
102 private CreateStack mockCreateStack;
104 private String cloudSiteId = "cloudSiteId";
105 private String tenantId = "tenantId";
108 public void setup() {
109 doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
110 doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
114 public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
115 Stack stack = new Stack();
117 stack.setStackName("stackName");
118 stack.setStackStatus("CREATE_IN_PROGRESS");
119 stack.setStackStatusReason("Stack Finished");
121 Stack latestStack = new Stack();
122 latestStack.setId("id");
123 latestStack.setStackName("stackName");
124 latestStack.setStackStatus("CREATE_COMPLETE");
125 latestStack.setStackStatusReason("Stack Finished");
126 doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
127 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
128 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
129 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
130 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
131 assertEquals(true, actual != null);
136 public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
137 Stack stack = new Stack();
139 stack.setStackName("stackName");
140 stack.setStackStatus("CREATE_IN_PROGRESS");
141 stack.setStackStatusReason("Stack Finished");
142 doNothing().when(stackStatusHandler).updateStackStatus(stack);
143 doReturn(stack).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);
146 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
147 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
148 assertEquals(true, actual != null);
152 public final void postProcessStackCreate_CREATE_IN_PROGRESS_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 CreateStackParam createStackParam = new CreateStackParam();
159 createStackParam.setStackName("stackName");
161 exceptionRule.expect(StackCreationException.class);
162 exceptionRule.expectMessage("Stack rollback suppressed, stack not deleted");
163 heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
167 public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
168 Stack stack = new Stack();
170 stack.setStackName("stackName");
171 stack.setStackStatus("CREATE_IN_PROGRESS");
172 stack.setStackStatusReason("Stack Finished");
174 Stack deletedStack = new Stack();
175 deletedStack.setId("id");
176 deletedStack.setStackName("stackName");
177 deletedStack.setStackStatus("DELETE_COMPLETE");
178 deletedStack.setStackStatusReason("Stack Deleted");
180 CreateStackParam createStackParam = new CreateStackParam();
181 createStackParam.setStackName("stackName");
182 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
183 exceptionRule.expect(StackCreationException.class);
184 exceptionRule.expectMessage(
185 "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");
186 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
187 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
191 public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
192 Stack stack = new Stack();
194 stack.setStackName("stackName");
195 stack.setStackStatus("CREATE_IN_PROGRESS");
196 stack.setStackStatusReason(
197 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
199 Stack createdStack = new Stack();
200 createdStack.setId("id");
201 createdStack.setStackName("stackName");
202 createdStack.setStackStatus("CREATE_COMPLETE");
203 createdStack.setStackStatusReason("Stack Created");
205 CreateStackParam createStackParam = new CreateStackParam();
206 createStackParam.setStackName("stackName");
207 doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
209 heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
210 Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
215 public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
217 Stack stack = new Stack();
219 stack.setStackName("stackName");
220 stack.setStackStatus("CREATE_FAILED");
221 stack.setStackStatusReason(
222 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
224 Stack deletedStack = new Stack();
225 deletedStack.setId("id");
226 deletedStack.setStackName("stackName");
227 deletedStack.setStackStatus("DELETE_COMPLETE");
228 deletedStack.setStackStatusReason("Stack Deleted");
230 CreateStackParam createStackParam = new CreateStackParam();
231 createStackParam.setStackName("stackName");
232 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
233 doNothing().when(heatUtils).postProcessStackDelete(deletedStack);
234 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
235 doReturn(stackResource).when(heatClient).getStacks();
236 doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
237 doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
240 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
241 Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
242 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId);
243 Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
248 public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
250 exceptionRule.expect(StackCreationException.class);
251 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
252 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
256 public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
257 Stack deletedStack = new Stack();
258 deletedStack.setId("id");
259 deletedStack.setStackName("stackName");
260 deletedStack.setStackStatus("DELETE_FAILED");
261 deletedStack.setStackStatusReason("Stack DID NOT DELETE");
262 exceptionRule.expect(StackRollbackException.class);
263 exceptionRule.expectMessage(
264 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
265 heatUtils.postProcessStackDelete(deletedStack);
269 public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
271 exceptionRule.expect(StackRollbackException.class);
272 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
273 heatUtils.postProcessStackDelete(stack);
277 public final void isKeyPairFailure_Test() throws MsoException, IOException {
278 boolean actual = heatUtils.isKeyPairFailure(
279 "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'");
280 assertEquals(true, actual);
284 public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
285 Stack stack = new Stack();
287 stack.setStackName("stackName");
288 stack.setStackStatus("CREATE_FAILED");
289 stack.setStackStatusReason(
290 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
292 Stack createdStack = new Stack();
293 createdStack.setId("id");
294 createdStack.setStackName("stackName");
295 createdStack.setStackStatus("CREATE_COMPLETE");
296 createdStack.setStackStatusReason("Stack Created");
300 List<Resource> resources = new ArrayList<>();
301 Resource resource = new Resource();
302 resource.setName("KeypairName");
303 resource.setLogicalResourceId("KeypairName");
304 resource.setType("OS::Nova::KeyPair");
305 resources.add(resource);
307 CreateStackParam createStackParam = new CreateStackParam();
308 createStackParam.setStackName("stackName");
310 doReturn(resources).when(mockResources).getList();
311 doReturn(mockResources).when(heatUtils).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
312 doNothing().when(novaClient).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
313 doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
314 doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
315 doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
316 createStackParam, false);
318 heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
319 Mockito.verify(heatUtils, times(1)).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
320 Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
321 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
322 Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
323 Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
324 createStackParam, false);
328 public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
329 Stack stack = new Stack();
331 stack.setStackName("stackName");
332 stack.setStackStatus("CREATE_FAILED");
333 stack.setStackStatusReason(
334 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
336 Stack createdStack = new Stack();
337 createdStack.setId("id");
338 createdStack.setStackName("stackName");
339 createdStack.setStackStatus("CREATE_COMPLETE");
340 createdStack.setStackStatusReason("Stack Created");
343 CreateStackParam createStackParam = new CreateStackParam();
344 createStackParam.setStackName("stackName");
346 doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
348 doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
349 tenantId, createStackParam);
351 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
352 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
353 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
358 public final void processCreateStack_Exception_Backout_Test()
359 throws MsoException, IOException, NovaClientException {
360 Stack stack = new Stack();
362 stack.setStackName("stackName");
363 stack.setStackStatus("CREATE_FAILED");
364 stack.setStackStatusReason(
365 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
367 Stack deletedStack = new Stack();
368 deletedStack.setId("id");
369 deletedStack.setStackName("stackName");
370 deletedStack.setStackStatus("DELETE_COMPLETE");
371 deletedStack.setStackStatusReason("Stack Deleted");
373 CreateStackParam createStackParam = new CreateStackParam();
374 createStackParam.setStackName("stackName");
376 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
377 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
378 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
379 exceptionRule.expect(MsoException.class);
380 exceptionRule.expectMessage("Error");
381 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
382 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
383 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
388 public final void createStack_Test() throws MsoException, IOException, NovaClientException {
389 CreateStackParam createStackParam = new CreateStackParam();
390 createStackParam.setStackName("stackName");
392 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
393 doReturn(stackResource).when(heatClient).getStacks();
394 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
396 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
398 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
399 Mockito.verify(stackResource, times(1)).create(createStackParam);
400 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
401 Mockito.verify(heatClient, times(1)).getStacks();
402 Mockito.verify(stackResource, times(1)).create(createStackParam);
406 public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
407 CreateStackParam createStackParam = new CreateStackParam();
408 createStackParam.setStackName("stackName");
409 Map<String, Object> parameters = new HashMap<String, Object>();
410 parameters.put("test", "value");
411 createStackParam.setParameters(parameters);
412 InfraActiveRequests request = new InfraActiveRequests();
413 request.setRequestId("requestId");
414 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
415 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
416 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
417 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
418 assertNotNull(request.getCloudApiRequests().get(0));
419 assertEquals(request.getCloudApiRequests().get(0).getRequestId(), "requestId");
423 public final void saveStack__Exists_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");
428 createStackParam.setParameters(parameters);
429 InfraActiveRequests request = new InfraActiveRequests();
430 request.setRequestId("requestId");
431 CloudApiRequests cloudRequest = new CloudApiRequests();
432 cloudRequest.setCloudIdentifier("stackName");
433 cloudRequest.setRequestBody("testMe");
434 cloudRequest.setRequestId("requestId");
435 request.getCloudApiRequests().add(cloudRequest);
436 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
437 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
438 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
439 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
440 assertNotNull(request.getCloudApiRequests().get(0));
441 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
442 assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
446 public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
447 CreateStackParam createStackParam = new CreateStackParam();
448 createStackParam.setStackName("stackName");
450 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
451 doReturn(stackResource).when(heatClient).getStacks();
452 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
454 doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
455 .executeAndRecordOpenstackRequest(mockCreateStack);
456 exceptionRule.expect(MsoOpenstackException.class);
457 exceptionRule.expectMessage("Unknown Error");
458 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
459 Mockito.verify(stackResource, times(1)).create(createStackParam);
460 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
461 Mockito.verify(heatClient, times(1)).getStacks();
462 Mockito.verify(stackResource, times(1)).create(createStackParam);
466 public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
467 CreateStackParam createStackParam = new CreateStackParam();
468 createStackParam.setStackName("stackName");
470 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
471 doReturn(stackResource).when(heatClient).getStacks();
472 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
474 doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
475 .executeAndRecordOpenstackRequest(mockCreateStack);
476 exceptionRule.expect(MsoStackAlreadyExists.class);
477 exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
478 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
479 Mockito.verify(stackResource, times(1)).create(createStackParam);
480 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
481 Mockito.verify(heatClient, times(1)).getStacks();
482 Mockito.verify(stackResource, times(1)).create(createStackParam);
486 public final void processCreateStack_Exception_No_Backout_Test()
487 throws MsoException, IOException, NovaClientException {
488 Stack stack = new Stack();
490 stack.setStackName("stackName");
491 stack.setStackStatus("CREATE_FAILED");
492 stack.setStackStatusReason(
493 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
495 Stack deletedStack = new Stack();
496 deletedStack.setId("id");
497 deletedStack.setStackName("stackName");
498 deletedStack.setStackStatus("DELETE_COMPLETE");
499 deletedStack.setStackStatusReason("Stack Deleted");
501 CreateStackParam createStackParam = new CreateStackParam();
502 createStackParam.setStackName("stackName");
504 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
505 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
507 exceptionRule.expect(MsoException.class);
508 exceptionRule.expectMessage("Error");
509 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
510 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
511 Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);