2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.ci.tests.execute.imports;
23 import com.google.gson.Gson;
24 import org.apache.commons.codec.binary.Base64;
25 import org.apache.commons.lang3.tuple.ImmutablePair;
26 import org.junit.Rule;
27 import org.junit.rules.TestName;
28 import org.openecomp.sdc.be.dao.api.ActionStatus;
29 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
30 import org.openecomp.sdc.be.model.*;
31 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
32 import org.openecomp.sdc.ci.tests.datatypes.ImportReqDetails;
33 import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
34 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
35 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
36 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
37 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
38 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
39 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
40 import org.testng.annotations.Test;
42 import java.io.IOException;
43 import java.nio.file.Files;
44 import java.nio.file.Path;
45 import java.nio.file.Paths;
46 import java.util.ArrayList;
47 import java.util.List;
49 import java.util.stream.Collectors;
51 import static org.testng.AssertJUnit.assertEquals;
52 import static org.testng.AssertJUnit.assertTrue;
55 * US US730518 Story [BE] - TOSCA capabilities with properties - import "As a
56 * resource designer, I would like to add my VFC capabilities with properties."
61 public class ImportToscaCapabilitiesWithProperties extends ComponentBaseTest {
63 public static TestName name = new TestName();
65 Gson gson = new Gson();
70 public static String propertyForTestName = "propertyfortest";
71 public static String rootPath = System.getProperty("user.dir");
72 public static String scalable = "tosca.capabilities.Scalable";
73 public static String container = "tosca.capabilities.Container";
74 public static String minInstances = "min_instances";
75 public static String userDefinedNodeYaml = "mycompute.yml";
78 * Capability Type - capability type on the graph should already have
79 * properties modeled on it. please verify. The import of the capability
80 * types should support adding those properties. when importing, validate
81 * name uniqueness between the capability's properties see capability
82 * tosca.capabilities.Container
84 * Acceptance Criteria: validate capability type properties (for example,
85 * compute have capability Container -> the properties of this capability
86 * should be in the Json response)
91 public void validateCapabilityTypePropertiesSucceed() throws IOException {
92 User user = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
93 RestResponse createResourceRes = ResourceRestUtils.getResourceByNameAndVersion(user.getUserId(), "Compute",
95 BaseRestUtils.checkSuccess(createResourceRes);
96 Resource resource = ResponseParser.convertResourceResponseToJavaObject(createResourceRes.getResponse());
97 Map<String, List<CapabilityDefinition>> capabilities = resource.getCapabilities();
98 assertEquals(capabilities.size(), 6);
100 CapabilityDefinition capability = capabilities.get(scalable).get(0);
101 List<ComponentInstanceProperty> properties = capability.getProperties();
102 assertEquals(properties.size(), 3);
103 assertTrue(!properties.stream().filter(p -> p.getName().equalsIgnoreCase(propertyForTestName)).findAny()
106 ComponentInstanceProperty originalProperty = properties.stream()
107 .filter(p -> p.getName().equalsIgnoreCase(minInstances)).findAny().get();
108 assertEquals(originalProperty.getType(), "integer");
109 assertEquals(originalProperty.getDefaultValue(), "1");
111 capability = capabilities.get(container).get(0);
112 properties = capability.getProperties();
113 assertEquals(properties.size(), 4);
117 * Capability Definition on VFC / CP / VL - properties can also be defined
118 * on the capability when the capability is declared. (property definition
119 * with default value) If the property name (case insensitive) already
120 * defined on the capability type, it overrides the capability from the
121 * capability type Import of VFC / CP /VL should support adding properties
122 * to the capability. when importing, validate name uniqueness between the
123 * capability's properties
125 * Acceptance Criteria: import node type with capability definition on it.
126 * use the attached "myCompute"
131 public void importNodeTypeWithCapabilityWithPropertiesFromYmlSucceed() throws Exception {
132 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
133 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
134 RestResponse createResource = importUserDefinedNodeType(userDefinedNodeYaml, sdncModifierDetails,
136 BaseRestUtils.checkCreateResponse(createResource);
137 Resource resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
139 Map<String, List<CapabilityDefinition>> capabilities = resource.getCapabilities();
140 assertEquals(capabilities.size(), 6);
142 CapabilityDefinition capability = capabilities.get(scalable).get(0);
143 List<ComponentInstanceProperty> properties = capability.getProperties();
144 assertEquals(properties.size(), 4);
146 ComponentInstanceProperty newProperty = properties.stream()
147 .filter(p -> p.getName().equalsIgnoreCase(propertyForTestName)).findAny().get();
148 assertEquals(newProperty.getType(), "string");
149 assertEquals(newProperty.getDescription(), "test");
150 assertEquals(newProperty.getDefaultValue(), "success");
152 ComponentInstanceProperty overriddenProperty = properties.stream()
153 .filter(p -> p.getName().equalsIgnoreCase(minInstances)).collect(Collectors.toList()).get(0);
154 assertEquals(overriddenProperty.getType(), "integer");
155 assertEquals(overriddenProperty.getDefaultValue(), "3");
160 * importNodeTypeWithCapabilityWithPropertiesFromYmlFailed
165 public void importNodeTypeWithCapabilityWithPropertiesFromYmlFailed() throws Exception {
166 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
167 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
168 RestResponse createResource = importUserDefinedNodeType("mycompute_failed.yml", sdncModifierDetails,
170 BaseRestUtils.checkErrorMessageResponse(createResource, ActionStatus.PROPERTY_NAME_ALREADY_EXISTS);
174 * Capability Assignment (on node_template / resource instance) - should
175 * support assignment of the property (property value). On the resource
176 * instance level, value can be assigned to either properties that are
177 * defined on the capability type or on the capability definition. When
178 * importing a VF - the node_template can have capability's property value.
179 * It should be imported and saved on the graph Acceptance Criteria: import
180 * a VF that assign values to property of capability that was defined on the
186 public void importResourceWithCapabilityWithPropertiesOverridingCapTypePropertiesSucceed() throws Exception {
187 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
188 String payloadName = "vf_with_cap_prop_override_cap_type_prop.csar";
189 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
190 Path path = Paths.get(rootPath + "/src/test/resources/CI/csars/vf_with_cap_prop_override_cap_type_prop.csar");
191 byte[] data = Files.readAllBytes(path);
192 String payloadData = Base64.encodeBase64String(data);
193 resourceDetails.setPayloadData(payloadData);
195 resourceDetails.setPayloadName(payloadName);
196 resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
197 RestResponse createResource = ResourceRestUtils.createResource(resourceDetails, sdncModifierDetails);
198 BaseRestUtils.checkCreateResponse(createResource);
200 List<ImmutablePair<String, String>> propertyNamesValues = new ArrayList<>();
201 propertyNamesValues.add(new ImmutablePair<String, String>("num_cpus", "2"));
202 propertyNamesValues.add(new ImmutablePair<String, String>("mem_size", "2000 MB"));
203 checkResource(createResource, 8, container, "DBMS", propertyNamesValues);
205 ResourceReqDetails resourceDetails2 = ElementFactory.getDefaultResource();
206 resourceDetails2.setCsarUUID("vf_with_cap_prop_override_cap_type_prop.csar");
207 resourceDetails2.setResourceType(ResourceTypeEnum.VF.name());
208 createResource = ResourceRestUtils.createResource(resourceDetails2, sdncModifierDetails);
209 BaseRestUtils.checkCreateResponse(createResource);
211 checkResource(createResource, 8, container, "DBMS", propertyNamesValues);
215 * importResourceWithCapabilityWithPropertiesOverridingCapTypePropertiesFailed
220 public void importResourceWithCapabilityWithPropertiesOverridingCapTypePropertiesFailed() throws Exception {
221 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
222 String payloadName = "vf_with_cap_prop_override_cap_type_prop_failed.csar";
223 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
225 .get(rootPath + "/src/test/resources/CI/csars/vf_with_cap_prop_override_cap_type_prop_failed.csar");
226 byte[] data = Files.readAllBytes(path);
227 String payloadData = Base64.encodeBase64String(data);
228 resourceDetails.setPayloadData(payloadData);
230 resourceDetails.setPayloadName(payloadName);
231 resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
232 RestResponse createResource = ResourceRestUtils.createResource(resourceDetails, sdncModifierDetails);
233 BaseRestUtils.checkErrorMessageResponse(createResource, ActionStatus.INVALID_PROPERTY);
235 ResourceReqDetails resourceDetails2 = ElementFactory.getDefaultResource();
236 resourceDetails2.setCsarUUID("vf_with_cap_prop_override_cap_type_prop_failed.csar");
237 resourceDetails2.setResourceType(ResourceTypeEnum.VF.name());
238 createResource = ResourceRestUtils.createResource(resourceDetails2, sdncModifierDetails);
239 BaseRestUtils.checkErrorMessageResponse(createResource, ActionStatus.INVALID_PROPERTY);
244 * Capability Assignment (on node_template / resource instance) - should
245 * support assignment of the property (property value). On the resource
246 * instance level, value can be assigned to either properties that are
247 * defined on the capability type or on the capability definition. When
248 * importing a VF - the node_template can have capability's property value.
249 * It should be imported and saved on the graph Acceptance Criteria: import
250 * a VF that assign values to property of capability that was defined on the
251 * capability definition (on the node type)
256 public void importResourceWithCapabilityWithPropertiesOverridingNodeTypeCapPropertiesSucceed() throws Exception {
258 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
259 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
260 RestResponse createResource = importUserDefinedNodeType(userDefinedNodeYaml, sdncModifierDetails,
262 BaseRestUtils.checkCreateResponse(createResource);
263 Resource userDefinedNodeType = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(),
266 String payloadName = "vf_with_cap_prop_override_cap_type_prop1.csar";
267 resourceDetails = ElementFactory.getDefaultImportResource();
268 Path path = Paths.get(rootPath + "/src/test/resources/CI/csars/vf_with_cap_prop_override_cap_type_prop1.csar");
269 byte[] data = Files.readAllBytes(path);
270 String payloadData = Base64.encodeBase64String(data);
271 resourceDetails.setPayloadData(payloadData);
273 resourceDetails.setPayloadName(payloadName);
274 resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
275 createResource = ResourceRestUtils.createResource(resourceDetails, sdncModifierDetails);
276 BaseRestUtils.checkCreateResponse(createResource);
278 List<ImmutablePair<String, String>> propertyNamesValues = new ArrayList<>();
279 propertyNamesValues.add(new ImmutablePair<String, String>("num_cpus", "2"));
280 propertyNamesValues.add(new ImmutablePair<String, String>("mem_size", "2000 MB"));
281 checkResource(createResource, 8, container, "DBMS", propertyNamesValues);
283 List<ImmutablePair<String, String>> propertyNamesValues1 = new ArrayList<>();
284 propertyNamesValues1.add(new ImmutablePair<String, String>(propertyForTestName, "success_again"));
285 propertyNamesValues1.add(new ImmutablePair<String, String>(minInstances, "4"));
286 checkResource(createResource, 8, scalable, userDefinedNodeType.getName(), propertyNamesValues1);
288 ResourceReqDetails resourceDetails2 = ElementFactory.getDefaultResource();
289 resourceDetails2.setCsarUUID("vf_with_cap_prop_override_cap_type_prop1.csar");
290 resourceDetails2.setResourceType(ResourceTypeEnum.VF.name());
291 createResource = ResourceRestUtils.createResource(resourceDetails2, sdncModifierDetails);
292 BaseRestUtils.checkCreateResponse(createResource);
294 checkResource(createResource, 8, container, "DBMS", propertyNamesValues);
295 checkResource(createResource, 8, scalable, userDefinedNodeType.getName(), propertyNamesValues1);
300 * importResourceWithCapabilityWithPropertiesOverridingNodeTypeCapPropertiesFailed
305 public void importResourceWithCapabilityWithPropertiesOverridingNodeTypeCapPropertiesFailed() throws Exception {
307 User sdncModifierDetails = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
308 ImportReqDetails resourceDetails = ElementFactory.getDefaultImportResource();
309 RestResponse createResource = importUserDefinedNodeType(userDefinedNodeYaml, sdncModifierDetails,
311 BaseRestUtils.checkCreateResponse(createResource);
313 String payloadName = "vf_with_cap_prop_override_cap_type_prop1_failed.csar";
314 resourceDetails = ElementFactory.getDefaultImportResource();
316 .get(rootPath + "/src/test/resources/CI/csars/vf_with_cap_prop_override_cap_type_prop1_failed.csar");
317 byte[] data = Files.readAllBytes(path);
318 String payloadData = Base64.encodeBase64String(data);
319 resourceDetails.setPayloadData(payloadData);
321 resourceDetails.setPayloadName(payloadName);
322 resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
323 createResource = ResourceRestUtils.createResource(resourceDetails, sdncModifierDetails);
324 BaseRestUtils.checkErrorResponse(createResource, ActionStatus.PROPERTY_NAME_ALREADY_EXISTS,
325 propertyForTestName);
327 ResourceReqDetails resourceDetails2 = ElementFactory.getDefaultResource();
328 resourceDetails2.setCsarUUID("vf_with_cap_prop_override_cap_type_prop1_failed.csar");
329 resourceDetails2.setResourceType(ResourceTypeEnum.VF.name());
330 createResource = ResourceRestUtils.createResource(resourceDetails2, sdncModifierDetails);
331 BaseRestUtils.checkErrorResponse(createResource, ActionStatus.PROPERTY_NAME_ALREADY_EXISTS,
332 propertyForTestName);
335 private RestResponse importUserDefinedNodeType(String payloadName, User sdncModifierDetails,
336 ImportReqDetails resourceDetails) throws Exception {
338 Path path = Paths.get(rootPath + "/src/test/resources/CI/csars/" + payloadName);
339 byte[] data = Files.readAllBytes(path);
340 String payloadData = Base64.encodeBase64String(data);
341 resourceDetails.setPayloadData(payloadData);
343 resourceDetails.setPayloadName(payloadName);
344 resourceDetails.setResourceType(ResourceTypeEnum.VFC.name());
345 return ResourceRestUtils.createResource(resourceDetails, sdncModifierDetails);
348 // TODO Tal: Since Cashing change partial resource returned that causes null
350 // commented out till fixing
351 private void checkResource(RestResponse createResource, int capNum, String capType, String riName,
352 List<ImmutablePair<String, String>> propertyNamesValues) {
353 Resource resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
355 Map<String, List<CapabilityDefinition>> capabilities = resource.getCapabilities();
356 // TODO Tal: Since Cashing change partial resource returned that causes
357 // null pointer exception
358 /* assertEquals(capabilities.size(), capNum); */
360 * List<CapabilityDefinition> capabilitesContainer =
361 * capabilities.get(capType);
364 ComponentInstance resourceRI = resource.getComponentInstances().stream()
365 .filter(ri -> ri.getComponentName().equals(riName)).collect(Collectors.toList()).get(0);
366 // TODO Tal: Since Cashing change partial resource returned that causes
367 // null pointer exception
369 * CapabilityDefinition capabilityFromContainer =
370 * capabilitesContainer.stream()
371 * .filter(cap->cap.getOwnerId().equals(resourceRI.getUniqueId())).
372 * collect(Collectors.toList()).get(0);
375 CapabilityDefinition capabilityFromRI = resourceRI.getCapabilities().get(capType).get(0);
376 for (ImmutablePair<String, String> propValuePair : propertyNamesValues) {
377 // TODO Tal: Since Cashing change partial resource returned that
378 // causes null pointer exception
380 * Map<String, ComponentInstanceProperty> propertiesFromContainer =
381 * capabilityFromContainer.getProperties()
382 * .stream().filter(p->p.getName().equalsIgnoreCase(propValuePair.
383 * getLeft())) .collect(Collectors.toMap(p->p.getName(), p->p));
386 List<ComponentInstanceProperty> propertiesFromRI = capabilityFromRI.getProperties().stream()
387 .filter(p -> p.getName().equalsIgnoreCase(propValuePair.getLeft())).collect(Collectors.toList());
388 // TODO Tal: Since Cashing change partial resource returned that
389 // causes null pointer exception
391 * for(ComponentInstanceProperty riProp : propertiesFromRI){
392 * assertTrue(propertiesFromContainer.containsKey(riProp.getName()))
393 * ; ComponentInstanceProperty containerProp =
394 * propertiesFromContainer.get(riProp.getName());
395 * assertEquals(riProp.getValue(), containerProp.getValue());
396 * if(riProp.getName().equals(propValuePair.getLeft()))
397 * assertEquals(riProp.getValue(), propValuePair.getRight());