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