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