2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.so.cloudify.utils;
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;
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;
74 public class MsoCloudifyUtilsTest {
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";
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);
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;
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);
128 VduInstance actual = cloudify.instantiateVdu(cloudInfo, instanceName, inputs, vduModel, rollbackOnFailure);
129 assertThat(actual, sameBeanAs(expected));
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);
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";
149 MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);
151 doReturn(deployment).when(cloudify).queryDeployment(cloudInfo.getCloudSiteId(), cloudInfo.getTenantId(),
154 VduInstance actual = cloudify.queryVdu(cloudInfo, instanceId);
156 assertThat(actual, sameBeanAs(expected));
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);
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);
180 VduInstance actual = cloudify.deleteVdu(cloudInfo, instanceId, timeoutMinutes);
182 assertThat(actual, sameBeanAs(expected));
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);
195 DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.CREATED)
196 .withLastAction("deleting").build();
198 MsoCloudifyUtils cloudify = new MsoCloudifyUtils();
200 VduInstance actual = cloudify.deploymentInfoToVduInstance(deploymentInfo);
202 assertThat(actual, sameBeanAs(expected));
206 public void deploymentStatusToVduStatusTest() {
207 VduStatus expected = new VduStatus();
208 expected.setState(VduStateType.DELETING);
209 expected.setLastAction(new PluginAction("deleting", null, null));
211 DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withId("id").withStatus(DeploymentStatus.CREATED)
212 .withLastAction("deleting").build();
214 MsoCloudifyUtils cloudify = new MsoCloudifyUtils();
216 VduStatus actual = cloudify.deploymentStatusToVduStatus(deploymentInfo);
218 assertThat(actual, sameBeanAs(expected));
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");
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);
239 assertThat(actual, sameBeanAs(expected));
243 public void uploadBlueprintSuccessful() throws MsoException {
245 MsoCloudifyUtils testedObjectSpy = spy(MsoCloudifyUtils.class);
246 testedObjectSpy.cloudConfig = mock(CloudConfig.class);
247 Map<String, byte[]> blueprints = new HashMap<>();
249 mockCloudConfig(testedObjectSpy);
250 doReturn(true).when(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME),
253 testedObjectSpy.uploadBlueprint(CLOUD_SITE_ID, BLUEPRINT_ID, FILE_NAME, blueprints, true);
255 verify(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME), eq(blueprints));
259 public void uploadBlueprint_exceptionThrown_blueprintExists() throws MsoException {
261 MsoCloudifyUtils testedObjectSpy = spy(MsoCloudifyUtils.class);
262 testedObjectSpy.cloudConfig = mock(CloudConfig.class);
263 Map<String, byte[]> blueprints = new HashMap<>();
265 mockCloudConfig(testedObjectSpy);
266 doReturn(false).when(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME),
270 testedObjectSpy.uploadBlueprint(CLOUD_SITE_ID, BLUEPRINT_ID, FILE_NAME, blueprints, true);
272 fail("MsoAdapterException should be thrown");
273 } catch (MsoAdapterException e) {
274 Assert.assertEquals(e.getMessage(), "Blueprint already exists");
276 verify(testedObjectSpy).uploadBlueprint(any(Cloudify.class), eq(BLUEPRINT_ID), eq(FILE_NAME), eq(blueprints));
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");
287 HeatTemplateParam paramString = new HeatTemplateParam();
288 paramString.setParamType("string");
289 paramString.setParamName("my-string");
291 HeatTemplateParam paramJson = new HeatTemplateParam();
292 paramJson.setParamType("json");
293 paramJson.setParamName("my-json");
295 HeatTemplateParam paramJsonEscaped = new HeatTemplateParam();
296 paramJsonEscaped.setParamType("json");
297 paramJsonEscaped.setParamName("my-json-escaped");
299 Map<String, Object> jsonMap =
300 mapper.readValue(getJson("free-form.json"), new TypeReference<Map<String, Object>>() {});
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);
308 JSONAssert.assertEquals(getJson("free-form.json"),
309 mapper.writeValueAsString(utils.convertInputValue(getJson("free-form.json"), paramJsonEscaped)), false);
313 private String getJson(String filename) throws IOException {
314 return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/MsoHeatUtils/" + filename)));
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);
323 private CloudifyManager createCloudifyManager() {
324 CloudifyManager cloudifyManager = new CloudifyManager();
325 cloudifyManager.setCloudifyUrl("cloudUrlTest");
326 cloudifyManager.setPassword("546573746F736973546573746F736973");
327 return cloudifyManager;
330 private CloudSite createCloudSite() {
331 CloudSite cloudSite = new CloudSite();
332 cloudSite.setCloudifyId(CLOUD_SITE_ID);