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.Ignore;
40 import org.junit.Rule;
41 import org.junit.Test;
42 import org.junit.rules.ExpectedException;
43 import org.junit.runner.RunWith;
44 import org.mockito.InjectMocks;
45 import org.mockito.Mock;
46 import org.mockito.Mockito;
47 import org.mockito.Spy;
48 import org.mockito.junit.MockitoJUnitRunner;
49 import org.onap.so.db.request.beans.CloudApiRequests;
50 import org.onap.so.db.request.beans.InfraActiveRequests;
51 import org.onap.so.db.request.client.RequestsDbClient;
52 import org.onap.so.openstack.beans.CreateStackRequest;
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.fasterxml.jackson.databind.ObjectMapper;
58 import com.woorea.openstack.base.client.OpenStackResponseException;
59 import com.woorea.openstack.heat.Heat;
60 import com.woorea.openstack.heat.StackResource;
61 import com.woorea.openstack.heat.StackResource.CreateStack;
62 import com.woorea.openstack.heat.StackResource.DeleteStack;
63 import com.woorea.openstack.heat.model.CreateStackParam;
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");
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);
134 public final void pollStackForStatus_No_Polling_Test() throws MsoException, IOException {
135 Stack stack = new Stack();
137 stack.setStackName("stackName");
138 stack.setStackStatus("CREATE_IN_PROGRESS");
139 stack.setStackStatusReason("Stack Finished");
140 doNothing().when(stackStatusHandler).updateStackStatus(stack);
141 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
142 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
143 doReturn("61").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
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 pollStackForStatus_Polling_Exhausted_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 doNothing().when(stackStatusHandler).updateStackStatus(stack);
158 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
159 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
160 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
161 Mockito.verify(stackStatusHandler, times(5)).updateStackStatus(stack);
162 Mockito.verify(heatUtils, times(5)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
163 assertEquals(true, actual != null);
167 public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
168 Stack stack = new Stack();
170 stack.setStackName("stackName");
171 stack.setStackStatus("CREATE_IN_PROGRESS");
172 stack.setStackStatusReason("Stack In Progress");
173 CreateStackParam createStackParam = new CreateStackParam();
174 createStackParam.setStackName("stackName");
176 exceptionRule.expect(StackCreationException.class);
177 exceptionRule.expectMessage(
178 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack In Progress. Stack rollback suppressed, stack not deleted");
179 heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
183 public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
184 Stack stack = new Stack();
186 stack.setStackName("stackName");
187 stack.setStackStatus("CREATE_IN_PROGRESS");
188 stack.setStackStatusReason("Stack Finished");
190 Stack deletedStack = new Stack();
191 deletedStack.setId("id");
192 deletedStack.setStackName("stackName");
193 deletedStack.setStackStatus("DELETE_COMPLETE");
194 deletedStack.setStackStatusReason("Stack Deleted");
196 CreateStackParam createStackParam = new CreateStackParam();
197 createStackParam.setStackName("stackName");
198 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
199 exceptionRule.expect(StackCreationException.class);
200 exceptionRule.expectMessage(
201 "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");
202 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
203 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
207 public final void postProcessStackCreate_Backout_True_Delete_Fail_Test() throws MsoException, IOException {
208 Stack stack = new Stack();
210 stack.setStackName("stackName");
211 stack.setStackStatus("CREATE_IN_PROGRESS");
212 stack.setStackStatusReason("Stack Finished");
214 Stack deletedStack = new Stack();
215 deletedStack.setId("id");
216 deletedStack.setStackName("stackName");
217 deletedStack.setStackStatus("DELETE_COMPLETE");
218 deletedStack.setStackStatusReason("Stack Deleted");
220 CreateStackParam createStackParam = new CreateStackParam();
221 createStackParam.setStackName("stackName");
222 doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
223 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
224 exceptionRule.expect(MsoException.class);
225 exceptionRule.expectMessage(
226 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
227 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
228 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
232 public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
233 Stack stack = new Stack();
235 stack.setStackName("stackName");
236 stack.setStackStatus("CREATE_IN_PROGRESS");
237 stack.setStackStatusReason(
238 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
240 Stack createdStack = new Stack();
241 createdStack.setId("id");
242 createdStack.setStackName("stackName");
243 createdStack.setStackStatus("CREATE_COMPLETE");
244 createdStack.setStackStatusReason("Stack Created");
246 CreateStackParam createStackParam = new CreateStackParam();
247 createStackParam.setStackName("stackName");
248 doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
250 heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
251 Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
256 public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
258 Stack stack = new Stack();
260 stack.setStackName("stackName");
261 stack.setStackStatus("CREATE_FAILED");
262 stack.setStackStatusReason(
263 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
265 Stack deletedStack = new Stack();
266 deletedStack.setId("id");
267 deletedStack.setStackName("stackName");
268 deletedStack.setStackStatus("DELETE_COMPLETE");
269 deletedStack.setStackStatusReason("Stack Deleted");
271 CreateStackParam createStackParam = new CreateStackParam();
272 createStackParam.setStackName("stackName");
273 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
274 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
275 doReturn(stackResource).when(heatClient).getStacks();
276 doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
278 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
279 Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
280 Mockito.verify(heatUtils, times(0)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId,
282 Mockito.verify(heatUtils, times(0)).postProcessStackDelete(deletedStack);
287 public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
289 exceptionRule.expect(StackCreationException.class);
290 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
291 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
295 public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
296 Stack deletedStack = new Stack();
297 deletedStack.setId("id");
298 deletedStack.setStackName("stackName");
299 deletedStack.setStackStatus("DELETE_FAILED");
300 deletedStack.setStackStatusReason("Stack DID NOT DELETE");
301 exceptionRule.expect(StackRollbackException.class);
302 exceptionRule.expectMessage(
303 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
304 heatUtils.postProcessStackDelete(deletedStack);
308 public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
310 exceptionRule.expect(StackRollbackException.class);
311 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
312 heatUtils.postProcessStackDelete(stack);
316 public final void isKeyPairFailure_Test() throws MsoException, IOException {
317 boolean actual = heatUtils.isKeyPairFailure(
318 "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'");
319 assertEquals(true, actual);
323 public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
324 Stack stack = new Stack();
326 stack.setStackName("stackName");
327 stack.setStackStatus("CREATE_FAILED");
328 stack.setStackStatusReason(
329 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
331 Stack createdStack = new Stack();
332 createdStack.setId("id");
333 createdStack.setStackName("stackName");
334 createdStack.setStackStatus("CREATE_COMPLETE");
335 createdStack.setStackStatusReason("Stack Created");
337 CreateStackParam createStackParam = new CreateStackParam();
338 createStackParam.setStackName("stackName");
340 doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
341 doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
342 doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
343 createStackParam, false);
345 heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
346 Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
347 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
348 Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
349 Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
350 createStackParam, false);
354 public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
355 Stack stack = new Stack();
357 stack.setStackName("stackName");
358 stack.setStackStatus("CREATE_FAILED");
359 stack.setStackStatusReason(
360 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
362 Stack createdStack = new Stack();
363 createdStack.setId("id");
364 createdStack.setStackName("stackName");
365 createdStack.setStackStatus("CREATE_COMPLETE");
366 createdStack.setStackStatusReason("Stack Created");
369 CreateStackParam createStackParam = new CreateStackParam();
370 createStackParam.setStackName("stackName");
372 doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
374 doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
375 tenantId, createStackParam);
377 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
378 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
380 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
385 public final void processCreateStack_Exception_Backout_Test()
386 throws MsoException, IOException, NovaClientException {
387 Stack stack = new Stack();
389 stack.setStackName("stackName");
390 stack.setStackStatus("CREATE_FAILED");
391 stack.setStackStatusReason(
392 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
394 Stack deletedStack = new Stack();
395 deletedStack.setId("id");
396 deletedStack.setStackName("stackName");
397 deletedStack.setStackStatus("DELETE_COMPLETE");
398 deletedStack.setStackStatusReason("Stack Deleted");
400 CreateStackParam createStackParam = new CreateStackParam();
401 createStackParam.setStackName("stackName");
403 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
404 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
405 exceptionRule.expect(MsoException.class);
406 exceptionRule.expectMessage("Error");
407 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
408 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
410 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
416 public final void createStack_Test() throws MsoException, IOException, NovaClientException {
417 CreateStackParam createStackParam = new CreateStackParam();
418 createStackParam.setStackName("stackName");
420 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
421 doReturn(stackResource).when(heatClient).getStacks();
422 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
424 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
426 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
427 Mockito.verify(stackResource, times(1)).create(createStackParam);
428 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
429 Mockito.verify(heatClient, times(1)).getStacks();
430 Mockito.verify(stackResource, times(1)).create(createStackParam);
434 public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
436 CreateStackParam createStackParam = new CreateStackParam();
437 createStackParam.setStackName("stackName");
438 Map<String, Object> parameters = new HashMap<String, Object>();
439 parameters.put("test", "value");
441 "parameters:\n mmn_volume_name_1: \"data-mn-v-vdb\"\n mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
442 createStackParam.setParameters(parameters);
443 createStackParam.setEnvironment(environment);
445 CreateStackRequest createStackRequest = new CreateStackRequest();
446 createStackRequest.setEnvironment(environment);
447 createStackRequest.setParameters(parameters);
448 ObjectMapper mapper = new ObjectMapper();
449 String stackRequest = mapper.writeValueAsString(createStackRequest);
451 InfraActiveRequests request = new InfraActiveRequests();
452 request.setRequestId("requestId");
453 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
454 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
455 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
456 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
457 assertNotNull(request.getCloudApiRequests().get(0));
458 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
459 assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
463 public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
464 CreateStackParam createStackParam = new CreateStackParam();
465 createStackParam.setStackName("stackName");
466 Map<String, Object> parameters = new HashMap<String, Object>();
467 parameters.put("test", "value");
468 createStackParam.setParameters(parameters);
469 InfraActiveRequests request = new InfraActiveRequests();
470 request.setRequestId("requestId");
471 CloudApiRequests cloudRequest = new CloudApiRequests();
472 cloudRequest.setCloudIdentifier("stackName");
473 cloudRequest.setRequestBody("testMe");
474 cloudRequest.setRequestId("requestId");
475 request.getCloudApiRequests().add(cloudRequest);
476 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
477 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
478 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
479 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
480 assertNotNull(request.getCloudApiRequests().get(0));
481 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
482 assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
486 public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
487 CreateStackParam createStackParam = new CreateStackParam();
488 createStackParam.setStackName("stackName");
490 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
491 doReturn(stackResource).when(heatClient).getStacks();
492 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
494 doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
495 .executeAndRecordOpenstackRequest(mockCreateStack);
496 exceptionRule.expect(MsoOpenstackException.class);
497 exceptionRule.expectMessage("Unknown Error");
498 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
499 Mockito.verify(stackResource, times(1)).create(createStackParam);
500 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
501 Mockito.verify(heatClient, times(1)).getStacks();
502 Mockito.verify(stackResource, times(1)).create(createStackParam);
506 public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
507 CreateStackParam createStackParam = new CreateStackParam();
508 createStackParam.setStackName("stackName");
510 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
511 doReturn(stackResource).when(heatClient).getStacks();
512 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
514 doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
515 .executeAndRecordOpenstackRequest(mockCreateStack);
516 exceptionRule.expect(MsoStackAlreadyExists.class);
517 exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
518 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
519 Mockito.verify(stackResource, times(1)).create(createStackParam);
520 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
521 Mockito.verify(heatClient, times(1)).getStacks();
522 Mockito.verify(stackResource, times(1)).create(createStackParam);
526 public final void processCreateStack_Exception_No_Backout_Test()
527 throws MsoException, IOException, NovaClientException {
528 Stack stack = new Stack();
530 stack.setStackName("stackName");
531 stack.setStackStatus("CREATE_FAILED");
532 stack.setStackStatusReason(
533 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
535 Stack deletedStack = new Stack();
536 deletedStack.setId("id");
537 deletedStack.setStackName("stackName");
538 deletedStack.setStackStatus("DELETE_COMPLETE");
539 deletedStack.setStackStatusReason("Stack Deleted");
541 CreateStackParam createStackParam = new CreateStackParam();
542 createStackParam.setStackName("stackName");
544 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
545 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
547 exceptionRule.expect(MsoException.class);
548 exceptionRule.expectMessage("Error");
549 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
550 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
552 Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);