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.be.model.operations.impl;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertTrue;
26 import java.io.BufferedOutputStream;
28 import java.io.FileOutputStream;
29 import java.io.OutputStream;
30 import java.util.ArrayList;
31 import java.util.Collection;
32 import java.util.HashMap;
33 import java.util.Iterator;
34 import java.util.List;
36 import java.util.Map.Entry;
38 import java.util.UUID;
39 import java.util.function.Function;
40 import java.util.stream.Collectors;
42 import javax.annotation.Resource;
44 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
45 import org.junit.Before;
46 import org.junit.BeforeClass;
47 import org.junit.Test;
48 import org.junit.runner.RunWith;
49 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
50 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
51 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
52 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
53 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
54 import org.openecomp.sdc.be.model.CapabilityDefinition;
55 import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
56 import org.openecomp.sdc.be.model.ComponentInstance;
57 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
58 import org.openecomp.sdc.be.model.LifecycleStateEnum;
59 import org.openecomp.sdc.be.model.ModelTestBase;
60 import org.openecomp.sdc.be.model.PropertyConstraint;
61 import org.openecomp.sdc.be.model.PropertyDefinition;
62 import org.openecomp.sdc.be.model.Service;
63 import org.openecomp.sdc.be.model.User;
64 import org.openecomp.sdc.be.model.category.CategoryDefinition;
65 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
66 import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation;
67 import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation;
68 import org.openecomp.sdc.be.model.operations.impl.ComponentInstanceOperation;
69 import org.openecomp.sdc.be.model.operations.impl.LifecycleOperation;
70 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
71 import org.openecomp.sdc.be.model.operations.impl.ResourceOperation;
72 import org.openecomp.sdc.be.model.operations.impl.ServiceOperation;
73 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
74 import org.openecomp.sdc.be.model.operations.impl.util.OperationTestsUtil;
75 import org.openecomp.sdc.be.model.operations.impl.util.ResourceCreationUtils;
76 import org.openecomp.sdc.be.model.tosca.ToscaType;
77 import org.openecomp.sdc.be.model.tosca.constraints.GreaterThanConstraint;
78 import org.openecomp.sdc.be.model.tosca.constraints.InRangeConstraint;
79 import org.openecomp.sdc.be.model.tosca.constraints.LessOrEqualConstraint;
80 import org.openecomp.sdc.be.resources.data.CapabilityData;
81 import org.openecomp.sdc.be.resources.data.CapabilityInstData;
82 import org.openecomp.sdc.be.resources.data.PropertyValueData;
83 import org.openecomp.sdc.be.resources.data.ResourceMetadataData;
84 import org.openecomp.sdc.be.resources.data.ServiceMetadataData;
85 import org.openecomp.sdc.be.resources.data.UserData;
86 import org.openecomp.sdc.be.unittests.utils.FactoryUtils;
87 import org.openecomp.sdc.be.unittests.utils.FactoryUtils.Constants;
88 import org.slf4j.Logger;
89 import org.slf4j.LoggerFactory;
90 import org.springframework.test.context.ContextConfiguration;
91 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
93 import com.google.gson.Gson;
94 import com.google.gson.GsonBuilder;
95 import com.thinkaurelius.titan.core.TitanGraph;
96 import com.thinkaurelius.titan.core.TitanVertex;
98 import fj.data.Either;
100 @RunWith(SpringJUnit4ClassRunner.class)
101 @ContextConfiguration("classpath:application-context-test.xml")
102 public class ComponentInstanceOperationSpringTest extends ModelTestBase {
103 private static Logger log = LoggerFactory.getLogger(ComponentInstanceOperationSpringTest.class.getName());
104 @Resource(name = "component-instance-operation")
105 private ComponentInstanceOperation componentInstanceOperation;
107 @Resource(name = "component-instance-operation")
108 private ComponentInstanceOperation resourceInstanceOperation;
110 @Resource(name = "capability-type-operation")
111 private CapabilityTypeOperation capabilityTypeOperation;
113 @Resource(name = "capability-operation")
114 public CapabilityOperation capabilityOperation;
116 @Resource(name = "service-operation")
117 private ServiceOperation serviceOperation;
119 @Resource(name = "resource-operation")
120 private ResourceOperation resourceOperation;
122 @Resource(name = "property-operation")
123 private PropertyOperation propertyOperation;
125 @Resource(name = "lifecycle-operation")
126 private LifecycleOperation lifecycleOperation;
128 TitanGenericDao titanGenericDao;
130 private static String CATEGORY_NAME = "category/mycategory";
135 public static void setupBeforeClass() {
136 ModelTestBase.init();
141 public void cleanUp() {
142 titanGenericDao = componentInstanceOperation.titanGenericDao;
143 Either<TitanGraph, TitanOperationStatus> graphResult = titanGenericDao.getGraph();
144 TitanGraph graph = graphResult.left().value();
146 Iterable<TitanVertex> vertices = graph.query().vertices();
147 if (vertices != null) {
148 Iterator<TitanVertex> iterator = vertices.iterator();
149 while (iterator.hasNext()) {
150 TitanVertex vertex = iterator.next();
155 titanGenericDao.commit();
156 deleteAndCreateCategory(CATEGORY_NAME);
157 UserData modifierData = deleteAndCreateUser(ResourceCreationUtils.MODIFIER_ATT_UID + "rfc",
158 ResourceCreationUtils.MODIFIER_FIRST_NAME, ResourceCreationUtils.MODIFIER_LAST_NAME, "ADMIN");
159 rfcUser = convertUserDataToUser(modifierData);
163 public void testAddCapabilityPropertyValuesToResourceInstance() {
164 String rootName = "Root123";
165 org.openecomp.sdc.be.model.Resource rootResource = createResource(rfcUser.getUserId(), CATEGORY_NAME, rootName,
166 "1.0", null, false, true);
168 // certification request
169 Either<? extends org.openecomp.sdc.be.model.Component, StorageOperationStatus> requestCertificationResult = lifecycleOperation
170 .requestCertificationComponent(NodeTypeEnum.Resource, rootResource, rfcUser, rfcUser, false);
171 assertTrue(requestCertificationResult.isLeft());
173 org.openecomp.sdc.be.model.Resource resultResource = (org.openecomp.sdc.be.model.Resource) requestCertificationResult
176 // start certification
177 Either<? extends org.openecomp.sdc.be.model.Component, StorageOperationStatus> startCertificationResult = lifecycleOperation
178 .startComponentCertification(NodeTypeEnum.Resource, resultResource, rfcUser, rfcUser, false);
179 assertEquals(true, startCertificationResult.isLeft());
181 Either<? extends org.openecomp.sdc.be.model.Component, StorageOperationStatus> certifiedResourceRes = lifecycleOperation
182 .certifyComponent(NodeTypeEnum.Resource, rootResource, rfcUser, rfcUser, false);
183 assertTrue(certifiedResourceRes.isLeft());
185 CapabilityTypeDefinition capabilityType = buildCapabilityType();
186 Either<CapabilityTypeDefinition, StorageOperationStatus> capabilityTypeRes = capabilityTypeOperation
187 .addCapabilityType(capabilityType);
188 assertTrue(capabilityTypeRes.isLeft());
190 CapabilityData capData = FactoryUtils.createCapabilityData();
191 CapabilityDefinition capabilityDefinitionRoot = FactoryUtils
192 .convertCapabilityDataToCapabilityDefinitionRoot(capData);
194 Either<CapabilityDefinition, StorageOperationStatus> addCapabilityRootRes = capabilityOperation.addCapability(
195 (String) certifiedResourceRes.left().value().getUniqueId(), capabilityDefinitionRoot.getName(),
196 capabilityDefinitionRoot);
197 assertTrue(addCapabilityRootRes.isLeft());
199 String resourceName = "tosca.nodes.Apache.2.0";
201 CapabilityDefinition capabilityDefinition = FactoryUtils
202 .convertCapabilityDataToCapabilityDefinitionAddProperties(capData);
203 org.openecomp.sdc.be.model.Resource resource = createResource(rfcUser.getUserId(), CATEGORY_NAME, resourceName,
204 "0.1", rootName, false, true);
206 Either<CapabilityDefinition, StorageOperationStatus> addCapabilityRes = capabilityOperation
207 .addCapability((String) resource.getUniqueId(), capabilityDefinition.getName(), capabilityDefinition);
208 assertTrue(addCapabilityRes.isLeft());
209 List<ComponentInstanceProperty> properties = addCapabilityRes.left().value().getProperties();
210 assertTrue(properties.size() == 2);
212 Either<org.openecomp.sdc.be.model.Resource, StorageOperationStatus> clonedResourceRes = resourceOperation
213 .cloneComponent(resource, "0.2", false);
214 assertTrue(clonedResourceRes.isLeft());
215 org.openecomp.sdc.be.model.Resource clonedResource = clonedResourceRes.left().value();
217 ComponentInstance instance = buildResourceInstance(clonedResource.getUniqueId(), "1", "tosca.nodes.Apache");
219 Service origService = createService(rfcUser.getUserId(), CATEGORY_NAME, "my-service", "1.0", true);
220 Either<Service, StorageOperationStatus> service2 = serviceOperation.getService(origService.getUniqueId(),
222 assertTrue(service2.isLeft());
223 origService = service2.left().value();
225 Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
226 String json = prettyGson.toJson(origService);
229 Service fullService = origService;
231 Either<ComponentInstance, TitanOperationStatus> status = resourceInstanceOperation
232 .addComponentInstanceToContainerComponent((String) origService.getUniqueId(), NodeTypeEnum.Service, "1",
233 true, instance, NodeTypeEnum.Resource, false);
234 assertTrue(status.isLeft());
236 ComponentInstance resourceInstance = status.left().value();
237 CapabilityDefinition capability = addCapabilityRes.left().value();
238 capability.setName(capabilityDefinition.getName());
239 List<ComponentInstanceProperty> propertyValues = FactoryUtils.createComponentInstancePropertyList();
240 capability.setProperties(propertyValues);
242 Either<Map<CapabilityInstData, List<PropertyValueData>>, TitanOperationStatus> addCPVsToRiRes = componentInstanceOperation
243 .addCapabilityPropertyValuesToResourceInstance(resourceInstance.getUniqueId(), capability, true);
244 assertTrue(addCPVsToRiRes.isLeft());
246 Either<Service, StorageOperationStatus> createService = serviceOperation.cloneService(fullService, "2.0",
248 assertTrue(createService.isLeft());
249 Map<String, List<CapabilityDefinition>> capabilitiesMap = createService.left().value().getCapabilities();
250 assertTrue(capabilitiesMap != null && capabilitiesMap.size() == 1);
251 Map<String, CapabilityDefinition> capabilities = capabilitiesMap.values().iterator().next().stream()
252 .collect(Collectors.toMap(CapabilityDefinition::getName, Function.identity()));
253 assertTrue(capabilities.containsKey("Cap1") && capabilities.containsKey("Cap2"));
255 // String outputFile = exportGraphMl();
259 public String exportGraphMl() {
260 String result = null;
261 String outputFile = "C:\\Output" + File.separator + "exportGraph." + System.currentTimeMillis() + ".graphml";
262 TitanGraph graph = titanGenericDao.getGraph().left().value();
264 try (final OutputStream os = new BufferedOutputStream(new FileOutputStream(outputFile))) {
265 graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(os, graph);
269 } catch (Exception e) {
270 graph.tx().rollback();
277 private CapabilityTypeDefinition buildCapabilityType() {
278 CapabilityTypeDefinition capabilityType = new CapabilityTypeDefinition();
279 Map<String, PropertyDefinition> properties = new HashMap();
281 capabilityType.setType(Constants.DEFAULT_CAPABILITY_TYPE);
282 capabilityType.setProperties(properties);
284 PropertyDefinition host = new PropertyDefinition();
285 host.setUniqueId(UUID.randomUUID().toString());
286 host.setName("host");
287 host.setDefaultValue("captypehost");
288 host.setType("string");
290 host.setSchema(new SchemaDefinition());
291 host.getSchema().setProperty(new PropertyDataDefinition());
292 host.getSchema().getProperty().setType("string");
294 PropertyDefinition port = new PropertyDefinition();
295 port.setName("port");
296 port.setDefaultValue("captypeport");
297 port.setUniqueId(UUID.randomUUID().toString());
298 port.setType("string");
300 port.setSchema(new SchemaDefinition());
301 port.getSchema().setProperty(new PropertyDataDefinition());
302 port.getSchema().getProperty().setType("string");
304 PropertyDefinition rootproperty = new PropertyDefinition();
305 rootproperty.setName("captypeproperty");
306 rootproperty.setDefaultValue("captypevalue");
307 rootproperty.setUniqueId(UUID.randomUUID().toString());
308 rootproperty.setType("string");
310 rootproperty.setSchema(new SchemaDefinition());
311 rootproperty.getSchema().setProperty(new PropertyDataDefinition());
312 rootproperty.getSchema().getProperty().setType("string");
314 properties.put("host", host);
315 properties.put("port", port);
316 properties.put("captypeproperty", rootproperty);
317 return capabilityType;
320 private CapabilityInstData buildCapabilityInstanceData(String resourceInstanceId, CapabilityDefinition capability) {
321 CapabilityInstData capabilityInstance = new CapabilityInstData();
322 Long creationTime = System.currentTimeMillis();
323 String uniqueId = UniqueIdBuilder.buildCapabilityInstanceUid(resourceInstanceId, capability.getName());
324 capabilityInstance.setCreationTime(creationTime);
325 capabilityInstance.setModificationTime(creationTime);
326 capabilityInstance.setUniqueId(uniqueId);
327 return capabilityInstance;
330 private ComponentInstance buildResourceInstance(String respurceUid, String instanceNumber, String name) {
331 ComponentInstance resourceInstance = new ComponentInstance();
332 resourceInstance.setName(name);
333 resourceInstance.setDescription("desc1");
334 resourceInstance.setPosX("20");
335 resourceInstance.setPosY("40");
336 resourceInstance.setComponentUid(respurceUid);
337 resourceInstance.setCreationTime(System.currentTimeMillis());
338 resourceInstance.setModificationTime(System.currentTimeMillis());
339 resourceInstance.setNormalizedName(ResourceInstanceOperationTest.normaliseComponentInstanceName(name));
340 return resourceInstance;
343 public ResourceMetadataData createResource(String resourceName, TitanGenericDao titanGenericDao) {
344 ResourceMetadataData serviceData1 = new ResourceMetadataData();
345 serviceData1.getMetadataDataDefinition().setUniqueId(resourceName);
346 Either<ResourceMetadataData, TitanOperationStatus> createNode = titanGenericDao.createNode(serviceData1,
347 ResourceMetadataData.class);
348 assertTrue("check service created", createNode.isLeft());
349 return createNode.left().value();
352 public ServiceMetadataData createServiceMetadataData(String serviceName, TitanGenericDao titanGenericDao) {
353 ServiceMetadataData serviceData1 = new ServiceMetadataData();
354 serviceData1.getMetadataDataDefinition().setUniqueId(serviceName);
355 Either<ServiceMetadataData, TitanOperationStatus> createNode = titanGenericDao.createNode(serviceData1,
356 ServiceMetadataData.class);
357 assertTrue("check service created", createNode.isLeft());
358 return createNode.left().value();
361 public Service createService(String userId, String category, String serviceName, String serviceVersion,
362 boolean isHighestVersion) {
363 Service service = buildServiceMetadata(userId, category, serviceName, serviceVersion);
364 service.setHighestVersion(isHighestVersion);
365 Either<Service, StorageOperationStatus> result = serviceOperation.createService(service, true);
366 assertTrue(result.isLeft());
367 Service resultService = result.left().value();
368 assertEquals("check resource state", LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT,
369 resultService.getLifecycleState());
370 return resultService;
373 private Service buildServiceMetadata(String userId, String category, String serviceName, String serviceVersion) {
374 Service service = new Service();
375 service.setName(serviceName);
376 service.setVersion(serviceVersion);
377 service.setDescription("description 1");
378 service.setCreatorUserId(userId);
379 service.setContactId("contactId@sdc.com");
380 CategoryDefinition categoryDef = new CategoryDefinition();
381 categoryDef.setName(category);
382 List<CategoryDefinition> categories = new ArrayList<>();
383 categories.add(categoryDef);
384 service.setCategories(categories);
385 service.setIcon("images/my.png");
386 List<String> tags = new ArrayList<String>();
389 service.setTags(tags);
393 private void deleteAndCreateCategory(String category) {
394 String[] names = category.split("/");
395 OperationTestsUtil.deleteAndCreateServiceCategory(category, titanGenericDao);
396 OperationTestsUtil.deleteAndCreateResourceCategory(names[0], names[1], titanGenericDao);
399 private UserData deleteAndCreateUser(String userId, String firstName, String lastName, String role) {
400 UserData userData = new UserData();
401 userData.setUserId(userId);
402 userData.setFirstName(firstName);
403 userData.setLastName(lastName);
404 if (role != null && !role.isEmpty()) {
405 userData.setRole(role);
407 userData.setRole("ADMIN");
409 titanGenericDao.deleteNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.User), userId, UserData.class);
410 titanGenericDao.createNode(userData, UserData.class);
411 titanGenericDao.commit();
415 public org.openecomp.sdc.be.model.Resource createResource(String userId, String category, String resourceName,
416 String resourceVersion, String parentResourceName, boolean isAbstract, boolean isHighestVersion) {
418 String propName1 = "disk_size";
419 String propName2 = "num_cpus";
421 List<String> derivedFrom = new ArrayList<String>();
422 if (parentResourceName != null) {
423 derivedFrom.add(parentResourceName);
425 org.openecomp.sdc.be.model.Resource resource = buildResourceMetadata(userId, category, resourceName,
428 resource.setAbstract(isAbstract);
429 resource.setHighestVersion(isHighestVersion);
431 Map<String, PropertyDefinition> properties = new HashMap<String, PropertyDefinition>();
433 PropertyDefinition property1 = new PropertyDefinition();
434 property1.setDefaultValue("10");
435 property1.setDescription(
436 "Size of the local disk, in Gigabytes (GB), available to applications running on the Compute node.");
437 property1.setType(ToscaType.INTEGER.name().toLowerCase());
438 List<PropertyConstraint> constraints = new ArrayList<PropertyConstraint>();
439 GreaterThanConstraint propertyConstraint1 = new GreaterThanConstraint("0");
440 log.debug("{}", propertyConstraint1);
442 constraints.add(propertyConstraint1);
444 LessOrEqualConstraint propertyConstraint2 = new LessOrEqualConstraint("10");
445 constraints.add(propertyConstraint2);
447 property1.setConstraints(constraints);
449 properties.put(propName1, property1);
451 PropertyDefinition property2 = new PropertyDefinition();
452 property2.setDefaultValue("2");
453 property2.setDescription("Number of (actual or virtual) CPUs associated with the Compute node.");
454 property2.setType(ToscaType.INTEGER.name().toLowerCase());
455 List<PropertyConstraint> constraints3 = new ArrayList<PropertyConstraint>();
456 List<String> range = new ArrayList<String>();
460 InRangeConstraint propertyConstraint3 = new InRangeConstraint(range);
461 constraints3.add(propertyConstraint3);
462 property2.setConstraints(constraints3);
463 properties.put(propName2, property2);
465 resource.setDerivedFrom(derivedFrom);
467 resource.setProperties(convertMapToList(properties));
469 Either<org.openecomp.sdc.be.model.Resource, StorageOperationStatus> result = resourceOperation
470 .createResource(resource, true);
472 assertTrue(result.isLeft());
473 org.openecomp.sdc.be.model.Resource resultResource = result.left().value();
474 assertEquals("check resource state", LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT,
475 resultResource.getLifecycleState());
477 String resourceId = resultResource.getUniqueId();
479 Either<PropertyDefinition, StorageOperationStatus> either = propertyOperation.getPropertyOfResource(propName1,
482 assertTrue(either.isLeft());
483 PropertyDefinition propertyDefinition = either.left().value();
484 assertEquals("check property default value", property1.getDefaultValue(), propertyDefinition.getDefaultValue());
485 assertEquals("check property description", property1.getDescription(), propertyDefinition.getDescription());
486 assertEquals("check property type", property1.getType(), propertyDefinition.getType());
487 assertEquals("check property unique id", property1.getUniqueId(), propertyDefinition.getUniqueId());
488 assertEquals("check property consitraints size", property1.getConstraints().size(),
489 propertyDefinition.getConstraints().size());
491 return resultResource;
494 private org.openecomp.sdc.be.model.Resource buildResourceMetadata(String userId, String category,
495 String resourceName, String resourceVersion) {
497 org.openecomp.sdc.be.model.Resource resource = new org.openecomp.sdc.be.model.Resource();
498 resource.setName(resourceName);
499 resource.setVersion(resourceVersion);
501 resource.setDescription("description 1");
502 resource.setAbstract(false);
503 resource.setCreatorUserId(userId);
504 resource.setContactId("contactId@sdc.com");
505 resource.setVendorName("vendor 1");
506 resource.setVendorRelease("1.0.0");
507 resource.setToscaResourceName(resourceName);
508 String[] categoryArr = category.split("/");
509 resource.addCategory(categoryArr[0], categoryArr[1]);
510 resource.setIcon("images/my.png");
511 List<String> tags = new ArrayList<String>();
514 resource.setTags(tags);
518 public static List<PropertyDefinition> convertMapToList(Map<String, PropertyDefinition> properties) {
519 if (properties == null) {
523 List<PropertyDefinition> definitions = new ArrayList<>();
524 for (Entry<String, PropertyDefinition> entry : properties.entrySet()) {
525 String name = entry.getKey();
526 PropertyDefinition propertyDefinition = entry.getValue();
527 propertyDefinition.setName(name);
528 definitions.add(propertyDefinition);
534 private User convertUserDataToUser(UserData modifierData) {
535 User modifier = new User();
536 modifier.setUserId(modifierData.getUserId());
537 modifier.setEmail(modifierData.getEmail());
538 modifier.setFirstName(modifierData.getFirstName());
539 modifier.setLastName(modifierData.getLastName());
540 modifier.setRole(modifierData.getRole());