Merge "Increased lock time on add graph data task and"
[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.beans.CreateStackRequest;
52 import org.onap.so.openstack.exceptions.MsoException;
53 import org.onap.so.openstack.exceptions.MsoOpenstackException;
54 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
55 import org.springframework.core.env.Environment;
56 import com.fasterxml.jackson.databind.ObjectMapper;
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.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         doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
126         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
127         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
128         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
129         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
130         assertEquals(true, actual != null);
131     }
132
133
134     @Test
135     public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
136         Stack stack = new Stack();
137         stack.setId("id");
138         stack.setStackName("stackName");
139         stack.setStackStatus("CREATE_IN_PROGRESS");
140         stack.setStackStatusReason("Stack Finished");
141         doNothing().when(stackStatusHandler).updateStackStatus(stack);
142         doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
143         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
144         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
145         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
146         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
147         assertEquals(true, actual != null);
148     }
149
150     @Test
151     public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
152         Stack stack = new Stack();
153         stack.setId("id");
154         stack.setStackName("stackName");
155         stack.setStackStatus("CREATE_IN_PROGRESS");
156         stack.setStackStatusReason("Stack In Progress");
157         CreateStackParam createStackParam = new CreateStackParam();
158         createStackParam.setStackName("stackName");
159
160         exceptionRule.expect(StackCreationException.class);
161         exceptionRule.expectMessage(
162                 "Stack Creation Failed Openstack Status: CREATE_IN_PROGRESS Status Reason: Stack In Progress. 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, true);
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                 true);
269         Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
270     }
271
272
273     @Test
274     public final void handleUnknownCreateStackFailure_Null_Stack_Test() throws MsoException, IOException {
275         Stack stack = null;
276         exceptionRule.expect(StackCreationException.class);
277         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
278         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
279     }
280
281     @Test
282     public final void postProcessStackDelete_Stack_Test() throws MsoException, IOException {
283         Stack deletedStack = new Stack();
284         deletedStack.setId("id");
285         deletedStack.setStackName("stackName");
286         deletedStack.setStackStatus("DELETE_FAILED");
287         deletedStack.setStackStatusReason("Stack DID NOT DELETE");
288         exceptionRule.expect(StackRollbackException.class);
289         exceptionRule.expectMessage(
290                 "Stack Deletion completed with status: DELETE_FAILED Status Reason: Stack DID NOT DELETE");
291         heatUtils.postProcessStackDelete(deletedStack);
292     }
293
294     @Test
295     public final void postProcessStackDelete__Null_Stack_Test() throws MsoException, IOException {
296         Stack stack = null;
297         exceptionRule.expect(StackRollbackException.class);
298         exceptionRule.expectMessage("Cannot Find Stack Name or Id");
299         heatUtils.postProcessStackDelete(stack);
300     }
301
302     @Test
303     public final void isKeyPairFailure_Test() throws MsoException, IOException {
304         boolean actual = heatUtils.isKeyPairFailure(
305                 "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'");
306         assertEquals(true, actual);
307     }
308
309     @Test
310     public final void handleKeyPairConflict_Test() throws MsoException, IOException, NovaClientException {
311         Stack stack = new Stack();
312         stack.setId("id");
313         stack.setStackName("stackName");
314         stack.setStackStatus("CREATE_FAILED");
315         stack.setStackStatusReason(
316                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
317
318         Stack createdStack = new Stack();
319         createdStack.setId("id");
320         createdStack.setStackName("stackName");
321         createdStack.setStackStatus("CREATE_COMPLETE");
322         createdStack.setStackStatusReason("Stack Created");
323
324         CreateStackParam createStackParam = new CreateStackParam();
325         createStackParam.setStackName("stackName");
326
327         // doReturn(mockResources).when(heatUtils).queryStackResources(cloudSiteId, tenantId, "stackName", 2);
328         // doNothing().when(novaClient).deleteKeyPair(cloudSiteId, tenantId, "KeypairName");
329         doReturn(null).when(heatUtils).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
330         doReturn(createdStack).when(heatUtils).createStack(createStackParam, cloudSiteId, tenantId);
331         doReturn(createdStack).when(heatUtils).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
332                 createStackParam, false);
333
334         heatUtils.handleKeyPairConflict(cloudSiteId, tenantId, createStackParam, 120, true, stack);
335         Mockito.verify(novaClient, times(1)).deleteKeyPair(cloudSiteId, tenantId, "hst3bbfnm0011vm001");
336         Mockito.verify(heatUtils, times(1)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
337         Mockito.verify(heatUtils, times(1)).createStack(createStackParam, cloudSiteId, tenantId);
338         Mockito.verify(heatUtils, times(1)).processCreateStack(cloudSiteId, tenantId, 120, true, createdStack,
339                 createStackParam, false);
340     }
341
342     @Test
343     public final void processCreateStack_Test() throws MsoException, IOException, NovaClientException {
344         Stack stack = new Stack();
345         stack.setId("id");
346         stack.setStackName("stackName");
347         stack.setStackStatus("CREATE_FAILED");
348         stack.setStackStatusReason(
349                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
350
351         Stack createdStack = new Stack();
352         createdStack.setId("id");
353         createdStack.setStackName("stackName");
354         createdStack.setStackStatus("CREATE_COMPLETE");
355         createdStack.setStackStatusReason("Stack Created");
356
357
358         CreateStackParam createStackParam = new CreateStackParam();
359         createStackParam.setStackName("stackName");
360
361         doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
362                 tenantId, false);
363         doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
364                 tenantId, createStackParam);
365
366         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
367         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
368                 false);
369         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
370                 createStackParam);
371     }
372
373     @Test
374     public final void processCreateStack_Exception_Backout_Test()
375             throws MsoException, IOException, NovaClientException {
376         Stack stack = new Stack();
377         stack.setId("id");
378         stack.setStackName("stackName");
379         stack.setStackStatus("CREATE_FAILED");
380         stack.setStackStatusReason(
381                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
382
383         Stack deletedStack = new Stack();
384         deletedStack.setId("id");
385         deletedStack.setStackName("stackName");
386         deletedStack.setStackStatus("DELETE_COMPLETE");
387         deletedStack.setStackStatusReason("Stack Deleted");
388
389         CreateStackParam createStackParam = new CreateStackParam();
390         createStackParam.setStackName("stackName");
391
392         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
393                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
394         exceptionRule.expect(MsoException.class);
395         exceptionRule.expectMessage("Error");
396         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
397         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
398                 false);
399         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
400                 createStackParam);
401     }
402
403
404     @Test
405     public final void createStack_Test() throws MsoException, IOException, NovaClientException {
406         CreateStackParam createStackParam = new CreateStackParam();
407         createStackParam.setStackName("stackName");
408
409         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
410         doReturn(stackResource).when(heatClient).getStacks();
411         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
412
413         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockCreateStack);
414
415         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
416         Mockito.verify(stackResource, times(1)).create(createStackParam);
417         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
418         Mockito.verify(heatClient, times(1)).getStacks();
419         Mockito.verify(stackResource, times(1)).create(createStackParam);
420     }
421
422     @Test
423     public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
424
425         CreateStackParam createStackParam = new CreateStackParam();
426         createStackParam.setStackName("stackName");
427         Map<String, Object> parameters = new HashMap<String, Object>();
428         parameters.put("test", "value");
429         String environment =
430                 "parameters:\n  mmn_volume_name_1: \"data-mn-v-vdb\"\n  mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
431         createStackParam.setParameters(parameters);
432         createStackParam.setEnvironment(environment);
433
434         CreateStackRequest createStackRequest = new CreateStackRequest();
435         createStackRequest.setEnvironment(environment);
436         createStackRequest.setParameters(parameters);
437         ObjectMapper mapper = new ObjectMapper();
438         String stackRequest = mapper.writeValueAsString(createStackRequest);
439
440         InfraActiveRequests request = new InfraActiveRequests();
441         request.setRequestId("requestId");
442         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
443         doNothing().when(requestDbClient).updateInfraActiveRequests(request);
444         heatUtils.saveStackRequest(createStackParam, "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         assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
449     }
450
451     @Test
452     public final void saveStack__Exists_Test() throws MsoException, IOException, NovaClientException {
453         CreateStackParam createStackParam = new CreateStackParam();
454         createStackParam.setStackName("stackName");
455         Map<String, Object> parameters = new HashMap<String, Object>();
456         parameters.put("test", "value");
457         createStackParam.setParameters(parameters);
458         InfraActiveRequests request = new InfraActiveRequests();
459         request.setRequestId("requestId");
460         CloudApiRequests cloudRequest = new CloudApiRequests();
461         cloudRequest.setCloudIdentifier("stackName");
462         cloudRequest.setRequestBody("testMe");
463         cloudRequest.setRequestId("requestId");
464         request.getCloudApiRequests().add(cloudRequest);
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         assertNotEquals("testMe", request.getCloudApiRequests().get(0).getRequestBody());
472     }
473
474     @Test
475     public final void createStack_Error_Test() throws MsoException, IOException, NovaClientException {
476         CreateStackParam createStackParam = new CreateStackParam();
477         createStackParam.setStackName("stackName");
478
479         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
480         doReturn(stackResource).when(heatClient).getStacks();
481         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
482
483         doThrow(new OpenStackResponseException("Unknown Error", 500)).when(heatUtils)
484                 .executeAndRecordOpenstackRequest(mockCreateStack);
485         exceptionRule.expect(MsoOpenstackException.class);
486         exceptionRule.expectMessage("Unknown Error");
487         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
488         Mockito.verify(stackResource, times(1)).create(createStackParam);
489         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
490         Mockito.verify(heatClient, times(1)).getStacks();
491         Mockito.verify(stackResource, times(1)).create(createStackParam);
492     }
493
494     @Test
495     public final void createStack_Error_404_Test() throws MsoException, IOException, NovaClientException {
496         CreateStackParam createStackParam = new CreateStackParam();
497         createStackParam.setStackName("stackName");
498
499         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
500         doReturn(stackResource).when(heatClient).getStacks();
501         doReturn(mockCreateStack).when(stackResource).create(createStackParam);
502
503         doThrow(new OpenStackResponseException("Not Found", 409)).when(heatUtils)
504                 .executeAndRecordOpenstackRequest(mockCreateStack);
505         exceptionRule.expect(MsoStackAlreadyExists.class);
506         exceptionRule.expectMessage("Stack stackName already exists in Tenant tenantId in Cloud cloudSiteId");
507         heatUtils.createStack(createStackParam, cloudSiteId, tenantId);
508         Mockito.verify(stackResource, times(1)).create(createStackParam);
509         Mockito.verify(heatUtils, times(1)).saveStackRequest(eq(createStackParam), isNull(), eq("stackName"));
510         Mockito.verify(heatClient, times(1)).getStacks();
511         Mockito.verify(stackResource, times(1)).create(createStackParam);
512     }
513
514     @Test
515     public final void processCreateStack_Exception_No_Backout_Test()
516             throws MsoException, IOException, NovaClientException {
517         Stack stack = new Stack();
518         stack.setId("id");
519         stack.setStackName("stackName");
520         stack.setStackStatus("CREATE_FAILED");
521         stack.setStackStatusReason(
522                 "Resource CREATE failed: Conflict: resources.my_keypair: Key pair 'hst3bbfnm0011vm001' already exists. (HTTP 409) (Request-ID: req-941b0af6-63ae-4d6a-afbc-90b728bacf82");
523
524         Stack deletedStack = new Stack();
525         deletedStack.setId("id");
526         deletedStack.setStackName("stackName");
527         deletedStack.setStackStatus("DELETE_COMPLETE");
528         deletedStack.setStackStatusReason("Stack Deleted");
529
530         CreateStackParam createStackParam = new CreateStackParam();
531         createStackParam.setStackName("stackName");
532
533         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
534                 "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
535
536         exceptionRule.expect(MsoException.class);
537         exceptionRule.expectMessage("Error");
538         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
539         Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
540                 false);
541         Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
542     }
543
544 }