Use Regex to find the name on failure scenario
[so.git] / adapters / mso-adapter-utils / src / test / java / org / onap / so / openstack / utils / MsoHeatUtilsTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.onap.so.openstack.utils;
22
23
24
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;
37 import java.util.Map;
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.exceptions.MsoException;
52 import org.onap.so.openstack.exceptions.MsoOpenstackException;
53 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
54 import org.springframework.core.env.Environment;
55 import com.woorea.openstack.base.client.OpenStackResponseException;
56 import com.woorea.openstack.heat.Heat;
57 import com.woorea.openstack.heat.StackResource;
58 import com.woorea.openstack.heat.StackResource.CreateStack;
59 import com.woorea.openstack.heat.StackResource.DeleteStack;
60 import com.woorea.openstack.heat.model.CreateStackParam;
61 import com.woorea.openstack.heat.model.Resources;
62 import com.woorea.openstack.heat.model.Stack;
63
64 @RunWith(MockitoJUnitRunner.class)
65 public class MsoHeatUtilsTest extends MsoHeatUtils {
66
67     @Rule
68     public ExpectedException exceptionRule = ExpectedException.none();
69
70     @Spy
71     @InjectMocks
72     private MsoHeatUtils heatUtils;
73
74     @Mock
75     private RequestsDbClient requestDbClient;
76
77     @Mock
78     private Heat heatClient;
79
80     @Mock
81     private StackStatusHandler stackStatusHandler;
82
83     @Mock
84     private Environment env;
85
86     @Mock
87     private StackResource stackResource;
88
89     @Mock
90     private NovaClientImpl novaClient;
91
92     @Mock
93     private DeleteStack mockDeleteStack;
94
95     @Mock
96     private Resources mockResources;
97
98     @Mock
99     private CreateStack mockCreateStack;
100
101     private String cloudSiteId = "cloudSiteId";
102     private String tenantId = "tenantId";
103
104     @Before
105     public void setup() {
106         doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
107         doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
108     }
109
110     @Test
111     public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
112         Stack stack = new Stack();
113         stack.setId("id");
114         stack.setStackName("stackName");
115         stack.setStackStatus("CREATE_IN_PROGRESS");
116         stack.setStackStatusReason("Stack Finished");
117
118         Stack latestStack = new Stack();
119         latestStack.setId("id");
120         latestStack.setStackName("stackName");
121         latestStack.setStackStatus("CREATE_COMPLETE");
122         latestStack.setStackStatusReason("Stack Finished");
123         doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
124         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
125         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
126         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
127         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
128         assertEquals(true, actual != null);
129     }
130
131
132     @Test
133     public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
134         Stack stack = new Stack();
135         stack.setId("id");
136         stack.setStackName("stackName");
137         stack.setStackStatus("CREATE_IN_PROGRESS");
138         stack.setStackStatusReason("Stack Finished");
139         doNothing().when(stackStatusHandler).updateStackStatus(stack);
140         doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
141         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
142         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
143         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
144         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
145         assertEquals(true, actual != null);
146     }
147
148     @Test
149     public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
150         Stack stack = new Stack();
151         stack.setId("id");
152         stack.setStackName("stackName");
153         stack.setStackStatus("CREATE_IN_PROGRESS");
154         stack.setStackStatusReason("Stack Finished");
155         CreateStackParam createStackParam = new CreateStackParam();
156         createStackParam.setStackName("stackName");
157
158         exceptionRule.expect(StackCreationException.class);
159         exceptionRule.expectMessage("Stack rollback suppressed, stack not deleted");
160         heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
161     }
162
163     @Test
164     public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
165         Stack stack = new Stack();
166         stack.setId("id");
167         stack.setStackName("stackName");
168         stack.setStackStatus("CREATE_IN_PROGRESS");
169         stack.setStackStatusReason("Stack Finished");
170
171         Stack deletedStack = new Stack();
172         deletedStack.setId("id");
173         deletedStack.setStackName("stackName");
174         deletedStack.setStackStatus("DELETE_COMPLETE");
175         deletedStack.setStackStatusReason("Stack Deleted");
176
177         CreateStackParam createStackParam = new CreateStackParam();
178         createStackParam.setStackName("stackName");
179         doReturn(deletedStack).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
180         exceptionRule.expect(StackCreationException.class);
181         exceptionRule.expectMessage(
182                 "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");
183         heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
184         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
185     }
186
187     @Test
188     public final void postProcessStackCreate_Backout_True_Delete_Fail_Test() throws MsoException, IOException {
189         Stack stack = new Stack();
190         stack.setId("id");
191         stack.setStackName("stackName");
192         stack.setStackStatus("CREATE_IN_PROGRESS");
193         stack.setStackStatusReason("Stack Finished");
194
195         Stack deletedStack = new Stack();
196         deletedStack.setId("id");
197         deletedStack.setStackName("stackName");
198         deletedStack.setStackStatus("DELETE_COMPLETE");
199         deletedStack.setStackStatusReason("Stack Deleted");
200
201         CreateStackParam createStackParam = new CreateStackParam();
202         createStackParam.setStackName("stackName");
203         doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
204                 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
205         exceptionRule.expect(MsoException.class);
206         exceptionRule.expectMessage(
207                 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
208         heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
209         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
210     }
211
212     @Test
213     public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
214         Stack stack = new Stack();
215         stack.setId("id");
216         stack.setStackName("stackName");
217         stack.setStackStatus("CREATE_IN_PROGRESS");
218         stack.setStackStatusReason(
219                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
220
221         Stack createdStack = new Stack();
222         createdStack.setId("id");
223         createdStack.setStackName("stackName");
224         createdStack.setStackStatus("CREATE_COMPLETE");
225         createdStack.setStackStatusReason("Stack Created");
226
227         CreateStackParam createStackParam = new CreateStackParam();
228         createStackParam.setStackName("stackName");
229         doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
230                 stack);
231         heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
232         Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
233                 stack);
234     }
235
236     @Test
237     public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
238
239         Stack stack = new Stack();
240         stack.setId("id");
241         stack.setStackName("stackName");
242         stack.setStackStatus("CREATE_FAILED");
243         stack.setStackStatusReason(
244                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
245
246         Stack deletedStack = new Stack();
247         deletedStack.setId("id");
248         deletedStack.setStackName("stackName");
249         deletedStack.setStackStatus("DELETE_COMPLETE");
250         deletedStack.setStackStatusReason("Stack Deleted");
251
252         CreateStackParam createStackParam = new CreateStackParam();
253         createStackParam.setStackName("stackName");
254         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
255         doNothing().when(heatUtils).postProcessStackDelete(deletedStack);
256         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
257         doReturn(stackResource).when(heatClient).getStacks();
258         doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
259         doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
260                 tenantId);
261
262         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
263         Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
264         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId);
265         Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
266     }
267
268
269     @Test
270     public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
271         Stack stack = null;
272         exceptionRule.expect(StackCreationException.class);
273         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
274         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
275     }
276
277     @Test
278     public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
279         Stack deletedStack = new Stack();
280         deletedStack.setId("id");
281         deletedStack.setStackName("stackName");
282         deletedStack.setStackStatus("DELETE_FAILED");
283         deletedStack.setStackStatusReason("Stack DID NOT DELETE");
284         exceptionRule.expect(StackRollbackException.class);
285         exceptionRule.expectMessage(
286                 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
287         heatUtils.postProcessStackDelete(deletedStack);
288     }
289
290     @Test
291     public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
292         Stack stack = null;
293         exceptionRule.expect(StackRollbackException.class);
294         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
295         heatUtils.postProcessStackDelete(stack);
296     }
297
298     @Test
299     public final void isKeyPairFailure_Test() throws MsoException, IOException {
300         boolean actual = heatUtils.isKeyPairFailure(
301                 "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'");
302         assertEquals(true, actual);
303     }
304
305     @Test
306     public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
307         Stack stack = new Stack();
308         stack.setId("id");
309         stack.setStackName("stackName");
310         stack.setStackStatus("CREATE_FAILED");
311         stack.setStackStatusReason(
312                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
313
314         Stack createdStack = new Stack();
315         createdStack.setId("id");
316         createdStack.setStackName("stackName");
317         createdStack.setStackStatus("CREATE_COMPLETE");
318         createdStack.setStackStatusReason("Stack Created");
319
320         CreateStackParam createStackParam = new CreateStackParam();
321         createStackParam.setStackName("stackName");
322
323         doReturn(mockResources).when(heatUtils).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
324         doNothing().when(novaClient).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
325         doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
326         doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
327         doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
328                 createStackParam, false);
329
330         heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
331         Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
332         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
333         Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
334         Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
335                 createStackParam, false);
336     }
337
338     @Test
339     public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
340         Stack stack = new Stack();
341         stack.setId("id");
342         stack.setStackName("stackName");
343         stack.setStackStatus("CREATE_FAILED");
344         stack.setStackStatusReason(
345                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
346
347         Stack createdStack = new Stack();
348         createdStack.setId("id");
349         createdStack.setStackName("stackName");
350         createdStack.setStackStatus("CREATE_COMPLETE");
351         createdStack.setStackStatusReason("Stack Created");
352
353
354         CreateStackParam createStackParam = new CreateStackParam();
355         createStackParam.setStackName("stackName");
356
357         doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
358                 tenantId);
359         doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
360                 tenantId, createStackParam);
361
362         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
363         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
364         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
365                 createStackParam);
366     }
367
368     @Test
369     public final void processCreateStack_Exception_Backout_Test()
370             throws MsoException, IOException, NovaClientException {
371         Stack stack = new Stack();
372         stack.setId("id");
373         stack.setStackName("stackName");
374         stack.setStackStatus("CREATE_FAILED");
375         stack.setStackStatusReason(
376                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
377
378         Stack deletedStack = new Stack();
379         deletedStack.setId("id");
380         deletedStack.setStackName("stackName");
381         deletedStack.setStackStatus("DELETE_COMPLETE");
382         deletedStack.setStackStatusReason("Stack Deleted");
383
384         CreateStackParam createStackParam = new CreateStackParam();
385         createStackParam.setStackName("stackName");
386
387         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
388                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
389         exceptionRule.expect(MsoException.class);
390         exceptionRule.expectMessage("Error");
391         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
392         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
393         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
394                 createStackParam);
395     }
396
397
398     @Test
399     public final void createStack_Test() throws MsoException, IOException, NovaClientException {
400         CreateStackParam createStackParam = new CreateStackParam();
401         createStackParam.setStackName("stackName");
402
403         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
404         doReturn(stackResource).when(heatClient).getStacks();
405         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
406
407         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
408
409         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
410         Mockito.verify(stackResource, times(1)).create(createStackParam);
411         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
412         Mockito.verify(heatClient, times(1)).getStacks();
413         Mockito.verify(stackResource, times(1)).create(createStackParam);
414     }
415
416     @Test
417     public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
418         CreateStackParam createStackParam = new CreateStackParam();
419         createStackParam.setStackName("stackName");
420         Map<String, Object> parameters = new HashMap<String, Object>();
421         parameters.put("test", "value");
422         createStackParam.setParameters(parameters);
423         InfraActiveRequests request = new InfraActiveRequests();
424         request.setRequestId("requestId");
425         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
426         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
427         heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
428         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
429         assertNotNull(request.getCloudApiRequests().get(0));
430         assertEquals(request.getCloudApiRequests().get(0).getRequestId(), "requestId");
431     }
432
433     @Test
434     public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
435         CreateStackParam createStackParam = new CreateStackParam();
436         createStackParam.setStackName("stackName");
437         Map<String, Object> parameters = new HashMap<String, Object>();
438         parameters.put("test", "value");
439         createStackParam.setParameters(parameters);
440         InfraActiveRequests request = new InfraActiveRequests();
441         request.setRequestId("requestId");
442         CloudApiRequests cloudRequest = new CloudApiRequests();
443         cloudRequest.setCloudIdentifier("stackName");
444         cloudRequest.setRequestBody("testMe");
445         cloudRequest.setRequestId("requestId");
446         request.getCloudApiRequests().add(cloudRequest);
447         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
448         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
449         heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
450         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
451         assertNotNull(request.getCloudApiRequests().get(0));
452         assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
453         assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
454     }
455
456     @Test
457     public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
458         CreateStackParam createStackParam = new CreateStackParam();
459         createStackParam.setStackName("stackName");
460
461         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
462         doReturn(stackResource).when(heatClient).getStacks();
463         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
464
465         doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
466                 .executeAndRecordOpenstackRequest(mockCreateStack);
467         exceptionRule.expect(MsoOpenstackException.class);
468         exceptionRule.expectMessage("Unknown Error");
469         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
470         Mockito.verify(stackResource, times(1)).create(createStackParam);
471         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
472         Mockito.verify(heatClient, times(1)).getStacks();
473         Mockito.verify(stackResource, times(1)).create(createStackParam);
474     }
475
476     @Test
477     public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
478         CreateStackParam createStackParam = new CreateStackParam();
479         createStackParam.setStackName("stackName");
480
481         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
482         doReturn(stackResource).when(heatClient).getStacks();
483         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
484
485         doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
486                 .executeAndRecordOpenstackRequest(mockCreateStack);
487         exceptionRule.expect(MsoStackAlreadyExists.class);
488         exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
489         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
490         Mockito.verify(stackResource, times(1)).create(createStackParam);
491         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
492         Mockito.verify(heatClient, times(1)).getStacks();
493         Mockito.verify(stackResource, times(1)).create(createStackParam);
494     }
495
496     @Test
497     public final void processCreateStack_Exception_No_Backout_Test()
498             throws MsoException, IOException, NovaClientException {
499         Stack stack = new Stack();
500         stack.setId("id");
501         stack.setStackName("stackName");
502         stack.setStackStatus("CREATE_FAILED");
503         stack.setStackStatusReason(
504                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
505
506         Stack deletedStack = new Stack();
507         deletedStack.setId("id");
508         deletedStack.setStackName("stackName");
509         deletedStack.setStackStatus("DELETE_COMPLETE");
510         deletedStack.setStackStatusReason("Stack Deleted");
511
512         CreateStackParam createStackParam = new CreateStackParam();
513         createStackParam.setStackName("stackName");
514
515         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
516                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
517
518         exceptionRule.expect(MsoException.class);
519         exceptionRule.expectMessage("Error");
520         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
521         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
522         Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
523     }
524
525 }