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.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;
57 import org.springframework.core.env.Environment;
58 import com.fasterxml.jackson.databind.ObjectMapper;
59 import com.woorea.openstack.base.client.OpenStackResponseException;
60 import com.woorea.openstack.heat.Heat;
61 import com.woorea.openstack.heat.StackResource;
62 import com.woorea.openstack.heat.StackResource.CreateStack;
63 import com.woorea.openstack.heat.StackResource.DeleteStack;
64 import com.woorea.openstack.heat.model.CreateStackParam;
65 import com.woorea.openstack.heat.model.Resources;
66 import com.woorea.openstack.heat.model.Stack;
67 import java.util.UUID;
69 @RunWith(MockitoJUnitRunner.class)
70 public class MsoHeatUtilsTest extends MsoHeatUtils {
73 public ExpectedException exceptionRule = ExpectedException.none();
77 private MsoHeatUtils heatUtils;
80 private RequestsDbClient requestDbClient;
83 private Heat heatClient;
86 private StackStatusHandler stackStatusHandler;
89 private Environment env;
92 private StackResource stackResource;
95 private NovaClientImpl novaClient;
98 private DeleteStack mockDeleteStack;
101 private Resources mockResources;
104 private CreateStack mockCreateStack;
106 private String cloudSiteId = "cloudSiteId";
107 private String tenantId = "tenantId";
109 private String getRequestId() {
110 return MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
114 public void setup() {
115 doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
116 String requestId = UUID.randomUUID().toString();
117 MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
121 public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
122 Stack stack = new Stack();
124 stack.setStackName("stackName");
125 stack.setStackStatus("CREATE_IN_PROGRESS");
126 stack.setStackStatusReason("Stack Finished");
128 String requestId = getRequestId();
129 Stack latestStack = new Stack();
130 latestStack.setId("id");
131 latestStack.setStackName("stackName");
132 latestStack.setStackStatus("CREATE_COMPLETE");
133 latestStack.setStackStatusReason("Stack Finished");
134 doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
135 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
136 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
137 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack, requestId);
138 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
139 assertEquals(true, actual != null);
143 public final void pollStackForStatus_No_Polling_Test() throws MsoException, IOException {
144 Stack stack = new Stack();
146 stack.setStackName("stackName");
147 stack.setStackStatus("CREATE_IN_PROGRESS");
148 stack.setStackStatusReason("Stack Finished");
149 String requestId = getRequestId();
150 doNothing().when(stackStatusHandler).updateStackStatus(stack, requestId);
151 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
152 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
153 doReturn("61").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
154 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
155 Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack, requestId);
156 Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
157 assertEquals(true, actual != null);
161 public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
162 Stack stack = new Stack();
164 stack.setStackName("stackName");
165 stack.setStackStatus("CREATE_IN_PROGRESS");
166 stack.setStackStatusReason("Stack Finished");
167 String requestId = getRequestId();
168 doNothing().when(stackStatusHandler).updateStackStatus(stack, requestId);
169 doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
170 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
171 Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
172 Mockito.verify(stackStatusHandler, times(5)).updateStackStatus(stack, requestId);
173 Mockito.verify(heatUtils, times(5)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
174 assertEquals(true, actual != null);
178 public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
179 Stack stack = new Stack();
181 stack.setStackName("stackName");
182 stack.setStackStatus("CREATE_IN_PROGRESS");
183 stack.setStackStatusReason("Stack In Progress");
184 CreateStackParam createStackParam = new CreateStackParam();
185 createStackParam.setStackName("stackName");
187 exceptionRule.expect(StackCreationException.class);
188 exceptionRule.expectMessage(
189 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack In Progress. Stack rollback suppressed, stack not deleted");
190 heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
194 public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
195 Stack stack = new Stack();
197 stack.setStackName("stackName");
198 stack.setStackStatus("CREATE_IN_PROGRESS");
199 stack.setStackStatusReason("Stack Finished");
201 Stack deletedStack = new Stack();
202 deletedStack.setId("id");
203 deletedStack.setStackName("stackName");
204 deletedStack.setStackStatus("DELETE_COMPLETE");
205 deletedStack.setStackStatusReason("Stack Deleted");
207 CreateStackParam createStackParam = new CreateStackParam();
208 createStackParam.setStackName("stackName");
209 doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
210 exceptionRule.expect(StackCreationException.class);
211 exceptionRule.expectMessage(
212 "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");
213 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
214 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
218 public final void postProcessStackCreate_Backout_True_Delete_Fail_Test() throws MsoException, IOException {
219 Stack stack = new Stack();
221 stack.setStackName("stackName");
222 stack.setStackStatus("CREATE_IN_PROGRESS");
223 stack.setStackStatusReason("Stack Finished");
225 Stack deletedStack = new Stack();
226 deletedStack.setId("id");
227 deletedStack.setStackName("stackName");
228 deletedStack.setStackStatus("DELETE_COMPLETE");
229 deletedStack.setStackStatusReason("Stack Deleted");
231 CreateStackParam createStackParam = new CreateStackParam();
232 createStackParam.setStackName("stackName");
233 doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
234 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
235 exceptionRule.expect(MsoException.class);
236 exceptionRule.expectMessage(
237 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
238 heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
239 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
243 public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
244 Stack stack = new Stack();
246 stack.setStackName("stackName");
247 stack.setStackStatus("CREATE_IN_PROGRESS");
248 stack.setStackStatusReason(
249 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
251 Stack createdStack = new Stack();
252 createdStack.setId("id");
253 createdStack.setStackName("stackName");
254 createdStack.setStackStatus("CREATE_COMPLETE");
255 createdStack.setStackStatusReason("Stack Created");
257 CreateStackParam createStackParam = new CreateStackParam();
258 createStackParam.setStackName("stackName");
259 doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
261 heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
262 Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
267 public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
269 Stack stack = new Stack();
271 stack.setStackName("stackName");
272 stack.setStackStatus("CREATE_FAILED");
273 stack.setStackStatusReason(
274 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
276 Stack deletedStack = new Stack();
277 deletedStack.setId("id");
278 deletedStack.setStackName("stackName");
279 deletedStack.setStackStatus("DELETE_COMPLETE");
280 deletedStack.setStackStatusReason("Stack Deleted");
282 CreateStackParam createStackParam = new CreateStackParam();
283 createStackParam.setStackName("stackName");
284 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
285 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
286 doReturn(stackResource).when(heatClient).getStacks();
287 doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
289 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
290 Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
291 Mockito.verify(heatUtils, times(0)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId,
293 Mockito.verify(heatUtils, times(0)).postProcessStackDelete(deletedStack);
298 public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
300 exceptionRule.expect(StackCreationException.class);
301 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
302 heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
306 public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
307 Stack deletedStack = new Stack();
308 deletedStack.setId("id");
309 deletedStack.setStackName("stackName");
310 deletedStack.setStackStatus("DELETE_FAILED");
311 deletedStack.setStackStatusReason("Stack DID NOT DELETE");
312 exceptionRule.expect(StackRollbackException.class);
313 exceptionRule.expectMessage(
314 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
315 heatUtils.postProcessStackDelete(deletedStack);
319 public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
321 exceptionRule.expect(StackRollbackException.class);
322 exceptionRule.expectMessage("Cannot Find Stack Name or Id");
323 heatUtils.postProcessStackDelete(stack);
327 public final void isKeyPairFailure_Test() throws MsoException, IOException {
328 boolean actual = heatUtils.isKeyPairFailure(
329 "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'");
330 assertEquals(true, actual);
334 public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
335 Stack stack = new Stack();
337 stack.setStackName("stackName");
338 stack.setStackStatus("CREATE_FAILED");
339 stack.setStackStatusReason(
340 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
342 Stack createdStack = new Stack();
343 createdStack.setId("id");
344 createdStack.setStackName("stackName");
345 createdStack.setStackStatus("CREATE_COMPLETE");
346 createdStack.setStackStatusReason("Stack Created");
348 CreateStackParam createStackParam = new CreateStackParam();
349 createStackParam.setStackName("stackName");
351 doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
352 doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
353 doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
354 createStackParam, false);
356 heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
357 Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
358 Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
359 Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
360 Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
361 createStackParam, false);
365 public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
366 Stack stack = new Stack();
368 stack.setStackName("stackName");
369 stack.setStackStatus("CREATE_FAILED");
370 stack.setStackStatusReason(
371 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
373 Stack createdStack = new Stack();
374 createdStack.setId("id");
375 createdStack.setStackName("stackName");
376 createdStack.setStackStatus("CREATE_COMPLETE");
377 createdStack.setStackStatusReason("Stack Created");
380 CreateStackParam createStackParam = new CreateStackParam();
381 createStackParam.setStackName("stackName");
383 doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
385 doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
386 tenantId, createStackParam);
388 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
389 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
391 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
396 public final void processCreateStack_Exception_Backout_Test()
397 throws MsoException, IOException, NovaClientException {
398 Stack stack = new Stack();
400 stack.setStackName("stackName");
401 stack.setStackStatus("CREATE_FAILED");
402 stack.setStackStatusReason(
403 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
405 Stack deletedStack = new Stack();
406 deletedStack.setId("id");
407 deletedStack.setStackName("stackName");
408 deletedStack.setStackStatus("DELETE_COMPLETE");
409 deletedStack.setStackStatusReason("Stack Deleted");
411 CreateStackParam createStackParam = new CreateStackParam();
412 createStackParam.setStackName("stackName");
414 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
415 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
416 exceptionRule.expect(MsoException.class);
417 exceptionRule.expectMessage("Error");
418 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
419 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
421 Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
427 public final void createStack_Test() throws MsoException, IOException, NovaClientException {
428 CreateStackParam createStackParam = new CreateStackParam();
429 createStackParam.setStackName("stackName");
431 String requestId = getRequestId();
432 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
433 doReturn(stackResource).when(heatClient).getStacks();
434 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
436 doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
438 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
439 Mockito.verify(stackResource, times(1)).create(createStackParam);
440 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), eq(requestId), eq("stackName"));
441 Mockito.verify(heatClient, times(1)).getStacks();
442 Mockito.verify(stackResource, times(1)).create(createStackParam);
446 public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
448 CreateStackParam createStackParam = new CreateStackParam();
449 createStackParam.setStackName("stackName");
450 Map<String, Object> parameters = new HashMap<String, Object>();
451 parameters.put("test", "value");
453 "parameters:\n mmn_volume_name_1: \"data-mn-v-vdb\"\n mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
454 createStackParam.setParameters(parameters);
455 createStackParam.setEnvironment(environment);
457 CreateStackRequest createStackRequest = new CreateStackRequest();
458 createStackRequest.setEnvironment(environment);
459 createStackRequest.setParameters(parameters);
460 ObjectMapper mapper = new ObjectMapper();
461 String stackRequest = mapper.writeValueAsString(createStackRequest);
463 InfraActiveRequests request = new InfraActiveRequests();
464 request.setRequestId("requestId");
465 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
466 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
467 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
468 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
469 assertNotNull(request.getCloudApiRequests().get(0));
470 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
471 assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
475 public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
476 CreateStackParam createStackParam = new CreateStackParam();
477 createStackParam.setStackName("stackName");
478 Map<String, Object> parameters = new HashMap<String, Object>();
479 parameters.put("test", "value");
480 createStackParam.setParameters(parameters);
481 InfraActiveRequests request = new InfraActiveRequests();
482 request.setRequestId("requestId");
483 CloudApiRequests cloudRequest = new CloudApiRequests();
484 cloudRequest.setCloudIdentifier("stackName");
485 cloudRequest.setRequestBody("testMe");
486 cloudRequest.setRequestId("requestId");
487 request.getCloudApiRequests().add(cloudRequest);
488 doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
489 doNothing().when(requestDbClient).updateInfraActiveRequests(request);
490 heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
491 Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
492 assertNotNull(request.getCloudApiRequests().get(0));
493 assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
494 assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
498 public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
499 CreateStackParam createStackParam = new CreateStackParam();
500 createStackParam.setStackName("stackName");
502 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
503 doReturn(stackResource).when(heatClient).getStacks();
504 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
506 doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
507 .executeAndRecordOpenstackRequest(mockCreateStack);
508 exceptionRule.expect(MsoOpenstackException.class);
509 exceptionRule.expectMessage("Unknown Error");
510 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
511 Mockito.verify(stackResource, times(1)).create(createStackParam);
512 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
513 Mockito.verify(heatClient, times(1)).getStacks();
514 Mockito.verify(stackResource, times(1)).create(createStackParam);
518 public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
519 CreateStackParam createStackParam = new CreateStackParam();
520 createStackParam.setStackName("stackName");
522 doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
523 doReturn(stackResource).when(heatClient).getStacks();
524 doReturn(mockCreateStack).when(stackResource).create(createStackParam);
526 doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
527 .executeAndRecordOpenstackRequest(mockCreateStack);
528 exceptionRule.expect(MsoStackAlreadyExists.class);
529 exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
530 heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
531 Mockito.verify(stackResource, times(1)).create(createStackParam);
532 Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
533 Mockito.verify(heatClient, times(1)).getStacks();
534 Mockito.verify(stackResource, times(1)).create(createStackParam);
538 public final void processCreateStack_Exception_No_Backout_Test()
539 throws MsoException, IOException, NovaClientException {
540 Stack stack = new Stack();
542 stack.setStackName("stackName");
543 stack.setStackStatus("CREATE_FAILED");
544 stack.setStackStatusReason(
545 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
547 Stack deletedStack = new Stack();
548 deletedStack.setId("id");
549 deletedStack.setStackName("stackName");
550 deletedStack.setStackStatus("DELETE_COMPLETE");
551 deletedStack.setStackStatusReason("Stack Deleted");
553 CreateStackParam createStackParam = new CreateStackParam();
554 createStackParam.setStackName("stackName");
556 doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
557 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
559 exceptionRule.expect(MsoException.class);
560 exceptionRule.expectMessage("Error");
561 heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
562 Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
564 Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);