Merge "Updated to use the logicalResourceId"
[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.ArrayList;
37 import java.util.List;
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.Entity;
56 import com.woorea.openstack.base.client.OpenStackResponseException;
57 import com.woorea.openstack.heat.Heat;
58 import com.woorea.openstack.heat.StackResource;
59 import com.woorea.openstack.heat.StackResource.CreateStack;
60 import com.woorea.openstack.heat.StackResource.DeleteStack;
61 import com.woorea.openstack.heat.model.CreateStackParam;
62 import com.woorea.openstack.heat.model.Resource;
63 import com.woorea.openstack.heat.model.Resources;
64 import com.woorea.openstack.heat.model.Stack;
65
66 @RunWith(MockitoJUnitRunner.class)
67 public class MsoHeatUtilsTest extends MsoHeatUtils {
68
69     @Rule
70     public ExpectedException exceptionRule = ExpectedException.none();
71
72     @Spy
73     @InjectMocks
74     private MsoHeatUtils heatUtils;
75
76     @Mock
77     private RequestsDbClient requestDbClient;
78
79     @Mock
80     private Heat heatClient;
81
82     @Mock
83     private StackStatusHandler stackStatusHandler;
84
85     @Mock
86     private Environment env;
87
88     @Mock
89     private StackResource stackResource;
90
91     @Mock
92     private NovaClientImpl novaClient;
93
94     @Mock
95     private DeleteStack mockDeleteStack;
96
97     @Mock
98     private Resources mockResources;
99
100     @Mock
101     private CreateStack mockCreateStack;
102
103     private String cloudSiteId = "cloudSiteId";
104     private String tenantId = "tenantId";
105
106     @Before
107     public void setup() {
108         doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
109         doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
110     }
111
112     @Test
113     public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
114         Stack stack = new Stack();
115         stack.setId("id");
116         stack.setStackName("stackName");
117         stack.setStackStatus("CREATE_IN_PROGRESS");
118         stack.setStackStatusReason("Stack Finished");
119
120         Stack latestStack = new Stack();
121         latestStack.setId("id");
122         latestStack.setStackName("stackName");
123         latestStack.setStackStatus("CREATE_COMPLETE");
124         latestStack.setStackStatusReason("Stack Finished");
125         doNothing().when(stackStatusHandler).updateStackStatus(stack);
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);
132     }
133
134
135     @Test
136     public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
137         Stack stack = new Stack();
138         stack.setId("id");
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);
149     }
150
151     @Test
152     public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
153         Stack stack = new Stack();
154         stack.setId("id");
155         stack.setStackName("stackName");
156         stack.setStackStatus("CREATE_IN_PROGRESS");
157         stack.setStackStatusReason("Stack Finished");
158         CreateStackParam createStackParam = new CreateStackParam();
159         createStackParam.setStackName("stackName");
160
161         exceptionRule.expect(StackCreationException.class);
162         exceptionRule.expectMessage("Stack rollback suppressed, stack not deleted");
163         heatUtils.postProcessStackCreate(stack, false, 120, false, cloudSiteId, tenantId, createStackParam);
164     }
165
166     @Test
167     public final void postProcessStackCreate_Backout_True_Test() throws MsoException, IOException {
168         Stack stack = new Stack();
169         stack.setId("id");
170         stack.setStackName("stackName");
171         stack.setStackStatus("CREATE_IN_PROGRESS");
172         stack.setStackStatusReason("Stack Finished");
173
174         Stack deletedStack = new Stack();
175         deletedStack.setId("id");
176         deletedStack.setStackName("stackName");
177         deletedStack.setStackStatus("DELETE_COMPLETE");
178         deletedStack.setStackStatusReason("Stack Deleted");
179
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);
188     }
189
190     @Test
191     public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
192         Stack stack = new Stack();
193         stack.setId("id");
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");
198
199         Stack createdStack = new Stack();
200         createdStack.setId("id");
201         createdStack.setStackName("stackName");
202         createdStack.setStackStatus("CREATE_COMPLETE");
203         createdStack.setStackStatusReason("Stack Created");
204
205         CreateStackParam createStackParam = new CreateStackParam();
206         createStackParam.setStackName("stackName");
207         doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
208                 stack);
209         heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
210         Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
211                 stack);
212     }
213
214     @Test
215     public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
216
217         Stack stack = new Stack();
218         stack.setId("id");
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");
223
224         Stack deletedStack = new Stack();
225         deletedStack.setId("id");
226         deletedStack.setStackName("stackName");
227         deletedStack.setStackStatus("DELETE_COMPLETE");
228         deletedStack.setStackStatusReason("Stack Deleted");
229
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,
238                 tenantId);
239
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);
244     }
245
246
247     @Test
248     public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
249         Stack stack = null;
250         exceptionRule.expect(StackCreationException.class);
251         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
252         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
253     }
254
255     @Test
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);
266     }
267
268     @Test
269     public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
270         Stack stack = null;
271         exceptionRule.expect(StackRollbackException.class);
272         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
273         heatUtils.postProcessStackDelete(stack);
274     }
275
276     @Test
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);
281     }
282
283     @Test
284     public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
285         Stack stack = new Stack();
286         stack.setId("id");
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");
291
292         Stack createdStack = new Stack();
293         createdStack.setId("id");
294         createdStack.setStackName("stackName");
295         createdStack.setStackStatus("CREATE_COMPLETE");
296         createdStack.setStackStatusReason("Stack Created");
297
298
299
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);
306
307         CreateStackParam createStackParam = new CreateStackParam();
308         createStackParam.setStackName("stackName");
309
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);
317
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);
325     }
326
327     @Test
328     public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
329         Stack stack = new Stack();
330         stack.setId("id");
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");
335
336         Stack createdStack = new Stack();
337         createdStack.setId("id");
338         createdStack.setStackName("stackName");
339         createdStack.setStackStatus("CREATE_COMPLETE");
340         createdStack.setStackStatusReason("Stack Created");
341
342
343         CreateStackParam createStackParam = new CreateStackParam();
344         createStackParam.setStackName("stackName");
345
346         doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
347                 tenantId);
348         doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
349                 tenantId, createStackParam);
350
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,
354                 createStackParam);
355     }
356
357     @Test
358     public final void processCreateStack_Exception_Backout_Test()
359             throws MsoException, IOException, NovaClientException {
360         Stack stack = new Stack();
361         stack.setId("id");
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");
366
367         Stack deletedStack = new Stack();
368         deletedStack.setId("id");
369         deletedStack.setStackName("stackName");
370         deletedStack.setStackStatus("DELETE_COMPLETE");
371         deletedStack.setStackStatusReason("Stack Deleted");
372
373         CreateStackParam createStackParam = new CreateStackParam();
374         createStackParam.setStackName("stackName");
375
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);
384     }
385
386
387     @Test
388     public final void createStack_Test() throws MsoException, IOException, NovaClientException {
389         CreateStackParam createStackParam = new CreateStackParam();
390         createStackParam.setStackName("stackName");
391
392         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
393         doReturn(stackResource).when(heatClient).getStacks();
394         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
395
396         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
397
398         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
399         Mockito.verify(stackResource, times(1)).create(createStackParam);
400         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(mockCreateStack), isNull(), eq("stackName"));
401         Mockito.verify(heatClient, times(1)).getStacks();
402         Mockito.verify(stackResource, times(1)).create(createStackParam);
403     }
404
405     @Test
406     public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
407         Stack stack = new Stack();
408         stack.setId("id");
409         stack.setStackName("stackName");
410         stack.setStackStatus("CREATE_FAILED");
411         stack.setStackStatusReason(
412                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
413         Entity<Stack> entity = new Entity(stack, "application/json");
414         doReturn(entity).when(mockCreateStack).entity();
415         InfraActiveRequests request = new InfraActiveRequests();
416         request.setRequestId("requestId");
417         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
418         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
419         heatUtils.saveStackRequest(mockCreateStack, "requestId", "stackName");
420         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
421         assertNotNull(request.getCloudApiRequests().get(0));
422         assertEquals(request.getCloudApiRequests().get(0).getRequestId(), "requestId");
423     }
424
425     @Test
426     public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
427         Stack stack = new Stack();
428         stack.setId("id");
429         stack.setStackName("stackName");
430         stack.setStackStatus("CREATE_FAILED");
431         stack.setStackStatusReason(
432                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
433         Entity<Stack> entity = new Entity(stack, "application/json");
434         doReturn(entity).when(mockCreateStack).entity();
435         InfraActiveRequests request = new InfraActiveRequests();
436         request.setRequestId("requestId");
437         CloudApiRequests cloudRequest = new CloudApiRequests();
438         cloudRequest.setCloudIdentifier("stackName");
439         cloudRequest.setRequestBody("testMe");
440         cloudRequest.setRequestId("requestId");
441         request.getCloudApiRequests().add(cloudRequest);
442         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
443         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
444         heatUtils.saveStackRequest(mockCreateStack, "requestId", "stackName");
445         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
446         assertNotNull(request.getCloudApiRequests().get(0));
447         assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
448         assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
449     }
450
451     @Test
452     public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
453         CreateStackParam createStackParam = new CreateStackParam();
454         createStackParam.setStackName("stackName");
455
456         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
457         doReturn(stackResource).when(heatClient).getStacks();
458         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
459
460         doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
461                 .executeAndRecordOpenstackRequest(mockCreateStack);
462         exceptionRule.expect(MsoOpenstackException.class);
463         exceptionRule.expectMessage("Unknown Error");
464         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
465         Mockito.verify(stackResource, times(1)).create(createStackParam);
466         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(mockCreateStack), isNull(), eq("stackName"));
467         Mockito.verify(heatClient, times(1)).getStacks();
468         Mockito.verify(stackResource, times(1)).create(createStackParam);
469     }
470
471     @Test
472     public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
473         CreateStackParam createStackParam = new CreateStackParam();
474         createStackParam.setStackName("stackName");
475
476         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
477         doReturn(stackResource).when(heatClient).getStacks();
478         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
479
480         doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
481                 .executeAndRecordOpenstackRequest(mockCreateStack);
482         exceptionRule.expect(MsoStackAlreadyExists.class);
483         exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
484         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
485         Mockito.verify(stackResource, times(1)).create(createStackParam);
486         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(mockCreateStack), isNull(), eq("stackName"));
487         Mockito.verify(heatClient, times(1)).getStacks();
488         Mockito.verify(stackResource, times(1)).create(createStackParam);
489     }
490
491     @Test
492     public final void processCreateStack_Exception_No_Backout_Test()
493             throws MsoException, IOException, NovaClientException {
494         Stack stack = new Stack();
495         stack.setId("id");
496         stack.setStackName("stackName");
497         stack.setStackStatus("CREATE_FAILED");
498         stack.setStackStatusReason(
499                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
500
501         Stack deletedStack = new Stack();
502         deletedStack.setId("id");
503         deletedStack.setStackName("stackName");
504         deletedStack.setStackStatus("DELETE_COMPLETE");
505         deletedStack.setStackStatusReason("Stack Deleted");
506
507         CreateStackParam createStackParam = new CreateStackParam();
508         createStackParam.setStackName("stackName");
509
510         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
511                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
512
513         exceptionRule.expect(MsoException.class);
514         exceptionRule.expectMessage("Error");
515         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
516         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
517         Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
518     }
519
520 }