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