Replaced all tabs with spaces in java and pom.xml
[so.git] / adapters / mso-adapter-utils / src / test / java / org / onap / so / cloudify / utils / MsoCloudifyUtilsTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2018 Nokia.
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22 package org.onap.so.cloudify.utils;
23
24 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
25 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertTrue;
28 import static org.junit.Assert.fail;
29 import static org.mockito.ArgumentMatchers.any;
30 import static org.mockito.ArgumentMatchers.eq;
31 import static org.mockito.Mockito.doReturn;
32 import static org.mockito.Mockito.mock;
33 import static org.mockito.Mockito.spy;
34 import static org.mockito.Mockito.verify;
35 import static org.mockito.Mockito.when;
36 import java.io.IOException;
37 import java.nio.file.Files;
38 import java.nio.file.Paths;
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Optional;
44 import org.junit.Assert;
45 import org.junit.Test;
46 import org.mockito.Mockito;
47 import org.onap.so.adapters.vdu.CloudInfo;
48 import org.onap.so.adapters.vdu.PluginAction;
49 import org.onap.so.adapters.vdu.VduArtifact;
50 import org.onap.so.adapters.vdu.VduArtifact.ArtifactType;
51 import org.onap.so.adapters.vdu.VduInstance;
52 import org.onap.so.adapters.vdu.VduModelInfo;
53 import org.onap.so.adapters.vdu.VduStateType;
54 import org.onap.so.adapters.vdu.VduStatus;
55 import org.onap.so.cloud.CloudConfig;
56 import org.onap.so.cloudify.beans.DeploymentInfo;
57 import org.onap.so.cloudify.beans.DeploymentInfoBuilder;
58 import org.onap.so.cloudify.beans.DeploymentStatus;
59 import org.onap.so.cloudify.v3.client.Cloudify;
60 import org.onap.so.cloudify.v3.model.AzureConfig;
61 import org.onap.so.db.catalog.beans.CloudIdentity;
62 import org.onap.so.db.catalog.beans.CloudSite;
63 import org.onap.so.db.catalog.beans.CloudifyManager;
64 import org.onap.so.db.catalog.beans.HeatTemplateParam;
65 import org.onap.so.openstack.exceptions.MsoAdapterException;
66 import org.onap.so.openstack.exceptions.MsoException;
67 import org.skyscreamer.jsonassert.JSONAssert;
68 import com.fasterxml.jackson.core.JsonParseException;
69 import com.fasterxml.jackson.core.type.TypeReference;
70 import com.fasterxml.jackson.databind.JsonMappingException;
71 import com.fasterxml.jackson.databind.JsonNode;
72 import com.fasterxml.jackson.databind.ObjectMapper;
73
74 public class MsoCloudifyUtilsTest {
75
76     private static final String CLOUD_SITE_ID = "cloudSiteIdTest";
77     private static final String BLUEPRINT_ID = "bluePrintIdTest";
78     private static final String FILE_NAME = "fileName";
79
80     @Test
81     public void instantiateVduTest() throws MsoException {
82         VduInstance expected = new VduInstance();
83         expected.setVduInstanceId("id");
84         expected.setVduInstanceName("id");
85         VduStatus status = new VduStatus();
86         status.setState(VduStateType.INSTANTIATED);
87         status.setLastAction(new PluginAction(null, null, null));
88         expected.setStatus(status);
89
90         MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);
91         CloudSite site = new CloudSite();
92         Optional<CloudSite> opSite = Optional.ofNullable(site);
93         CloudConfig config = Mockito.mock(CloudConfig.class);
94         cloudify.cloudConfig = config;
95         Cloudify cloudifyClient = new Cloudify("cloudSite");
96         CloudInfo cloudInfo = new CloudInfo();
97         cloudInfo.setCloudSiteId("cloudSiteId");
98         cloudInfo.setTenantId("tenantId");
99         VduModelInfo vduModel = new VduModelInfo();
100         vduModel.setModelCustomizationUUID("blueprintId");
101         vduModel.setTimeoutMinutes(1);
102         VduArtifact artifact = new VduArtifact();
103         artifact.setName("name");
104         artifact.setType(ArtifactType.MAIN_TEMPLATE);
105         byte[] content = new byte[1];
106         artifact.setContent(content);
107         List<VduArtifact> artifacts = new ArrayList<>();
108         artifacts.add(artifact);
109         vduModel.setArtifacts(artifacts);
110         DeploymentInfo deployment =
111                 new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.INSTALLED).build();
112         Map<String, byte[]> blueprintFiles = new HashMap<>();
113         blueprintFiles.put(artifact.getName(), artifact.getContent());
114         String instanceName = "instanceName";
115         Map<String, Object> inputs = new HashMap<>();
116         boolean rollbackOnFailure = true;
117
118         when(config.getCloudSite(cloudInfo.getCloudSiteId())).thenReturn(opSite);
119         doReturn(false).when(cloudify).isBlueprintLoaded(cloudInfo.getCloudSiteId(),
120                 vduModel.getModelCustomizationUUID());
121         doReturn(cloudifyClient).when(cloudify).getCloudifyClient(site);
122         doReturn(true).when(cloudify).uploadBlueprint(cloudifyClient, vduModel.getModelCustomizationUUID(),
123                 artifact.getName(), blueprintFiles);
124         doReturn(deployment).when(cloudify).createAndInstallDeployment(cloudInfo.getCloudSiteId(),
125                 cloudInfo.getTenantId(), instanceName, vduModel.getModelCustomizationUUID(), inputs, true,
126                 vduModel.getTimeoutMinutes(), rollbackOnFailure);
127
128         VduInstance actual = cloudify.instantiateVdu(cloudInfo, instanceName, inputs, vduModel, rollbackOnFailure);
129         assertThat(actual, sameBeanAs(expected));
130     }
131
132     @Test
133     public void queryVduTest() throws MsoException {
134         VduInstance expected = new VduInstance();
135         expected.setVduInstanceId("id");
136         expected.setVduInstanceName("id");
137         VduStatus status = new VduStatus();
138         status.setState(VduStateType.INSTANTIATED);
139         status.setLastAction(new PluginAction(null, null, null));
140         expected.setStatus(status);
141
142         CloudInfo cloudInfo = new CloudInfo();
143         cloudInfo.setCloudSiteId("cloudSiteId");
144         cloudInfo.setTenantId("tenantId");
145         DeploymentInfo deployment =
146                 new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.INSTALLED).build();
147         String instanceId = "instanceId";
148
149         MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);
150
151         doReturn(deployment).when(cloudify).queryDeployment(cloudInfo.getCloudSiteId(), cloudInfo.getTenantId(),
152                 instanceId);
153
154         VduInstance actual = cloudify.queryVdu(cloudInfo, instanceId);
155
156         assertThat(actual, sameBeanAs(expected));
157     }
158
159     @Test
160     public void deleteVduTest() throws MsoException {
161         VduInstance expected = new VduInstance();
162         expected.setVduInstanceId("id");
163         expected.setVduInstanceName("id");
164         VduStatus status = new VduStatus();
165         status.setState(VduStateType.DELETING);
166         status.setLastAction(new PluginAction("deleting", null, null));
167         expected.setStatus(status);
168
169         CloudInfo cloudInfo = new CloudInfo();
170         cloudInfo.setCloudSiteId("cloudSiteId");
171         cloudInfo.setTenantId("tenantId");
172         String instanceId = "instanceId";
173         int timeoutMinutes = 1;
174         DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.CREATED)
175                 .withLastAction("deleting").build();
176         MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);
177         doReturn(deploymentInfo).when(cloudify).uninstallAndDeleteDeployment(cloudInfo.getCloudSiteId(),
178                 cloudInfo.getTenantId(), instanceId, timeoutMinutes);
179
180         VduInstance actual = cloudify.deleteVdu(cloudInfo, instanceId, timeoutMinutes);
181
182         assertThat(actual, sameBeanAs(expected));
183     }
184
185     @Test
186     public void deploymentInfoToVduInstanceTest() {
187         VduInstance expected = new VduInstance();
188         expected.setVduInstanceId("id");
189         expected.setVduInstanceName("id");
190         VduStatus status = new VduStatus();
191         status.setState(VduStateType.DELETING);
192         status.setLastAction(new PluginAction("deleting", null, null));
193         expected.setStatus(status);
194
195         DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.CREATED)
196                 .withLastAction("deleting").build();
197
198         MsoCloudifyUtils cloudify = new MsoCloudifyUtils();
199
200         VduInstance actual = cloudify.deploymentInfoToVduInstance(deploymentInfo);
201
202         assertThat(actual, sameBeanAs(expected));
203     }
204
205     @Test
206     public void deploymentStatusToVduStatusTest() {
207         VduStatus expected = new VduStatus();
208         expected.setState(VduStateType.DELETING);
209         expected.setLastAction(new PluginAction("deleting", null, null));
210
211         DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.CREATED)
212                 .withLastAction("deleting").build();
213
214         MsoCloudifyUtils cloudify = new MsoCloudifyUtils();
215
216         VduStatus actual = cloudify.deploymentStatusToVduStatus(deploymentInfo);
217
218         assertThat(actual, sameBeanAs(expected));
219     }
220
221     @Test
222     public void getAzureConfigTest() {
223         AzureConfig expected = new AzureConfig();
224         expected.setSubscriptionId("subscriptionId");
225         expected.setTenantId("tenantId");
226         expected.setClientId("msoId");
227         expected.setClientSecret("msoPass");
228
229         MsoCloudifyUtils cloudify = new MsoCloudifyUtils();
230         CloudSite cloudSite = Mockito.mock(CloudSite.class);
231         CloudIdentity cloudIdentity = Mockito.mock(CloudIdentity.class);
232         when(cloudSite.getIdentityService()).thenReturn(cloudIdentity);
233         when(cloudIdentity.getAdminTenant()).thenReturn("subscriptionId");
234         when(cloudIdentity.getMsoId()).thenReturn("msoId");
235         when(cloudIdentity.getMsoPass()).thenReturn("msoPass");
236         String tenantId = "tenantId";
237         AzureConfig actual = cloudify.getAzureConfig(cloudSite, tenantId);
238
239         assertThat(actual, sameBeanAs(expected));
240     }
241
242     @Test
243     public void uploadBlueprintSuccessful() throws MsoException {
244         // given
245         MsoCloudifyUtils testedObjectSpy = spy(MsoCloudifyUtils.class);
246         testedObjectSpy.cloudConfig = mock(CloudConfig.class);
247         Map<String, byte[]> blueprints = new HashMap<>();
248
249         mockCloudConfig(testedObjectSpy);
250         doReturn(true).when(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME),
251                 eq(blueprints));
252         // when
253         testedObjectSpy.uploadBlueprint(CLOUD_SITE_ID, BLUEPRINT_ID, FILE_NAME, blueprints, true);
254         // then
255         verify(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME), eq(blueprints));
256     }
257
258     @Test
259     public void uploadBlueprint_exceptionThrown_blueprintExists() throws MsoException {
260         // given
261         MsoCloudifyUtils testedObjectSpy = spy(MsoCloudifyUtils.class);
262         testedObjectSpy.cloudConfig = mock(CloudConfig.class);
263         Map<String, byte[]> blueprints = new HashMap<>();
264
265         mockCloudConfig(testedObjectSpy);
266         doReturn(false).when(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME),
267                 eq(blueprints));
268         // when
269         try {
270             testedObjectSpy.uploadBlueprint(CLOUD_SITE_ID, BLUEPRINT_ID, FILE_NAME, blueprints, true);
271             // then
272             fail("MsoAdapterException should be thrown");
273         } catch (MsoAdapterException e) {
274             Assert.assertEquals(e.getMessage(), "Blueprint already exists");
275         }
276         verify(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME), eq(blueprints));
277     }
278
279     @Test
280     public void convertInputValueTest() throws JsonParseException, JsonMappingException, IOException {
281         MsoCloudifyUtils utils = new MsoCloudifyUtils();
282         ObjectMapper mapper = new ObjectMapper();
283         HeatTemplateParam paramNum = new HeatTemplateParam();
284         paramNum.setParamType("number");
285         paramNum.setParamName("my-number");
286
287         HeatTemplateParam paramString = new HeatTemplateParam();
288         paramString.setParamType("string");
289         paramString.setParamName("my-string");
290
291         HeatTemplateParam paramJson = new HeatTemplateParam();
292         paramJson.setParamType("json");
293         paramJson.setParamName("my-json");
294
295         HeatTemplateParam paramJsonEscaped = new HeatTemplateParam();
296         paramJsonEscaped.setParamType("json");
297         paramJsonEscaped.setParamName("my-json-escaped");
298
299         Map<String, Object> jsonMap =
300                 mapper.readValue(getJson("free-form.json"), new TypeReference<Map<String, Object>>() {});
301
302         assertEquals(3, utils.convertInputValue("3", paramNum));
303         assertEquals("hello", utils.convertInputValue("hello", paramString));
304         assertTrue("expect no change in type", utils.convertInputValue(jsonMap, paramJson) instanceof Map);
305         assertTrue("expect string to become jsonNode",
306                 utils.convertInputValue(getJson("free-form.json"), paramJsonEscaped) instanceof JsonNode);
307
308         JSONAssert.assertEquals(getJson("free-form.json"),
309                 mapper.writeValueAsString(utils.convertInputValue(getJson("free-form.json"), paramJsonEscaped)), false);
310
311     }
312
313     private String getJson(String filename) throws IOException {
314         return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/MsoHeatUtils/" + filename)));
315     }
316
317     private void mockCloudConfig(MsoCloudifyUtils testedObjectSpy) {
318         CloudifyManager cloudifyManager = createCloudifyManager();
319         when(testedObjectSpy.cloudConfig.getCloudSite(CLOUD_SITE_ID)).thenReturn(Optional.of(createCloudSite()));
320         when(testedObjectSpy.cloudConfig.getCloudifyManager(CLOUD_SITE_ID)).thenReturn(cloudifyManager);
321     }
322
323     private CloudifyManager createCloudifyManager() {
324         CloudifyManager cloudifyManager = new CloudifyManager();
325         cloudifyManager.setCloudifyUrl("cloudUrlTest");
326         cloudifyManager.setPassword("546573746F736973546573746F736973");
327         return cloudifyManager;
328     }
329
330     private CloudSite createCloudSite() {
331         CloudSite cloudSite = new CloudSite();
332         cloudSite.setCloudifyId(CLOUD_SITE_ID);
333         return cloudSite;
334     }
335
336 }