Merge "update multi stage code to accurately skip bbs"
[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.HashMap;
38 import java.util.List;
39 import java.util.Map;
40 import org.junit.Before;
41 import org.junit.Rule;
42 import org.junit.Test;
43 import org.junit.rules.ExpectedException;
44 import org.junit.runner.RunWith;
45 import org.mockito.InjectMocks;
46 import org.mockito.Mock;
47 import org.mockito.Mockito;
48 import org.mockito.Spy;
49 import org.mockito.junit.MockitoJUnitRunner;
50 import org.onap.so.db.request.beans.CloudApiRequests;
51 import org.onap.so.db.request.beans.InfraActiveRequests;
52 import org.onap.so.db.request.client.RequestsDbClient;
53 import org.onap.so.openstack.exceptions.MsoException;
54 import org.onap.so.openstack.exceptions.MsoOpenstackException;
55 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
56 import org.springframework.core.env.Environment;
57 import com.woorea.openstack.base.client.OpenStackResponseException;
58 import com.woorea.openstack.heat.Heat;
59 import com.woorea.openstack.heat.StackResource;
60 import com.woorea.openstack.heat.StackResource.CreateStack;
61 import com.woorea.openstack.heat.StackResource.DeleteStack;
62 import com.woorea.openstack.heat.model.CreateStackParam;
63 import com.woorea.openstack.heat.model.Resource;
64 import com.woorea.openstack.heat.model.Resources;
65 import com.woorea.openstack.heat.model.Stack;
66
67 @RunWith(MockitoJUnitRunner.class)
68 public class MsoHeatUtilsTest extends MsoHeatUtils {
69
70     @Rule
71     public ExpectedException exceptionRule = ExpectedException.none();
72
73     @Spy
74     @InjectMocks
75     private MsoHeatUtils heatUtils;
76
77     @Mock
78     private RequestsDbClient requestDbClient;
79
80     @Mock
81     private Heat heatClient;
82
83     @Mock
84     private StackStatusHandler stackStatusHandler;
85
86     @Mock
87     private Environment env;
88
89     @Mock
90     private StackResource stackResource;
91
92     @Mock
93     private NovaClientImpl novaClient;
94
95     @Mock
96     private DeleteStack mockDeleteStack;
97
98     @Mock
99     private Resources mockResources;
100
101     @Mock
102     private CreateStack mockCreateStack;
103
104     private String cloudSiteId = "cloudSiteId";
105     private String tenantId = "tenantId";
106
107     @Before
108     public void setup() {
109         doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
110         doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
111     }
112
113     @Test
114     public final void pollStackForStatus_Create_Complete_Test() throws MsoException, IOException {
115         Stack stack = new Stack();
116         stack.setId("id");
117         stack.setStackName("stackName");
118         stack.setStackStatus("CREATE_IN_PROGRESS");
119         stack.setStackStatusReason("Stack Finished");
120
121         Stack latestStack = new Stack();
122         latestStack.setId("id");
123         latestStack.setStackName("stackName");
124         latestStack.setStackStatus("CREATE_COMPLETE");
125         latestStack.setStackStatusReason("Stack Finished");
126         doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
127         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
128         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
129         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
130         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
131         assertEquals(true, actual != null);
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_Backout_True_Delete_Fail_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("Stack Finished");
197
198         Stack deletedStack = new Stack();
199         deletedStack.setId("id");
200         deletedStack.setStackName("stackName");
201         deletedStack.setStackStatus("DELETE_COMPLETE");
202         deletedStack.setStackStatusReason("Stack Deleted");
203
204         CreateStackParam createStackParam = new CreateStackParam();
205         createStackParam.setStackName("stackName");
206         doThrow(new MsoOpenstackException(500, "Error In Delete", "Error In Delete")).when(heatUtils)
207                 .handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
208         exceptionRule.expect(MsoException.class);
209         exceptionRule.expectMessage(
210                 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack Finished , Rollback of Stack Creation failed with sync error: Error In Delete");
211         heatUtils.postProcessStackCreate(stack, true, 120, false, cloudSiteId, tenantId, createStackParam);
212         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
213     }
214
215     @Test
216     public final void postProcessStackCreate_Keypair_True_Test() throws MsoException, IOException {
217         Stack stack = new Stack();
218         stack.setId("id");
219         stack.setStackName("stackName");
220         stack.setStackStatus("CREATE_IN_PROGRESS");
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 createdStack = new Stack();
225         createdStack.setId("id");
226         createdStack.setStackName("stackName");
227         createdStack.setStackStatus("CREATE_COMPLETE");
228         createdStack.setStackStatusReason("Stack Created");
229
230         CreateStackParam createStackParam = new CreateStackParam();
231         createStackParam.setStackName("stackName");
232         doReturn(createdStack).when(heatUtils).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
233                 stack);
234         heatUtils.postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId, createStackParam);
235         Mockito.verify(heatUtils, times(1)).handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true,
236                 stack);
237     }
238
239     @Test
240     public final void handleUnknownCreateStackFailure_Test() throws MsoException, IOException {
241
242         Stack stack = new Stack();
243         stack.setId("id");
244         stack.setStackName("stackName");
245         stack.setStackStatus("CREATE_FAILED");
246         stack.setStackStatusReason(
247                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
248
249         Stack deletedStack = new Stack();
250         deletedStack.setId("id");
251         deletedStack.setStackName("stackName");
252         deletedStack.setStackStatus("DELETE_COMPLETE");
253         deletedStack.setStackStatusReason("Stack Deleted");
254
255         CreateStackParam createStackParam = new CreateStackParam();
256         createStackParam.setStackName("stackName");
257         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
258         doNothing().when(heatUtils).postProcessStackDelete(deletedStack);
259         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
260         doReturn(stackResource).when(heatClient).getStacks();
261         doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
262         doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
263                 tenantId);
264
265         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
266         Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
267         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId);
268         Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
269     }
270
271
272     @Test
273     public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
274         Stack stack = null;
275         exceptionRule.expect(StackCreationException.class);
276         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
277         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
278     }
279
280     @Test
281     public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
282         Stack deletedStack = new Stack();
283         deletedStack.setId("id");
284         deletedStack.setStackName("stackName");
285         deletedStack.setStackStatus("DELETE_FAILED");
286         deletedStack.setStackStatusReason("Stack DID NOT DELETE");
287         exceptionRule.expect(StackRollbackException.class);
288         exceptionRule.expectMessage(
289                 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
290         heatUtils.postProcessStackDelete(deletedStack);
291     }
292
293     @Test
294     public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
295         Stack stack = null;
296         exceptionRule.expect(StackRollbackException.class);
297         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
298         heatUtils.postProcessStackDelete(stack);
299     }
300
301     @Test
302     public final void isKeyPairFailure_Test() throws MsoException, IOException {
303         boolean actual = heatUtils.isKeyPairFailure(
304                 "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'");
305         assertEquals(true, actual);
306     }
307
308     @Test
309     public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
310         Stack stack = new Stack();
311         stack.setId("id");
312         stack.setStackName("stackName");
313         stack.setStackStatus("CREATE_FAILED");
314         stack.setStackStatusReason(
315                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
316
317         Stack createdStack = new Stack();
318         createdStack.setId("id");
319         createdStack.setStackName("stackName");
320         createdStack.setStackStatus("CREATE_COMPLETE");
321         createdStack.setStackStatusReason("Stack Created");
322
323
324
325         List<Resource> resources = new ArrayList<>();
326         Resource resource = new Resource();
327         resource.setName("KeypairName");
328         resource.setLogicalResourceId("KeypairName");
329         resource.setType("OS::Nova::KeyPair");
330         resources.add(resource);
331
332         CreateStackParam createStackParam = new CreateStackParam();
333         createStackParam.setStackName("stackName");
334
335         doReturn(resources).when(mockResources).getList();
336         doReturn(mockResources).when(heatUtils).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
337         doNothing().when(novaClient).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
338         doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
339         doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
340         doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
341                 createStackParam, false);
342
343         heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
344         Mockito.verify(heatUtils, times(1)).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
345         Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
346         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
347         Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
348         Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
349                 createStackParam, false);
350     }
351
352     @Test
353     public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
354         Stack stack = new Stack();
355         stack.setId("id");
356         stack.setStackName("stackName");
357         stack.setStackStatus("CREATE_FAILED");
358         stack.setStackStatusReason(
359                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
360
361         Stack createdStack = new Stack();
362         createdStack.setId("id");
363         createdStack.setStackName("stackName");
364         createdStack.setStackStatus("CREATE_COMPLETE");
365         createdStack.setStackStatusReason("Stack Created");
366
367
368         CreateStackParam createStackParam = new CreateStackParam();
369         createStackParam.setStackName("stackName");
370
371         doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
372                 tenantId);
373         doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
374                 tenantId, createStackParam);
375
376         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
377         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
378         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
379                 createStackParam);
380     }
381
382     @Test
383     public final void processCreateStack_Exception_Backout_Test()
384             throws MsoException, IOException, NovaClientException {
385         Stack stack = new Stack();
386         stack.setId("id");
387         stack.setStackName("stackName");
388         stack.setStackStatus("CREATE_FAILED");
389         stack.setStackStatusReason(
390                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
391
392         Stack deletedStack = new Stack();
393         deletedStack.setId("id");
394         deletedStack.setStackName("stackName");
395         deletedStack.setStackStatus("DELETE_COMPLETE");
396         deletedStack.setStackStatusReason("Stack Deleted");
397
398         CreateStackParam createStackParam = new CreateStackParam();
399         createStackParam.setStackName("stackName");
400
401         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
402                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
403         exceptionRule.expect(MsoException.class);
404         exceptionRule.expectMessage("Error");
405         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
406         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
407         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
408                 createStackParam);
409     }
410
411
412     @Test
413     public final void createStack_Test() throws MsoException, IOException, NovaClientException {
414         CreateStackParam createStackParam = new CreateStackParam();
415         createStackParam.setStackName("stackName");
416
417         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
418         doReturn(stackResource).when(heatClient).getStacks();
419         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
420
421         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
422
423         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
424         Mockito.verify(stackResource, times(1)).create(createStackParam);
425         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
426         Mockito.verify(heatClient, times(1)).getStacks();
427         Mockito.verify(stackResource, times(1)).create(createStackParam);
428     }
429
430     @Test
431     public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
432         CreateStackParam createStackParam = new CreateStackParam();
433         createStackParam.setStackName("stackName");
434         Map<String, Object> parameters = new HashMap<String, Object>();
435         parameters.put("test", "value");
436         createStackParam.setParameters(parameters);
437         InfraActiveRequests request = new InfraActiveRequests();
438         request.setRequestId("requestId");
439         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
440         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
441         heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
442         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
443         assertNotNull(request.getCloudApiRequests().get(0));
444         assertEquals(request.getCloudApiRequests().get(0).getRequestId(), "requestId");
445     }
446
447     @Test
448     public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
449         CreateStackParam createStackParam = new CreateStackParam();
450         createStackParam.setStackName("stackName");
451         Map<String, Object> parameters = new HashMap<String, Object>();
452         parameters.put("test", "value");
453         createStackParam.setParameters(parameters);
454         InfraActiveRequests request = new InfraActiveRequests();
455         request.setRequestId("requestId");
456         CloudApiRequests cloudRequest = new CloudApiRequests();
457         cloudRequest.setCloudIdentifier("stackName");
458         cloudRequest.setRequestBody("testMe");
459         cloudRequest.setRequestId("requestId");
460         request.getCloudApiRequests().add(cloudRequest);
461         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
462         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
463         heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
464         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
465         assertNotNull(request.getCloudApiRequests().get(0));
466         assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
467         assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
468     }
469
470     @Test
471     public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
472         CreateStackParam createStackParam = new CreateStackParam();
473         createStackParam.setStackName("stackName");
474
475         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
476         doReturn(stackResource).when(heatClient).getStacks();
477         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
478
479         doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
480                 .executeAndRecordOpenstackRequest(mockCreateStack);
481         exceptionRule.expect(MsoOpenstackException.class);
482         exceptionRule.expectMessage("Unknown Error");
483         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
484         Mockito.verify(stackResource, times(1)).create(createStackParam);
485         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
486         Mockito.verify(heatClient, times(1)).getStacks();
487         Mockito.verify(stackResource, times(1)).create(createStackParam);
488     }
489
490     @Test
491     public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
492         CreateStackParam createStackParam = new CreateStackParam();
493         createStackParam.setStackName("stackName");
494
495         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
496         doReturn(stackResource).when(heatClient).getStacks();
497         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
498
499         doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
500                 .executeAndRecordOpenstackRequest(mockCreateStack);
501         exceptionRule.expect(MsoStackAlreadyExists.class);
502         exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
503         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
504         Mockito.verify(stackResource, times(1)).create(createStackParam);
505         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
506         Mockito.verify(heatClient, times(1)).getStacks();
507         Mockito.verify(stackResource, times(1)).create(createStackParam);
508     }
509
510     @Test
511     public final void processCreateStack_Exception_No_Backout_Test()
512             throws MsoException, IOException, NovaClientException {
513         Stack stack = new Stack();
514         stack.setId("id");
515         stack.setStackName("stackName");
516         stack.setStackStatus("CREATE_FAILED");
517         stack.setStackStatusReason(
518                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
519
520         Stack deletedStack = new Stack();
521         deletedStack.setId("id");
522         deletedStack.setStackName("stackName");
523         deletedStack.setStackStatus("DELETE_COMPLETE");
524         deletedStack.setStackStatusReason("Stack Deleted");
525
526         CreateStackParam createStackParam = new CreateStackParam();
527         createStackParam.setStackName("stackName");
528
529         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
530                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
531
532         exceptionRule.expect(MsoException.class);
533         exceptionRule.expectMessage("Error");
534         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
535         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
536         Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
537     }
538
539 }