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.jsonjanusgraph.operations;
23 import fj.data.Either;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.EnumMap;
27 import java.util.HashMap;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.List;
32 import java.util.Map.Entry;
33 import java.util.Optional;
35 import java.util.UUID;
36 import java.util.function.BiConsumer;
37 import java.util.function.BiPredicate;
38 import java.util.stream.Collectors;
39 import org.apache.commons.collections.CollectionUtils;
40 import org.apache.commons.collections.MapUtils;
41 import org.apache.commons.lang.StringUtils;
42 import org.apache.commons.lang3.tuple.ImmutablePair;
43 import org.apache.commons.lang3.tuple.Pair;
44 import org.apache.tinkerpop.gremlin.structure.Direction;
45 import org.apache.tinkerpop.gremlin.structure.Edge;
46 import org.janusgraph.core.JanusGraphVertex;
47 import org.openecomp.sdc.be.config.BeEcompErrorManager;
48 import org.openecomp.sdc.be.config.ConfigurationManager;
49 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
50 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
51 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
52 import org.openecomp.sdc.be.dao.jsongraph.types.EdgePropertyEnum;
53 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
54 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
55 import org.openecomp.sdc.be.dao.jsongraph.utils.JsonParserUtils;
56 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
57 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
58 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
59 import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition;
60 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
61 import org.openecomp.sdc.be.datatypes.elements.GroupInstanceDataDefinition;
62 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
63 import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
64 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
65 import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
66 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
67 import org.openecomp.sdc.be.datatypes.elements.MapAttributesDataDefinition;
68 import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty;
69 import org.openecomp.sdc.be.datatypes.elements.MapDataDefinition;
70 import org.openecomp.sdc.be.datatypes.elements.MapGroupsDataDefinition;
71 import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
72 import org.openecomp.sdc.be.datatypes.elements.MapListCapabilityDataDefinition;
73 import org.openecomp.sdc.be.datatypes.elements.MapListRequirementDataDefinition;
74 import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
75 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
76 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
77 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
78 import org.openecomp.sdc.be.datatypes.elements.RelationshipInstDataDefinition;
79 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
80 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
81 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
82 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
83 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
84 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
85 import org.openecomp.sdc.be.model.*;
86 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.NodeType;
87 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
88 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
89 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElementTypeEnum;
90 import org.openecomp.sdc.be.model.jsonjanusgraph.enums.JsonConstantKeysEnum;
91 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
92 import org.openecomp.sdc.be.model.operations.StorageException;
93 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
94 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
95 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
96 import org.openecomp.sdc.be.ui.model.OperationUi;
97 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
98 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
99 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
100 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
101 import org.openecomp.sdc.common.log.elements.LoggerSupportability;
102 import org.openecomp.sdc.common.log.enums.LogLevel;
103 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
104 import org.openecomp.sdc.common.log.enums.StatusCode;
105 import org.openecomp.sdc.common.log.wrappers.Logger;
106 import org.openecomp.sdc.common.util.ValidationUtils;
108 @org.springframework.stereotype.Component("node-template-operation")
109 public class NodeTemplateOperation extends BaseOperation {
110 private static final String FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR = "Failed to fetch container vertex {} error {}";
111 private static final String FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE = "Failed to update topology template {} with new component instance {}. ";
112 private static final String ARTIFACT_PLACEHOLDER_TYPE = "type";
113 private static final String ARTIFACT_PLACEHOLDER_DISPLAY_NAME = "displayName";
114 private static final Object ARTIFACT_PLACEHOLDER_DESCRIPTION = "description";
115 static final String HEAT_ENV_NAME = "heatEnv";
116 static final String HEAT_VF_ENV_NAME = "VfHeatEnv";
117 static final String HEAT_ENV_SUFFIX = "env";
118 private static Integer defaultHeatTimeout;
119 public static final Integer NON_HEAT_TIMEOUT = 0;
121 private static final Logger log = Logger.getLogger(NodeTemplateOperation.class.getName());
122 private static final LoggerSupportability loggerSupportability=LoggerSupportability.getLogger(NodeTemplateOperation.class.getName());
123 public NodeTemplateOperation() {
124 defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getDefaultMinutes();
125 if ((defaultHeatTimeout == null) || (defaultHeatTimeout < 1)) {
126 defaultHeatTimeout = 60;
130 public static Integer getDefaultHeatTimeout() {
131 return defaultHeatTimeout;
134 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceToTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, String instanceNumberSuffix, ComponentInstance componentInstance,
135 boolean allowDeleted, User user) {
137 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
138 Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceRes = null;
139 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to create component instance {} in component {}", componentInstance, container.getUniqueId());
140 ComponentInstanceDataDefinition componentInstanceData = null;
141 Either<String, StorageOperationStatus> newInstanceNameRes = null;
143 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
144 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseJson);
145 if (metadataVertex.isRight()) {
146 JanusGraphOperationStatus status = metadataVertex.right().value();
147 if (status == JanusGraphOperationStatus.NOT_FOUND) {
148 status = JanusGraphOperationStatus.INVALID_ID;
150 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
153 if (result == null) {
155 newInstanceNameRes = buildValidateInstanceName(container, originToscaElement, componentInstance, instanceNumberSuffix);
156 if (newInstanceNameRes.isRight()) {
157 result = Either.right(newInstanceNameRes.right().value());
160 if (result == null) {
161 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), newInstanceNameRes.left().value(), true, originToscaElement);
163 addComponentInstanceRes = addComponentInstanceToTopologyTemplate(container, originToscaElement, componentInstanceData, metadataVertex.left().value(), allowDeleted, user);
165 if (addComponentInstanceRes.isRight()) {
166 StorageOperationStatus status = addComponentInstanceRes.right().value();
167 if (status == StorageOperationStatus.NOT_FOUND) {
168 status = StorageOperationStatus.INVALID_ID;
170 result = Either.right(status);
172 final TopologyTemplate updatedContainer = addComponentInstanceRes.left().value();
173 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
174 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
175 result = addCapAndReqToProxyServiceInstance(updatedContainer, componentInstance, componentInstanceData);
176 if(result.isRight()) {
180 result = addServiceInstancePropertiesToProxyServiceInstance(updatedContainer, componentInstance);
181 if(result.isRight()) {
185 result = addServiceInstanceInputsToProxyServiceInstance(updatedContainer, componentInstance);
186 if(result.isRight()) {
190 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
191 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution
192 || componentInstance.getOriginType() == OriginTypeEnum.VF
193 || componentInstance.getOriginType() == OriginTypeEnum.VFC) {
194 result = addComponentInstanceInterfacesToTopologyTemplate(updatedContainer, componentInstance);
195 if(result.isRight()) {
200 if (result == null) {
201 result = Either.left(new ImmutablePair<>(addComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
206 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addCapAndReqToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance,
207 ComponentInstanceDataDefinition componentInstanceData) {
208 Map<String, MapListCapabilityDataDefinition> calcCap = updatedContainer.getCalculatedCapabilities();
209 Map<String, MapListRequirementDataDefinition> calcReg = updatedContainer.getCalculatedRequirements();
210 Map<String, MapCapabilityProperty> calcCapProp = updatedContainer.getCalculatedCapabilitiesProperties();
212 Map<String, List<CapabilityDefinition>> additionalCap = componentInstance.getCapabilities();
213 Map<String, List<RequirementDefinition>> additionalReq = componentInstance.getRequirements();
215 MapListCapabilityDataDefinition allCalculatedCap = calcCap == null || !calcCap.containsKey(componentInstanceData.getUniqueId()) ? new MapListCapabilityDataDefinition() : calcCap.get(componentInstanceData.getUniqueId());
216 /******** capability ****************************/
217 StorageOperationStatus status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceData.getUniqueId());
218 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
219 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
220 return Either.right(status);
223 if (additionalCap != null && !additionalCap.isEmpty()) {
225 Map<String, ListCapabilityDataDefinition> serverCap = additionalCap.entrySet().stream()
226 .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListCapabilityDataDefinition(en.getValue().stream().map(CapabilityDataDefinition::new).collect(Collectors.toList()))));
228 serverCap.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
229 cap.addToPath(componentInstance.getUniqueId());
230 allCalculatedCap.add(entryPerType.getKey(), cap);
233 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
235 /******** capability property ****************************/
236 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId());
237 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
238 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
239 return Either.right(status);
242 MapCapabilityProperty allCalculatedCapProp = calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty() : calcCapProp.get(componentInstanceData.getUniqueId());
244 additionalCap.forEach(new BiConsumer<String, List<CapabilityDefinition>>() {
246 public void accept(String s, List<CapabilityDefinition> caps) {
247 if (caps != null && !caps.isEmpty()) {
248 MapPropertiesDataDefinition dataToCreate;
249 for (CapabilityDefinition cap : caps) {
250 dataToCreate = new MapPropertiesDataDefinition();
251 List<ComponentInstanceProperty> capPrps = cap.getProperties();
252 if (capPrps != null) {
253 for (ComponentInstanceProperty cip : capPrps) {
254 dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip));
256 StringBuilder sb = new StringBuilder(componentInstance.getUniqueId());
257 sb.append(ModelConverter.CAP_PROP_DELIM);
258 sb.append(cap.getOwnerId());
259 sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName());
260 allCalculatedCapProp.put(sb.toString(), dataToCreate);
266 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId());
269 /******** Requirements property ****************************/
270 if (additionalReq != null && !additionalReq.isEmpty()) {
272 MapListRequirementDataDefinition allCalculatedReq = calcReg == null || !calcReg.containsKey(componentInstanceData.getUniqueId()) ? new MapListRequirementDataDefinition() : calcReg.get(componentInstanceData.getUniqueId());
273 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceData.getUniqueId());
274 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
275 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated Requirements for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
276 return Either.right(status);
279 Map<String, ListRequirementDataDefinition> serverReq = additionalReq.entrySet().stream()
280 .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListRequirementDataDefinition(en.getValue().stream().map(RequirementDataDefinition::new).collect(Collectors.toList()))));
282 serverReq.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
283 cap.addToPath(componentInstance.getUniqueId());
284 allCalculatedReq.add(entryPerType.getKey(), cap);
287 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
291 Either<ToscaElement, StorageOperationStatus> updatedComponentInstanceRes = topologyTemplateOperation.getToscaElement(updatedContainer.getUniqueId());
292 if (updatedComponentInstanceRes.isRight()) {
293 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", updatedContainer.getName(), componentInstance.getName());
294 Either.right(updatedComponentInstanceRes.right().value());
296 return Either.left(new ImmutablePair<>((TopologyTemplate) updatedComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
299 private Either<String, StorageOperationStatus> buildValidateInstanceName(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance, String instanceNumberSuffix) {
301 Either<String, StorageOperationStatus> result = null;
302 String instanceName = componentInstance.getName();
303 if (StringUtils.isEmpty(instanceName) || instanceName.equalsIgnoreCase(originToscaElement.getName()) || componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
304 instanceName = buildComponentInstanceName(instanceNumberSuffix, instanceName);
305 } else if (!isUniqueInstanceName(container, componentInstance.getName())) {
306 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create component instance with name {} on component container {}. The instance with the same name already exists. ", componentInstance.getName(), container.getName());
307 result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
309 if (result == null) {
310 result = Either.left(instanceName);
315 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstancePropertiesToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
317 List<PropertyDefinition> propertiesList = componentInstance.getProperties();
319 if (propertiesList != null && !propertiesList.isEmpty()) {
320 Map<String, PropertyDataDefinition> propertiesMap = propertiesList.stream().map(PropertyDataDefinition::new)
321 .collect(Collectors.toMap(
322 PropertyDataDefinition::getName, i -> i));
323 MapPropertiesDataDefinition instProperties = new MapPropertiesDataDefinition(propertiesMap);
324 Map<String, MapPropertiesDataDefinition> instPropertiesMap = new HashMap<>();
325 instPropertiesMap.put(componentInstance.getUniqueId(), instProperties);
326 updatedContainer.setInstProperties(instPropertiesMap);
327 Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
328 .getVertexById(updatedContainer.getUniqueId(), JsonParseFlagEnum.NoParse);
329 if(getToscaElementRes.isLeft()){
330 deleteToscaDataDeepElementsBlockToToscaElement(getToscaElementRes.left().value(), EdgeLabelEnum.INST_PROPERTIES,
331 VertexTypeEnum.INST_PROPERTIES, componentInstance.getUniqueId());
333 StorageOperationStatus status = addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
334 EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, instProperties,
335 componentInstance.getUniqueId());
336 if (status != StorageOperationStatus.OK) {
337 return Either.right(status);
342 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
345 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInputsToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
347 List<InputDefinition> inputsList = componentInstance.getInputs();
349 if (CollectionUtils.isNotEmpty(inputsList)) {
350 Map<String, PropertyDataDefinition> inputsMap = inputsList.stream().map(
351 PropertyDataDefinition::new).collect(Collectors.toMap(PropertyDataDefinition::getName, i -> i));
352 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(inputsMap);
353 Map<String, MapPropertiesDataDefinition> instInputsMap = new HashMap<>();
354 instInputsMap.put(componentInstance.getUniqueId(), instInputs);
355 updatedContainer.setInstInputs(instInputsMap);
357 StorageOperationStatus status =
358 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
359 EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputs,
360 componentInstance.getUniqueId());
361 if(status != StorageOperationStatus.OK) {
362 return Either.right(status);
366 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
369 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceInterfacesToTopologyTemplate(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
370 Map<String, Object> interfaces = componentInstance.getInterfaces();
372 if(MapUtils.isNotEmpty(interfaces)){
373 Map<String, InterfaceDataDefinition> interfacesMap = interfaces.entrySet().stream().collect(Collectors.toMap(e -> ((InterfaceDataDefinition) e.getValue()).getUniqueId(), e -> (InterfaceDataDefinition) e.getValue()));
374 MapInterfaceDataDefinition instInterfaces = new MapInterfaceDataDefinition(interfacesMap);
376 Map<String, MapInterfaceDataDefinition> instInterfacesMap = new HashMap<>();
377 instInterfacesMap.put(componentInstance.getUniqueId(), instInterfaces);
378 updatedContainer.setComponentInstInterfaces(instInterfacesMap);
380 StorageOperationStatus status =
381 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
382 EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instInterfaces,
383 componentInstance.getUniqueId());
385 if(status != StorageOperationStatus.OK) {
386 return Either.right(status);
390 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
393 public Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceToTopologyTemplate(
394 TopologyTemplate container, ToscaElement originToscaElement,
395 ComponentInstanceDataDefinition componentInstance, GraphVertex metadataVertex, boolean allowDeleted,
398 Either<TopologyTemplate, StorageOperationStatus> result = null;
399 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
400 String containerComponentId = container.getUniqueId();
401 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to create component instance {} in component {}", componentInstance, containerComponentId);
402 String instOriginComponentId = componentInstance.getComponentUid();
403 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
405 Boolean isDeleted = (Boolean) originToscaElement.getMetadataValue(JsonPresentationFields.IS_DELETED);
407 if (!allowDeleted && (isDeleted != null) && isDeleted) {
408 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance", instOriginComponentId);
409 result = Either.right(StorageOperationStatus.INVALID_ID);
411 Boolean isArchived = originToscaElement.isArchived();
412 if (isArchived != null && isArchived) {
413 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create instance {}. Origin {} component is archived . ", componentInstance.getName(), originToscaElement.getName());
414 result = Either.right(StorageOperationStatus.COMPONENT_IS_ARCHIVED);
417 if (result == null) {
418 container.addComponentInstance(componentInstance);
419 metadataVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
420 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex, container, JsonParseFlagEnum.ParseAll);
421 updateElement = janusGraphDao.updateVertex(metadataVertex);
422 if (updateElement.isRight()) {
423 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
424 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
427 if (result == null) {
428 Either<GraphVertex, StorageOperationStatus> addToscaDataRes = addComponentInstanceToscaDataToContainerComponent(originToscaElement, componentInstance, updateElement.left().value());
429 if (addToscaDataRes.isRight()) {
430 result = Either.right(addToscaDataRes.right().value());
433 if (result == null) {
434 StorageOperationStatus createInstanceEdge = createInstanceEdge(metadataVertex, componentInstance);
435 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
438 if (result == null) {
439 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
440 if (updateContainerComponentRes.isRight()) {
441 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", container.getName(), componentInstance.getName());
442 result = Either.right(updateContainerComponentRes.right().value());
445 if (result == null) {
446 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
451 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance) {
453 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
454 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
456 String containerComponentId = container.getUniqueId();
457 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstance, containerComponentId);
458 ComponentInstanceDataDefinition componentInstanceData = null;
460 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
461 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
462 if (metadataVertex.isRight()) {
463 JanusGraphOperationStatus status = metadataVertex.right().value();
464 if (status == JanusGraphOperationStatus.NOT_FOUND) {
465 status = JanusGraphOperationStatus.INVALID_ID;
467 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
469 if (result == null) {
470 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), componentInstance.getName(), false, originToscaElement);
471 container.addComponentInstance(componentInstanceData);
472 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
473 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
474 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
475 .updateVertex(metadataVertex.left().value());
476 if (updateElement.isRight()) {
477 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
478 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
481 if (result == null) {
482 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
483 if (updateContainerComponentRes.isRight()) {
484 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with updated component instance {}. ", container.getName(), componentInstance.getName());
485 result = Either.right(updateContainerComponentRes.right().value());
488 if (result == null) {
489 result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceData.getUniqueId()));
494 public Either<TopologyTemplate, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ComponentParametersView filter) {
496 Either<TopologyTemplate, StorageOperationStatus> result = null;
497 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
499 String containerComponentId = container.getUniqueId();
500 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata of container component {}", containerComponentId);
502 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
503 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
504 if (metadataVertex.isRight()) {
505 JanusGraphOperationStatus status = metadataVertex.right().value();
506 if (status == JanusGraphOperationStatus.NOT_FOUND) {
507 status = JanusGraphOperationStatus.INVALID_ID;
509 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
511 if (result == null) {
512 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
513 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
514 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
515 .updateVertex(metadataVertex.left().value());
516 if (updateElement.isRight()) {
517 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {}. ", container.getName());
518 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
521 if (result == null) {
522 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId, filter);
523 if (updateContainerComponentRes.isRight()) {
524 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {}. ", container.getName());
525 result = Either.right(updateContainerComponentRes.right().value());
528 if (result == null) {
529 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
534 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> deleteComponentInstanceFromTopologyTemplate(TopologyTemplate container, String componentInstanceId) {
536 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
537 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
539 String containerComponentId = container.getUniqueId();
540 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstanceId, containerComponentId);
542 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
543 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
544 if (metadataVertex.isRight()) {
545 JanusGraphOperationStatus status = metadataVertex.right().value();
546 if (status == JanusGraphOperationStatus.NOT_FOUND) {
547 status = JanusGraphOperationStatus.INVALID_ID;
549 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
551 GraphVertex containerV = null;
552 ComponentInstanceDataDefinition removedComponentInstance = null;
553 if (result == null) {
554 removedComponentInstance = container.getComponentInstances().remove(componentInstanceId);
555 containerV = metadataVertex.left().value();
556 StorageOperationStatus status = removeRelationsOfInstance(container, componentInstanceId, containerV);
557 if (status != StorageOperationStatus.OK) {
558 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete relation for component instance {} in container. error {}", componentInstanceId, container.getUniqueId(), status);
559 result = Either.right(status);
562 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
563 topologyTemplateOperation.fillToscaElementVertexData(containerV, container, JsonParseFlagEnum.ParseAll);
564 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
565 if (updateElement.isRight()) {
566 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstanceId);
567 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
570 if (result == null) {
571 StorageOperationStatus status = deleteComponentInstanceToscaDataFromContainerComponent(containerV, componentInstanceId);
572 if (status != StorageOperationStatus.OK) {
573 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete data for instance {} in container {}. error {] ", componentInstanceId, container.getUniqueId(), status);
574 return Either.right(status);
576 ComponentInstance componentInstance = new ComponentInstance(removedComponentInstance);
577 StorageOperationStatus createInstanceEdge = removeInstanceEdge(containerV, componentInstance);
578 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
580 if (result == null) {
581 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
582 if (updateContainerComponentRes.isRight()) {
583 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} after deleting the component instance {}. ", container.getName(), componentInstanceId);
584 result = Either.right(updateContainerComponentRes.right().value());
587 if (result == null) {
588 result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceId));
593 private StorageOperationStatus removeRelationsOfInstance(TopologyTemplate container, String ciToRemove, GraphVertex containerV) {
594 CompositionDataDefinition composition = container.getCompositions().get(JsonConstantKeysEnum.COMPOSITION.getValue());
595 if (composition != null) {
596 Map<String, RelationshipInstDataDefinition> relations = composition.getRelations();
597 if (MapUtils.isNotEmpty(relations)) {
598 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
599 if (capResult.isRight()) {
600 return capResult.right().value();
603 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
605 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
606 if (capFullResult.isRight()) {
607 return capFullResult.right().value();
610 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
612 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
613 if (reqResult.isRight()) {
614 return reqResult.right().value();
616 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
618 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
619 if (reqResult.isRight()) {
620 return reqResult.right().value();
622 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
624 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
625 while (iterator.hasNext()) {
626 Entry<String, RelationshipInstDataDefinition> relation = iterator.next();
627 RelationshipInstDataDefinition relationToDelete = relation.getValue();
628 if (relationToDelete.getFromId().equals(ciToRemove) || relationToDelete.getToId().equals(ciToRemove)) {
630 if (relationToDelete.getFromId().equals(ciToRemove)) {
631 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, ciToRemove, relationToDelete, null);
632 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, relationToDelete.getToId(), relationToDelete, null);
634 if (relationToDelete.getToId().equals(ciToRemove)) {
635 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, relationToDelete.getFromId(), relationToDelete, null);
636 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, ciToRemove, relationToDelete, null);
640 return updateAllAndCalculatedCapReqOnGraph(container.getUniqueId(), containerV, capResult, capFullResult, reqResult, reqFullResult);
643 return StorageOperationStatus.OK;
646 private StorageOperationStatus deleteComponentInstanceToscaDataFromContainerComponent(GraphVertex containerV, String componentInstanceId) {
647 StorageOperationStatus status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceId);
648 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
649 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
652 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceId);
653 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
654 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
657 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceId);
658 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
659 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
662 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, componentInstanceId);
663 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
664 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled capabilities for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
667 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, componentInstanceId);
668 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
669 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
672 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, componentInstanceId);
673 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
674 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove attributes for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
677 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, componentInstanceId);
678 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
679 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
682 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, componentInstanceId);
683 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
684 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance inputs for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
687 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, componentInstanceId);
688 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
689 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
692 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, componentInstanceId);
693 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
694 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance deployment artifacts for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
697 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS, componentInstanceId);
698 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
699 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance artifacts for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
702 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, componentInstanceId);
703 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
704 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance external refs for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
707 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INTERFACES,
708 VertexTypeEnum.INST_INTERFACES, componentInstanceId);
709 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
710 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
711 "Failed to remove service instance interfaces for instance {} in container {}. " +
712 "error {] ", componentInstanceId, containerV.getUniqueId(), status);
715 return StorageOperationStatus.OK;
718 protected Either<GraphVertex, StorageOperationStatus> addComponentInstanceToscaDataToContainerComponent(ToscaElement originToscaElement, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
720 Either<GraphVertex, StorageOperationStatus> result;
721 StorageOperationStatus status;
722 if (originToscaElement.getToscaType() == ToscaElementTypeEnum.NODE_TYPE) {
723 status = addComponentInstanceToscaDataToNodeTypeContainer((NodeType) originToscaElement, componentInstance, updatedContainerVertex);
725 status = addComponentInstanceToscaDataToTopologyTemplateContainer((TopologyTemplate) originToscaElement, componentInstance, updatedContainerVertex);
727 if (status == StorageOperationStatus.OK) {
728 result = Either.left(updatedContainerVertex);
730 result = Either.right(status);
735 private StorageOperationStatus addComponentInstanceToscaDataToTopologyTemplateContainer(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
737 StorageOperationStatus status;
739 status = addCalculatedCapReqFromTopologyTemplate(originTopologyTemplate, componentInstance, updatedContainerVertex);
741 if (status != StorageOperationStatus.OK) {
746 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(originTopologyTemplate.getInputs());
747 MapPropertiesDataDefinition instInputsAsProperties = turnInputsIntoProperties(instInputs);
749 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputsAsProperties, componentInstance.getUniqueId());
750 if (status != StorageOperationStatus.OK) {
757 private MapPropertiesDataDefinition turnInputsIntoProperties(MapPropertiesDataDefinition instInput) {
758 if (instInput.getMapToscaDataDefinition() != null) {
759 for (PropertyDataDefinition currProp : instInput.getMapToscaDataDefinition().values()) {
760 String temp = currProp.getValue();
761 currProp.setValue(currProp.getDefaultValue());
762 currProp.setDefaultValue(temp);
768 private MapListCapabilityDataDefinition prepareCalculatedCapabiltyForTopologyTemplate(
769 Map<String, ListCapabilityDataDefinition> capabilities,
770 ComponentInstanceDataDefinition componentInstance,
771 MapListCapabilityDataDefinition calculatedCap) {
772 MapListCapabilityDataDefinition allCalculatedCap =
773 new MapListCapabilityDataDefinition(calculatedCap);
774 populateCapability(capabilities, componentInstance, allCalculatedCap);
775 return allCalculatedCap;
778 private void populateCapability(Map<String, ListCapabilityDataDefinition> capabilities,
779 ComponentInstanceDataDefinition componentInstance,
780 MapListCapabilityDataDefinition allCalculatedCap) {
781 capabilities.forEach((key, value) -> {
782 List<CapabilityDataDefinition> listCapabilities = value.getListToscaDataDefinition()
783 .stream().map(CapabilityDataDefinition::new).collect(Collectors.toList());
784 listCapabilities.forEach(cap -> {
785 cap.setSource(componentInstance.getComponentUid());
786 cap.addToPath(componentInstance.getUniqueId());
787 log.debug("enter populateCapability,get Capability OwnerId:{},get componentInstance UniqueId:{}",
788 cap.getOwnerId(), componentInstance.getUniqueId());
789 cap.setOwnerId(componentInstance.getUniqueId());
790 log.debug("enter populateCapability,get Capability OwnerName:{},get componentInstance Name:{}",
791 cap.getOwnerName(), componentInstance.getName());
792 if (cap.getOwnerName() == null || cap.getOwnerName().isEmpty()) {
793 cap.setOwnerName(componentInstance.getName());
795 cap.setLeftOccurrences(cap.getMaxOccurrences());
796 allCalculatedCap.add(key, cap);
801 private MapListRequirementDataDefinition prepareCalculatedRequirementForTopologyTemplate(
802 Map<String, ListRequirementDataDefinition> requirements,
803 ComponentInstanceDataDefinition componentInstance,
804 MapListRequirementDataDefinition calculatedReqs) {
805 MapListRequirementDataDefinition allCalculatedReq =
806 new MapListRequirementDataDefinition(calculatedReqs);
808 populateRequirement(requirements, componentInstance, allCalculatedReq);
809 return allCalculatedReq;
811 private void populateRequirement(Map<String, ListRequirementDataDefinition> requirements,
812 ComponentInstanceDataDefinition componentInstance,
813 MapListRequirementDataDefinition allCalculatedReq) {
814 requirements.forEach((key, value) -> {
815 List<RequirementDataDefinition> listRequirements = value.getListToscaDataDefinition()
816 .stream().map(RequirementDataDefinition::new).collect(Collectors.toList());
817 listRequirements.forEach(req -> {
818 req.setSource(componentInstance.getComponentUid());
819 req.addToPath(componentInstance.getUniqueId());
820 log.debug("enter populateRequirement,get init Requirements OwnerId:{},get componentInstance UniqueId:{}",
821 req.getOwnerId(), componentInstance.getUniqueId());
822 if (req.getOwnerId() == null || req.getOwnerId().isEmpty()) {
823 req.setOwnerId(componentInstance.getUniqueId());
825 log.debug("enter populateRequirement,get init Requirements OwnerName:{}", req.getOwnerName());
826 if (req.getOwnerName() == null || req.getOwnerName().isEmpty()) {
827 req.setOwnerName(componentInstance.getName());
829 req.setLeftOccurrences(req.getMaxOccurrences());
830 allCalculatedReq.add(key, req);
837 private StorageOperationStatus addCalculatedCapReqFromTopologyTemplate(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
838 Map<String, MapListCapabilityDataDefinition> calculatedCapabilities = originTopologyTemplate.getCalculatedCapabilities();
840 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
841 if (calculatedCapabilities != null) {
842 calculatedCapabilities.forEach((key1, value1) -> {
843 Map<String, ListCapabilityDataDefinition> mapByType = value1.getMapToscaDataDefinition();
844 mapByType.forEach((key, value) -> value.getListToscaDataDefinition().forEach(cap -> {
845 cap.addToPath(componentInstance.getUniqueId());
846 allCalculatedCap.add(key, cap);
850 MapListCapabilityDataDefinition allCaps;
851 Map<String, ListCapabilityDataDefinition> capabilities = originTopologyTemplate.getCapabilities();
852 if (MapUtils.isNotEmpty(capabilities)) {
853 allCaps = prepareCalculatedCapabiltyForTopologyTemplate(capabilities, componentInstance,
856 allCaps = new MapListCapabilityDataDefinition(allCalculatedCap);
858 if(!allCaps.isEmpty()) {
859 StorageOperationStatus calculatedCapabilitiesResult =
860 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
861 EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES,
862 allCaps, componentInstance.getUniqueId());
863 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
864 return calculatedCapabilitiesResult;
866 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
867 calculatedCapabilitiesResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
868 EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES,
869 fullCalculatedCap, componentInstance.getUniqueId());
870 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
871 return calculatedCapabilitiesResult;
874 Map<String, MapListRequirementDataDefinition> calculatedRequirements =
875 originTopologyTemplate.getCalculatedRequirements();
876 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
877 if (calculatedRequirements != null) {
878 calculatedRequirements.forEach((key, value) -> {
879 Map<String, ListRequirementDataDefinition> mapByType =
880 value.getMapToscaDataDefinition();
881 mapByType.forEach((key1, value1) -> value1.getListToscaDataDefinition().stream()
882 .filter(RequirementDataDefinition::isExternal).forEach(req -> {
883 req.addToPath(componentInstance.getUniqueId());
884 req.setExternal(false);
885 allCalculatedReq.add(key1, req);
891 MapListRequirementDataDefinition allReqs;
892 Map<String, ListRequirementDataDefinition> requirements = originTopologyTemplate.getRequirements();
893 if (MapUtils.isNotEmpty(requirements)) {
894 allReqs = prepareCalculatedRequirementForTopologyTemplate(requirements,
895 componentInstance, allCalculatedReq);
897 allReqs = new MapListRequirementDataDefinition(allCalculatedReq);
899 if(!allReqs.isEmpty()) {
900 StorageOperationStatus calculatedRequirementResult =
901 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
902 EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS,
903 allReqs, componentInstance.getUniqueId());
904 if (calculatedRequirementResult != StorageOperationStatus.OK) {
905 return calculatedRequirementResult;
907 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
908 calculatedRequirementResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
909 EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS,
911 componentInstance.getUniqueId());
912 if (calculatedRequirementResult != StorageOperationStatus.OK) {
913 return calculatedRequirementResult;
916 Map<String, MapCapabilityProperty> calculatedCapabilitiesProperties = originTopologyTemplate.getCalculatedCapabilitiesProperties();
917 Map<String, MapPropertiesDataDefinition> updateKeyMap = new HashMap<>();
919 if (calculatedCapabilitiesProperties != null && !calculatedCapabilitiesProperties.isEmpty()) {
920 for (MapCapabilityProperty map : calculatedCapabilitiesProperties.values()) {
921 for (Entry<String, MapPropertiesDataDefinition> entry : map.getMapToscaDataDefinition().entrySet()) {
922 String newKey = (componentInstance.getUniqueId() + ModelConverter.CAP_PROP_DELIM + entry.getKey());
923 updateKeyMap.put(newKey, entry.getValue());
927 Map<String, MapPropertiesDataDefinition> capabilitiesProperties =
928 originTopologyTemplate.getCapabilitiesProperties();
929 Map<String, MapPropertiesDataDefinition> updateKeyMapCapabilitiesProperties;
930 if (MapUtils.isNotEmpty(capabilitiesProperties)) {
931 updateKeyMapCapabilitiesProperties = capabilitiesProperties.entrySet().stream()
932 .collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(),
933 componentInstance.getUniqueId()), Entry::getValue));
936 updateKeyMapCapabilitiesProperties = new HashMap<>();
938 updateKeyMap.putAll(updateKeyMapCapabilitiesProperties);
939 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
941 if(MapUtils.isNotEmpty(capabilitiesProperties) || MapUtils.isNotEmpty(calculatedCapabilitiesProperties )) {
942 StorageOperationStatus calculatedResult =
943 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
944 EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
945 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty,
946 componentInstance.getUniqueId());
947 if (calculatedResult != StorageOperationStatus.OK) {
948 return calculatedResult;
951 return StorageOperationStatus.OK;
954 public StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition) {
955 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
956 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
957 if (containerVEither.isRight()) {
958 JanusGraphOperationStatus error = containerVEither.right().value();
959 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
960 return StorageOperationStatus.GENERAL_ERROR;
962 GraphVertex containerV = containerVEither.left().value();
963 return updateComponentInstanceRequirement(componentId, componentInstanceUniqueId, requirementDataDefinition, containerV);
966 private StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition, GraphVertex containerV) {
967 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> existingReqs = getCalculatedRequirements(componentId);
968 if (existingReqs.isRight()) {
969 return existingReqs.right().value();
971 MapListRequirementDataDefinition componentInstanceRequirementsMap = existingReqs.left().value().getRight().get(componentInstanceUniqueId);
972 if (componentInstanceRequirementsMap == null) {
973 return StorageOperationStatus.NOT_FOUND;
975 ListRequirementDataDefinition listRequirementDataDefinition = componentInstanceRequirementsMap.getMapToscaDataDefinition().get(requirementDataDefinition.getCapability());
977 listRequirementDataDefinition.getListToscaDataDefinition().stream()
978 .filter(e -> requirementDataDefinition.getOwnerId().equals(e.getOwnerId()) && requirementDataDefinition.getName().equals(e.getName()))
979 .forEach(r -> r.setExternal(requirementDataDefinition.isExternal()));
981 return updateCalculatedReqOnGraph(componentId, containerV, existingReqs);
984 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> getCalculatedRequirements(String componentId) {
985 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> result = null;
986 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
987 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
988 if (containerVEither.isRight()) {
989 JanusGraphOperationStatus error = containerVEither.right().value();
990 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
991 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
993 if (result == null) {
994 GraphVertex containerV = containerVEither.left().value();
995 result = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1000 private StorageOperationStatus updateCalculatedReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult
1002 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1003 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1004 if (updateElement.isRight()) {
1005 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1006 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1009 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1010 Either<GraphVertex, JanusGraphOperationStatus> status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1011 if (status.isRight()) {
1012 JanusGraphOperationStatus error = status.right().value();
1013 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1014 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1016 return StorageOperationStatus.OK;
1019 private StorageOperationStatus addComponentInstanceToscaDataToNodeTypeContainer(NodeType originNodeType,
1020 ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1022 StorageOperationStatus status;
1024 if(MapUtils.isNotEmpty(originNodeType.getProperties())){
1025 MapPropertiesDataDefinition instProperties =
1026 new MapPropertiesDataDefinition(originNodeType.getProperties());
1027 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_PROPERTIES,
1028 VertexTypeEnum.INST_PROPERTIES, instProperties, componentInstance.getUniqueId());
1029 if (status != StorageOperationStatus.OK) {
1034 if(MapUtils.isNotEmpty(originNodeType.getAttributes())){
1035 MapAttributesDataDefinition instAttributes =
1036 new MapAttributesDataDefinition(originNodeType.getAttributes());
1037 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_ATTRIBUTES,
1038 VertexTypeEnum.INST_ATTRIBUTES, instAttributes, componentInstance.getUniqueId());
1039 if (status != StorageOperationStatus.OK) {
1044 return addCalculatedCapReqFromNodeType(originNodeType, componentInstance, updatedContainerVertex);
1047 public MapArtifactDataDefinition prepareInstDeploymentArtifactPerInstance(Map<String, ArtifactDataDefinition> deploymentArtifacts, String componentInstanceId, User user, String envType) {
1048 if (deploymentArtifacts != null && envType.equals(HEAT_VF_ENV_NAME)) {
1049 Map<String, ArtifactDataDefinition> instDeploymentArtifacts = new HashMap<>();
1051 deploymentArtifacts.entrySet().forEach(e -> {
1052 ArtifactDataDefinition artifact = e.getValue();
1053 String type = artifact.getArtifactType();
1054 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
1055 ArtifactDataDefinition artifactEnv = createArtifactPlaceHolderInfo(artifact, componentInstanceId, user, envType);
1056 instDeploymentArtifacts.put(artifactEnv.getArtifactLabel(), artifactEnv);
1060 deploymentArtifacts.putAll(instDeploymentArtifacts);
1062 return new MapArtifactDataDefinition(deploymentArtifacts);
1068 @SuppressWarnings({"unchecked"})
1069 private ArtifactDataDefinition createArtifactPlaceHolderInfo(ArtifactDataDefinition artifactHeat, String componentId, User user, String heatEnvType) {
1070 Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getDeploymentResourceInstanceArtifacts();
1071 if (deploymentResourceArtifacts == null) {
1072 log.debug("no deployment artifacts are configured for generated artifacts");
1075 Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(heatEnvType);
1076 if (placeHolderData == null) {
1077 log.debug("no env type {} are configured for generated artifacts", heatEnvType);
1081 String envLabel = (artifactHeat.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
1083 ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition();
1085 String artifactName = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DISPLAY_NAME);
1086 String artifactType = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_TYPE);
1087 String artifactDescription = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DESCRIPTION);
1089 artifactInfo.setArtifactDisplayName(artifactName);
1090 artifactInfo.setArtifactLabel(envLabel);
1091 artifactInfo.setArtifactType(artifactType);
1092 artifactInfo.setDescription(artifactDescription);
1093 artifactInfo.setArtifactGroupType(artifactHeat.getArtifactGroupType());
1094 setDefaultArtifactTimeout(artifactHeat.getArtifactGroupType(), artifactInfo);
1095 artifactInfo.setGeneratedFromId(artifactHeat.getUniqueId());
1096 // clone heat parameters in case of heat env only not VF heat env
1097 if (heatEnvType.equals(HEAT_ENV_NAME)) {
1098 artifactInfo.setHeatParameters(artifactHeat.getHeatParameters());
1100 setArtifactPlaceholderCommonFields(componentId, user, artifactInfo);
1102 return artifactInfo;
1105 public void setDefaultArtifactTimeout(ArtifactGroupTypeEnum groupType, ArtifactDataDefinition artifactInfo) {
1106 if (groupType.equals(ArtifactGroupTypeEnum.DEPLOYMENT)) {
1107 artifactInfo.setTimeout(defaultHeatTimeout);
1109 artifactInfo.setTimeout(NON_HEAT_TIMEOUT);
1113 private void setArtifactPlaceholderCommonFields(String resourceId, User user, ArtifactDataDefinition artifactInfo) {
1114 if (resourceId != null) {
1115 String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(resourceId.toLowerCase(), artifactInfo.getArtifactLabel().toLowerCase());
1116 artifactInfo.setUniqueId(uniqueId);
1118 artifactInfo.setUserIdCreator(user.getUserId());
1119 String fullName = user.getFullName();
1120 artifactInfo.setUpdaterFullName(fullName);
1122 long time = System.currentTimeMillis();
1124 artifactInfo.setCreatorFullName(fullName);
1125 artifactInfo.setCreationDate(time);
1127 artifactInfo.setLastUpdateDate(time);
1128 artifactInfo.setUserIdLastUpdater(user.getUserId());
1130 artifactInfo.setMandatory(true);
1134 * @param originNodeType
1135 * @param componentInstance
1136 * @param updatedContainerVertex
1139 private StorageOperationStatus addCalculatedCapReqFromNodeType(NodeType originNodeType, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1141 Map<String, ListCapabilityDataDefinition> capabilities = originNodeType.getCapabilities();
1142 MapListCapabilityDataDefinition allCalculatedCap = prepareCalculatedCapabiltyForNodeType(capabilities, componentInstance);
1143 StorageOperationStatus calculatedResult;
1144 if (allCalculatedCap != null) {
1145 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
1147 if (calculatedResult != StorageOperationStatus.OK) {
1148 return calculatedResult;
1151 Map<String, MapPropertiesDataDefinition> capabiltiesProperties = originNodeType.getCapabilitiesProperties();
1152 if (capabiltiesProperties != null) {
1153 Map<String, MapPropertiesDataDefinition> updateKeyMap = capabiltiesProperties.entrySet().stream().collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(), componentInstance.getUniqueId()), Entry::getValue));
1154 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
1155 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty, componentInstance.getUniqueId());
1156 if (calculatedResult != StorageOperationStatus.OK) {
1157 return calculatedResult;
1161 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
1162 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, fullCalculatedCap, componentInstance.getUniqueId());
1164 if (calculatedResult != StorageOperationStatus.OK) {
1165 return calculatedResult;
1168 Map<String, ListRequirementDataDefinition> requirements = originNodeType.getRequirements();
1170 MapListRequirementDataDefinition allCalculatedReq = prepareCalculatedRequirementForNodeType(requirements, componentInstance);
1172 StorageOperationStatus status;
1173 if (allCalculatedReq != null) {
1174 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
1175 if (status != StorageOperationStatus.OK) {
1179 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
1180 return addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, fullCalculatedReq, componentInstance.getUniqueId());
1183 public static String createCapPropertyKey(String key, String instanceId) {
1184 StringBuffer sb = new StringBuffer(instanceId);
1185 sb.append(ModelConverter.CAP_PROP_DELIM).append(instanceId).append(ModelConverter.CAP_PROP_DELIM).append(key);
1186 return sb.toString();
1190 * Prepares a map of capabilities lists Produces a deep copy of the received map of capabilities Sets values to the specific fields according to received component instance
1192 * @param capabilities
1193 * @param componentInstance
1196 public MapListCapabilityDataDefinition prepareCalculatedCapabiltyForNodeType(Map<String, ListCapabilityDataDefinition> capabilities, ComponentInstanceDataDefinition componentInstance) {
1197 if (capabilities != null) {
1198 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
1200 populateCapability(capabilities, componentInstance, allCalculatedCap);
1201 return allCalculatedCap;
1207 * Prepares a map of requirements lists Produces a deep copy of the received map of requirements Sets values to the specific fields according to received component instance
1209 * @param requirements
1210 * @param componentInstance
1213 public MapListRequirementDataDefinition prepareCalculatedRequirementForNodeType(Map<String, ListRequirementDataDefinition> requirements, ComponentInstanceDataDefinition componentInstance) {
1214 if (requirements != null) {
1215 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
1217 populateRequirement(requirements, componentInstance, allCalculatedReq);
1218 return allCalculatedReq;
1223 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstanceDataDefinition componentInstance, List<GroupDefinition> groups, Map<String, List<ArtifactDefinition>> groupInstancesArtifacts) {
1225 StorageOperationStatus result = null;
1226 Map<String, GroupInstanceDataDefinition> groupInstanceToCreate = new HashMap<>();
1227 if (groupInstancesArtifacts != null && CollectionUtils.isNotEmpty(groups)) {
1228 for (Map.Entry<String, List<ArtifactDefinition>> groupArtifacts : groupInstancesArtifacts.entrySet()) {
1229 Optional<GroupDefinition> groupOptional = groups.stream().filter(g -> g.getUniqueId().equals(groupArtifacts.getKey())).findFirst();
1230 if (groupOptional.isPresent()) {
1231 GroupInstanceDataDefinition groupInstance = buildGroupInstanceDataDefinition((GroupDataDefinition) groupOptional.get(), (ComponentInstanceDataDefinition) componentInstance, null);
1232 groupInstance.setGroupInstanceArtifacts(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getUniqueId).collect(Collectors.toList()));
1233 groupInstance.setGroupInstanceArtifactsUuid(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getArtifactUUID).collect(Collectors.toList()));
1234 groupInstanceToCreate.put(groupInstance.getName(), groupInstance);
1238 if (MapUtils.isNotEmpty(groupInstanceToCreate)) {
1239 result = addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, new MapDataDefinition<>(groupInstanceToCreate), componentInstance.getUniqueId());
1241 if (result == null) {
1242 result = StorageOperationStatus.OK;
1247 private ComponentInstanceDataDefinition buildComponentInstanceDataDefinition(ComponentInstance resourceInstance, String containerComponentId, String instanceNewName, boolean generateUid, ToscaElement originToscaElement) {
1248 String ciOriginComponentUid = resourceInstance.getComponentUid();
1250 if (!ValidationUtils.validateStringNotEmpty(resourceInstance.getCustomizationUUID())) {
1251 resourceInstance.setCustomizationUUID(generateCustomizationUUID());
1253 ComponentInstanceDataDefinition dataDefinition = new ComponentInstanceDataDefinition(resourceInstance);
1255 Long creationDate = resourceInstance.getCreationTime();
1256 Long modificationTime;
1257 if (creationDate == null) {
1258 creationDate = System.currentTimeMillis();
1259 modificationTime = creationDate;
1261 modificationTime = System.currentTimeMillis();
1263 dataDefinition.setComponentUid(ciOriginComponentUid);
1264 dataDefinition.setCreationTime(creationDate);
1265 dataDefinition.setModificationTime(modificationTime);
1266 if (StringUtils.isNotEmpty(instanceNewName)) {
1267 dataDefinition.setName(instanceNewName);
1268 resourceInstance.setName(instanceNewName);
1270 if (StringUtils.isNotEmpty(dataDefinition.getName()))
1271 dataDefinition.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(dataDefinition.getName()));
1272 dataDefinition.setIcon(resourceInstance.getIcon());
1274 dataDefinition.setUniqueId(UniqueIdBuilder.buildResourceInstanceUniuqeId(containerComponentId, ciOriginComponentUid, dataDefinition.getNormalizedName()));
1275 resourceInstance.setUniqueId(dataDefinition.getUniqueId());
1277 if (StringUtils.isEmpty(dataDefinition.getComponentVersion()) && originToscaElement != null)
1278 dataDefinition.setComponentVersion((String) originToscaElement.getMetadataValue(JsonPresentationFields.VERSION));
1279 if (StringUtils.isEmpty(dataDefinition.getComponentName()) && originToscaElement != null)
1280 dataDefinition.setComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.NAME));
1281 if (originToscaElement != null && dataDefinition.getToscaComponentName() == null)
1282 dataDefinition.setToscaComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
1283 if (dataDefinition.getOriginType() == null && originToscaElement != null) {
1284 ResourceTypeEnum resourceType = originToscaElement.getResourceType();
1285 OriginTypeEnum originType = OriginTypeEnum.findByValue(resourceType.name());
1286 dataDefinition.setOriginType(originType);
1288 if (dataDefinition.getOriginType() == OriginTypeEnum.ServiceProxy)
1289 dataDefinition.setIsProxy(true);
1291 return dataDefinition;
1294 private Boolean isUniqueInstanceName(TopologyTemplate container, String instanceName) {
1295 Boolean isUniqueName = true;
1297 isUniqueName = !container.getComponentInstances().values().stream().anyMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName));
1299 } catch (Exception e) {
1300 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Exception occured during fetching component instance with name {} from component container {}. {} ", instanceName, container.getName(), e.getMessage());
1302 return isUniqueName;
1305 private String buildComponentInstanceName(String instanceSuffixNumber, String instanceName) {
1306 return instanceName + " " + (instanceSuffixNumber == null ? 0 : instanceSuffixNumber);
1309 public Either<RequirementCapabilityRelDef, StorageOperationStatus> associateResourceInstances(Component component, String componentId, RequirementCapabilityRelDef relation) {
1310 List<RequirementCapabilityRelDef> relations = new ArrayList<>();
1311 relations.add(relation);
1312 Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances = associateResourceInstances(component, componentId, relations);
1313 if (associateResourceInstances.isRight()) {
1314 return Either.right(associateResourceInstances.right().value());
1316 return Either.left(associateResourceInstances.left().value().get(0));
1319 @SuppressWarnings({"unchecked"})
1320 public <T extends ToscaDataDefinition> Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances(Component component, String componentId, List<RequirementCapabilityRelDef> relations) {
1322 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1323 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1324 if (containerVEither.isRight()) {
1325 JanusGraphOperationStatus error = containerVEither.right().value();
1326 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1327 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1329 GraphVertex containerV = containerVEither.left().value();
1330 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1331 if (capResult.isRight()) {
1332 return Either.right(capResult.right().value());
1335 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
1337 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1338 if (capResult.isRight()) {
1339 return Either.right(capResult.right().value());
1342 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
1344 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1345 if (reqResult.isRight()) {
1346 return Either.right(reqResult.right().value());
1348 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1350 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1351 if (reqResult.isRight()) {
1352 return Either.right(reqResult.right().value());
1354 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
1356 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1357 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1359 StorageOperationStatus status;
1360 List<RequirementCapabilityRelDef> relationsList = new ArrayList<>();
1361 for (RequirementCapabilityRelDef relation : relations) {
1362 List<CapabilityRequirementRelationship> relationshipsResult = new ArrayList<>();
1363 String fromNode = relation.getFromNode();
1364 String toNode = relation.getToNode();
1365 List<CapabilityRequirementRelationship> relationships = relation.getRelationships();
1366 if (relationships == null || relationships.isEmpty()) {
1367 BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1368 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement definition sent in order to set the relation between {} to {}", fromNode, toNode);
1369 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATION.getName(),"componentId: "+componentId+" No requirement definition sent in order to set the relation between: "+fromNode+" to: "+toNode);
1370 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
1373 for (final CapabilityRequirementRelationship relationship : relationships) {
1374 final String requirement = relationship.getRelation().getRequirement();
1376 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> associateRes = connectInstancesInContainer(fromNode, toNode, relationship.getRelation(), relation.isOriginUI(), calculatedCapabilty, calculatedRequirement,
1377 fullFilledCapabilty, fullfilledRequirement, compositionDataDefinition, containerV.getUniqueId());
1380 if (associateRes.isRight()) {
1381 status = associateRes.right().value();
1382 BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1383 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),
1384 StatusCode.ERROR,"missing relationship: "+fromNode,"ComopnentId: "+componentId);
1385 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to associate resource instance {} to resource instance {}. status is {}", fromNode, toNode, status);
1386 return Either.right(status);
1389 final Map<JsonPresentationFields, T> relationshipFieldsMap = associateRes.left().value();
1390 final RelationshipInstDataDefinition relationshipInstData =
1391 (RelationshipInstDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.RELATIONSHIP);
1392 createRelationshipInterfaces(relationship.getOperations()).ifPresent(relationshipInstData::setInterfaces);
1393 RelationshipImpl relationshipImplResult = new RelationshipImpl();
1394 relationshipImplResult.setType(relationshipInstData.getType());
1395 RelationshipInfo requirementAndRelationshipPair = new RelationshipInfo(requirement, relationshipImplResult);
1396 requirementAndRelationshipPair.setCapability(relationship.getRelation().getCapability());
1397 requirementAndRelationshipPair.setRequirement(relationship.getRelation().getRequirement());
1398 requirementAndRelationshipPair.setCapabilityOwnerId(relationshipInstData.getCapabilityOwnerId());
1399 requirementAndRelationshipPair.setRequirementOwnerId(relationshipInstData.getRequirementOwnerId());
1400 requirementAndRelationshipPair.setCapabilityUid(relationship.getRelation().getCapabilityUid());
1401 requirementAndRelationshipPair.setRequirementUid(relationship.getRelation().getRequirementUid());
1402 requirementAndRelationshipPair.setId(relationshipInstData.getUniqueId());
1403 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
1404 capReqRel.setRelation(requirementAndRelationshipPair);
1405 capReqRel.setCapability((CapabilityDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.CAPABILITY));
1406 capReqRel.setRequirement((RequirementDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.REQUIREMENT));
1407 capReqRel.setOperations(relationship.getOperations());
1408 relationshipsResult.add(capReqRel);
1409 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "update customization UUID for from CI {} and to CI {}", relation.getFromNode(), relation.getToNode());
1410 status = updateCustomizationUUID(relation.getFromNode(), compositionDataDefinition);
1411 if (status != StorageOperationStatus.OK) {
1412 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),StatusCode.ERROR,"ERROR while update customization UUID for from CI "+relation.getFromNode()+" and to CI: "+relation.getToNode());
1413 return Either.right(status);
1415 status = updateCustomizationUUID(relation.getToNode(), compositionDataDefinition);
1416 if (status != StorageOperationStatus.OK) {
1417 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),StatusCode.ERROR,"ERROR while update customization UUID for from CI "+relation.getFromNode()+" and to CI: "+relation.getToNode());
1418 return Either.right(status);
1421 RequirementCapabilityRelDef reqCapRelDef = new RequirementCapabilityRelDef(relation);
1422 reqCapRelDef.setRelationships(relationshipsResult);
1423 relationsList.add(reqCapRelDef);
1425 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1426 if (status != StorageOperationStatus.OK) {
1427 return Either.right(status);
1429 return Either.left(relationsList);
1432 private Optional<ListDataDefinition<InterfaceDataDefinition>> createRelationshipInterfaces(
1433 final List<OperationUi> operationList) {
1435 if (CollectionUtils.isEmpty(operationList)) {
1436 return Optional.empty();
1438 final ListDataDefinition<InterfaceDataDefinition> interfaceList = new ListDataDefinition<>();
1439 final Map<String, List<OperationUi>> operationByInterfaceType = operationList.stream()
1440 .collect(Collectors.groupingBy(OperationUi::getInterfaceType));
1441 for (final Entry<String, List<OperationUi>> interfaceEntry : operationByInterfaceType.entrySet()) {
1442 interfaceList.add(createInterface(interfaceEntry.getKey(), interfaceEntry.getValue()));
1444 return Optional.of(interfaceList);
1447 private InterfaceDataDefinition createInterface(final String interfaceType, final List<OperationUi> operationList) {
1448 final InterfaceDataDefinition interfaceDataDefinition = new InterfaceDataDefinition();
1449 interfaceDataDefinition.setType(interfaceType);
1450 if (CollectionUtils.isNotEmpty(operationList)) {
1451 final Map<String, OperationDataDefinition> operationMap =
1452 operationList.stream().collect(Collectors.toMap(OperationUi::getOperationType, this::createOperation));
1453 interfaceDataDefinition.setOperations(operationMap);
1455 return interfaceDataDefinition;
1458 private OperationDataDefinition createOperation(final OperationUi operation) {
1459 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
1460 operationDataDefinition.setName(operation.getOperationType());
1461 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
1462 final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
1463 implementation.setArtifactName(operation.getImplementation());
1464 operationDataDefinition.setImplementation(implementation);
1465 if (CollectionUtils.isNotEmpty(operation.getInputs())) {
1466 final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
1467 operation.getInputs().forEach(input -> {
1468 final OperationInputDefinition operationInputDefinition = new OperationInputDefinition();
1469 operationInputDefinition.setLabel(input.getName());
1470 operationInputDefinition.setType(input.getType());
1471 operationInputDefinition.setValue(input.getValue());
1472 inputs.add(operationInputDefinition);
1474 operationDataDefinition.setInputs(inputs);
1477 return operationDataDefinition;
1480 private StorageOperationStatus updateAllAndCalculatedCapReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult,
1481 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult,
1482 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult) {
1483 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1484 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1485 if (updateElement.isRight()) {
1486 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1487 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1489 // update cap/req jsons, fulfilled cap/req jsons!!!!!
1490 Either<GraphVertex, JanusGraphOperationStatus> status;
1491 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated capabilty for container {}", containerV.getUniqueId());
1492 status = updateOrCopyOnUpdate(capResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1493 if (status.isRight()) {
1494 JanusGraphOperationStatus error = status.right().value();
1495 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated capabilty for container {} error {}", containerV.getUniqueId(), error);
1496 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1499 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1500 status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1501 if (status.isRight()) {
1502 JanusGraphOperationStatus error = status.right().value();
1503 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1504 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1507 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled capabilty for container {}", containerV.getUniqueId());
1508 status = updateOrCopyOnUpdate(capFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1509 if (status.isRight()) {
1510 JanusGraphOperationStatus error = status.right().value();
1511 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled capabilty for container {} error {}", containerV.getUniqueId(), error);
1512 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1515 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled requirement for container {}", containerV.getUniqueId());
1516 status = updateOrCopyOnUpdate(reqFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1517 if (status.isRight()) {
1518 JanusGraphOperationStatus error = status.right().value();
1519 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled requirement for container {} error {}", containerV.getUniqueId(), error);
1520 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1522 return StorageOperationStatus.OK;
1525 @SuppressWarnings({"unchecked"})
1526 public Either<RequirementCapabilityRelDef, StorageOperationStatus> dissociateResourceInstances(String componentId, RequirementCapabilityRelDef requirementDef) {
1527 if (requirementDef.getRelationships() == null) {
1528 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation pair in request [ {} ]", requirementDef);
1529 return Either.right(StorageOperationStatus.BAD_REQUEST);
1532 String fromResInstanceUid = requirementDef.getFromNode();
1533 String toResInstanceUid = requirementDef.getToNode();
1535 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1536 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1537 if (containerVEither.isRight()) {
1538 JanusGraphOperationStatus error = containerVEither.right().value();
1539 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1540 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1542 GraphVertex containerV = containerVEither.left().value();
1544 // DE191707 - validations
1545 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1546 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1547 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1548 ComponentInstanceDataDefinition ciFrom = componentInstances.get(fromResInstanceUid);
1549 if (ciFrom == null) {
1550 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "FROM instance {} isn't under container {}", fromResInstanceUid, componentId);
1551 return Either.right(StorageOperationStatus.NOT_FOUND);
1554 ComponentInstanceDataDefinition ciTo = componentInstances.get(toResInstanceUid);
1555 if (ciFrom == ciTo) {
1556 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "TO instance {} isn't under container {}", toResInstanceUid, componentId);
1557 return Either.right(StorageOperationStatus.NOT_FOUND);
1560 Map<String, RelationshipInstDataDefinition> relations = compositionDataDefinition.getRelations();
1562 List<CapabilityRequirementRelationship> relationPairList = requirementDef.getRelationships();
1563 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1564 if (capResult.isRight()) {
1565 return Either.right(capResult.right().value());
1567 Map<String, MapListCapabilityDataDefinition> calculatedCapability = capResult.left().value().getRight();
1569 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1570 if (capResult.isRight()) {
1571 return Either.right(capResult.right().value());
1574 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1576 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1577 if (reqResult.isRight()) {
1578 return Either.right(reqResult.right().value());
1580 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1582 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1583 if (reqResult.isRight()) {
1584 return Either.right(reqResult.right().value());
1586 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1588 for (CapabilityRequirementRelationship relationPair : relationPairList) {
1589 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
1590 boolean isDeleted = false;
1591 while (iterator.hasNext()) {
1592 Entry<String, RelationshipInstDataDefinition> entryInJson = iterator.next();
1593 RelationshipInstDataDefinition relationInJson = entryInJson.getValue();
1594 if (relationInJson.getFromId().equals(fromResInstanceUid) && relationInJson.getToId().equals(toResInstanceUid) && relationInJson.getUniqueId().equals(relationPair.getRelation().getId())) {
1595 if (relationPair.getRelation().equalsTo(relationInJson)) {
1596 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Remove relation from {} to {} capability {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationInJson.getType(), relationInJson.getCapabilityOwnerId(),
1597 relationInJson.getRequirementOwnerId());
1600 // update calculated cap/req
1601 StorageOperationStatus status = updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapability, fulfilledCapability, toResInstanceUid, relationInJson, relationPair);
1602 if (status != StorageOperationStatus.OK) {
1603 return Either.right(status);
1605 status = updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fulfilledRequirement, fromResInstanceUid, relationInJson, relationPair);
1606 if (status != StorageOperationStatus.OK) {
1607 return Either.right(status);
1614 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation to delete from {} to {} capabilty {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationPair.getCapability(),
1615 relationPair.getRelation().getCapabilityOwnerId(), relationPair.getRelation().getRequirementOwnerId());
1616 return Either.right(StorageOperationStatus.NOT_FOUND);
1619 StorageOperationStatus status = updateCustomizationUUID(fromResInstanceUid, compositionDataDefinition);
1620 if (status != StorageOperationStatus.OK) {
1621 return Either.right(status);
1623 status = updateCustomizationUUID(toResInstanceUid, compositionDataDefinition);
1624 if (status != StorageOperationStatus.OK) {
1625 return Either.right(status);
1629 // update metadata of container and composition json
1630 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1631 if (status != StorageOperationStatus.OK) {
1632 return Either.right(status);
1635 return Either.left(requirementDef);
1639 * Retrieves fulfilled requirement according to relation and received predicate
1641 * @param componentId
1643 * @param foundRelation
1647 public Either<RequirementDataDefinition, StorageOperationStatus> getFulfilledRequirementByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1648 BiPredicate<RelationshipInfo, RequirementDataDefinition> predicate) {
1650 Either<RequirementDataDefinition, StorageOperationStatus> result = null;
1651 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = null;
1652 MapListRequirementDataDefinition reqMapOfLists = null;
1653 Optional<RequirementDataDefinition> foundRequirement;
1654 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1655 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1656 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1657 if (containerVEither.isRight()) {
1658 JanusGraphOperationStatus error = containerVEither.right().value();
1659 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1660 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1662 if (result == null) {
1663 GraphVertex containerV = containerVEither.left().value();
1664 reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1665 if (reqFullResult.isRight()) {
1666 result = Either.right(reqFullResult.right().value());
1669 if (result == null) {
1670 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1671 reqMapOfLists = fulfilledRequirement.get(instanceId);
1672 if (reqMapOfLists == null) {
1673 result = Either.right(StorageOperationStatus.NOT_FOUND);
1676 if (result == null && reqMapOfLists != null) {
1677 for (ListRequirementDataDefinition requirements : reqMapOfLists.getMapToscaDataDefinition().values()) {
1678 foundRequirement = requirements.getListToscaDataDefinition().stream().filter(req -> predicate.test(relationshipInfo, req)).findFirst();
1679 if (foundRequirement.isPresent()) {
1680 result = Either.left(foundRequirement.get());
1688 * Retrieves fulfilled capability according to relation and received predicate
1690 * @param componentId
1692 * @param foundRelation
1696 public Either<CapabilityDataDefinition, StorageOperationStatus> getFulfilledCapabilityByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1697 BiPredicate<RelationshipInfo, CapabilityDataDefinition> predicate) {
1699 Either<CapabilityDataDefinition, StorageOperationStatus> result = null;
1700 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = null;
1701 MapListCapabilityDataDefinition capMapOfLists = null;
1702 Optional<CapabilityDataDefinition> foundRequirement;
1704 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1705 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1706 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1707 if (containerVEither.isRight()) {
1708 JanusGraphOperationStatus error = containerVEither.right().value();
1709 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1710 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1712 if (result == null) {
1713 GraphVertex containerV = containerVEither.left().value();
1714 capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1715 if (capFullResult.isRight()) {
1716 result = Either.right(capFullResult.right().value());
1719 if (result == null) {
1720 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1721 capMapOfLists = fulfilledCapability.get(instanceId);
1722 if (capMapOfLists == null) {
1723 result = Either.right(StorageOperationStatus.NOT_FOUND);
1726 if (result == null && capMapOfLists != null) {
1727 for (ListCapabilityDataDefinition capabilities : capMapOfLists.getMapToscaDataDefinition().values()) {
1728 foundRequirement = capabilities.getListToscaDataDefinition().stream().filter(cap -> predicate.test(relationshipInfo, cap)).findFirst();
1729 if (foundRequirement.isPresent()) {
1730 result = Either.left(foundRequirement.get());
1737 private StorageOperationStatus updateCalculatedRequirementsAfterDeleteRelation(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1738 RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1739 StorageOperationStatus status;
1740 String hereIsTheKey = null;
1741 MapListRequirementDataDefinition reqByInstance = calculatedRequirement.get(fromResInstanceUid);
1742 if (reqByInstance == null || reqByInstance.findKeyByItemUidMatch(relation.getRequirementId()) == null) {
1743 // move from fulfilled
1744 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1746 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1747 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1748 Optional<RequirementDataDefinition> requirementOptional = reqByType.getListToscaDataDefinition().stream()
1749 .filter(req -> req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())).findFirst();
1751 if (requirementOptional.isPresent()) {
1753 RequirementDataDefinition requirement = requirementOptional.get();
1754 String leftOccurrences = requirement.getLeftOccurrences();
1755 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
1756 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1758 requirement.setLeftOccurrences(String.valueOf(leftIntValue));
1760 if (relationship != null) {
1761 relationship.setRequirement(requirement);
1763 status = StorageOperationStatus.OK;
1765 // move from fulfilled
1766 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1772 private StorageOperationStatus updateCalculatedCapabiltyAfterDeleteRelation(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1773 RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1774 StorageOperationStatus status;
1775 String hereIsTheKey = null;
1776 MapListCapabilityDataDefinition capByInstance = calculatedCapability.get(toResInstanceUid);
1777 if (capByInstance == null || capByInstance.findKeyByItemUidMatch(relation.getCapabilityId()) == null) {
1778 // move from fulfilled
1779 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1781 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1782 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1783 Optional<CapabilityDataDefinition> capabilityOptional = capByType.getListToscaDataDefinition().stream().filter(cap -> cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId()))
1786 if (capabilityOptional.isPresent()) {
1788 CapabilityDataDefinition capability = capabilityOptional.get();
1789 String leftOccurrences = capability.getLeftOccurrences();
1790 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
1791 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1793 capability.setLeftOccurrences(String.valueOf(leftIntValue));
1795 if (relationship != null) {
1796 relationship.setCapability(capability);
1798 status = StorageOperationStatus.OK;
1800 // move from fulfilled
1801 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1807 private StorageOperationStatus moveFromFullFilledCapabilty(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1808 RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1809 MapListCapabilityDataDefinition capByInstance = fullFilledCapability.get(toResInstanceUid);
1810 if (capByInstance == null) {
1811 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability in fulfilled list for instance {} ", toResInstanceUid);
1812 return StorageOperationStatus.GENERAL_ERROR;
1814 if (null == hereIsTheKey)
1815 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1816 if (null == hereIsTheKey) {
1817 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability with id {} in fulfilled list for instance {} ", relation.getCapabilityId(), toResInstanceUid);
1818 return StorageOperationStatus.GENERAL_ERROR;
1820 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1821 Iterator<CapabilityDataDefinition> iterator = capByType.getListToscaDataDefinition().iterator();
1822 boolean found = false;
1823 while (iterator.hasNext()) {
1824 CapabilityDataDefinition cap = iterator.next();
1825 if (cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId())) {
1828 // return to calculated list
1829 String leftOccurrences = cap.getLeftOccurrences();
1830 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1832 cap.setLeftOccurrences(String.valueOf(leftIntValue));
1834 MapListCapabilityDataDefinition mapListCapaDataDef = calculatedCapability.get(toResInstanceUid);
1835 if (mapListCapaDataDef == null) {
1836 mapListCapaDataDef = new MapListCapabilityDataDefinition();
1838 ListCapabilityDataDefinition findByKey = mapListCapaDataDef.findByKey(hereIsTheKey);
1839 if (findByKey == null) {
1840 findByKey = new ListCapabilityDataDefinition();
1841 mapListCapaDataDef.put(hereIsTheKey, findByKey);
1844 if (relationship != null)
1845 relationship.setCapability(cap);
1850 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getCapabilityOwnerId(), toResInstanceUid);
1851 return StorageOperationStatus.GENERAL_ERROR;
1853 return StorageOperationStatus.OK;
1856 private StorageOperationStatus moveFromFullFilledRequirement(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1857 RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1858 MapListRequirementDataDefinition reqByInstance = fullFilledRequirement.get(fromResInstanceUid);
1859 if (reqByInstance == null) {
1860 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement in fullfilled list for instance {} ", fromResInstanceUid);
1861 return StorageOperationStatus.GENERAL_ERROR;
1863 if (null == hereIsTheKey)
1864 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1865 if (null == hereIsTheKey) {
1866 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement with id {} in fulfilled list for instance {} ", relation.getRequirementId(), fromResInstanceUid);
1867 return StorageOperationStatus.GENERAL_ERROR;
1869 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1870 Iterator<RequirementDataDefinition> iterator = reqByType.getListToscaDataDefinition().iterator();
1871 boolean found = false;
1872 while (iterator.hasNext()) {
1873 RequirementDataDefinition req = iterator.next();
1874 if (req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())) {
1877 // return to calculated list
1878 String leftOccurrences = req.getLeftOccurrences();
1879 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1881 req.setLeftOccurrences(String.valueOf(leftIntValue));
1883 MapListRequirementDataDefinition mapListReqDataDef = calculatedRequirement.get(fromResInstanceUid);
1884 if (mapListReqDataDef == null) {
1885 mapListReqDataDef = new MapListRequirementDataDefinition();
1887 ListRequirementDataDefinition findByKey = mapListReqDataDef.findByKey(hereIsTheKey);
1888 if (findByKey == null) {
1889 findByKey = new ListRequirementDataDefinition();
1890 mapListReqDataDef.put(hereIsTheKey, findByKey);
1893 if (relationship != null)
1894 relationship.setRequirement(req);
1899 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getRequirementOwnerId(), fromResInstanceUid);
1900 return StorageOperationStatus.GENERAL_ERROR;
1902 return StorageOperationStatus.OK;
1906 public StorageOperationStatus updateCustomizationUUID(String componentInstanceId, CompositionDataDefinition compositionDataDefinition) {
1907 ComponentInstanceDataDefinition componentInstance = compositionDataDefinition.getComponentInstances().get(componentInstanceId);
1909 if (componentInstance == null) {
1910 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch component instance by id {} from map of instances ", componentInstanceId);
1911 return StorageOperationStatus.NOT_FOUND;
1913 UUID uuid = UUID.randomUUID();
1914 componentInstance.setCustomizationUUID(uuid.toString());
1916 return StorageOperationStatus.OK;
1919 public <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectInstancesInContainer(String fromResInstanceUid, String toResInstanceUid, RelationshipInfo relationPair, boolean originUI,
1920 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty,
1921 Map<String, MapListRequirementDataDefinition> fullfilledRequirement, CompositionDataDefinition compositionDataDefinition, String containerId) {
1922 String requirement = relationPair.getRequirement();
1923 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1925 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to associate resource instance {} to resource instance {} under component {}. Requirement is {}.", fromResInstanceUid, toResInstanceUid, containerId, requirement);
1927 ComponentInstanceDataDefinition fromResourceInstData = componentInstances.get(fromResInstanceUid);
1928 if (fromResourceInstData == null) {
1929 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find from resource instance {}.", fromResInstanceUid);
1930 return Either.right(StorageOperationStatus.NOT_FOUND);
1932 ComponentInstanceDataDefinition toResourceInstData = componentInstances.get(toResInstanceUid);
1933 if (toResourceInstData == null) {
1934 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find to resource instance {}.", toResInstanceUid);
1935 return Either.right(StorageOperationStatus.NOT_FOUND);
1938 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> reqVsCap = connectRequirementVsCapability(fromResourceInstData, toResourceInstData, relationPair, originUI, calculatedCapabilty, calculatedRequirement, fullfilledCapabilty,
1939 fullfilledRequirement, containerId);
1940 if (reqVsCap.isRight()) {
1941 StorageOperationStatus status = reqVsCap.right().value();
1942 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to connect requirement {} between resource instance {} to resource instance {}. status is {}", requirement, fromResInstanceUid, toResInstanceUid, status);
1943 return Either.right(status);
1945 Map<JsonPresentationFields, T> relationship = reqVsCap.left().value();
1947 // add to json new relations
1948 compositionDataDefinition.addRelation(((RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP)).getUniqueId(), (RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP));
1950 return Either.left(relationship);
1953 private Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedCapability(GraphVertex containerV, EdgeLabelEnum capLabel) {
1955 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, JanusGraphOperationStatus> calculatedCapabiltyEither = getDataAndVertexFromGraph(containerV, capLabel);
1956 if (calculatedCapabiltyEither.isRight()) {
1957 JanusGraphOperationStatus error = calculatedCapabiltyEither.right().value();
1958 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilties for container {}.", containerV.getUniqueId(), error);
1959 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1961 Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>> calculatedCapabilty = calculatedCapabiltyEither.left().value();
1962 return Either.left(calculatedCapabilty);
1965 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedRequirement(GraphVertex containerV, EdgeLabelEnum reqLabel) {
1966 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, JanusGraphOperationStatus> calculatedRequirementEither = getDataAndVertexFromGraph(containerV, reqLabel);
1967 if (calculatedRequirementEither.isRight()) {
1968 JanusGraphOperationStatus error = calculatedRequirementEither.right().value();
1969 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for container {}.", containerV.getUniqueId(), error);
1970 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1972 Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>> calculatedRequirement = calculatedRequirementEither.left().value();
1973 return Either.left(calculatedRequirement);
1976 @SuppressWarnings("unchecked")
1977 private <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectRequirementVsCapability(ComponentInstanceDataDefinition fromResInstance, ComponentInstanceDataDefinition toResInstance,
1978 RelationshipInfo relationPair, boolean originUI, Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement,
1979 Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty, Map<String, MapListRequirementDataDefinition> fullfilledRequirement, String containerId) {
1980 String type = relationPair.getRelationship().getType();
1983 String toInstId = toResInstance.getUniqueId();
1984 MapListCapabilityDataDefinition mapListCapabilityDataDefinition = calculatedCapabilty.get(toInstId);
1985 Map<JsonPresentationFields, T> capReqRelationship = new EnumMap<>(JsonPresentationFields.class);
1987 if (mapListCapabilityDataDefinition == null) {
1988 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for instance {} in container {}.", toInstId, containerId);
1989 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
1991 ListCapabilityDataDefinition listCapabilityDataDefinition = mapListCapabilityDataDefinition.getMapToscaDataDefinition().get(type);
1992 if (listCapabilityDataDefinition == null) {
1993 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for type {} for instance {} in container {}.", type, toInstId, containerId);
1994 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
1996 CapabilityDataDefinition capabilityForRelation = null;
1997 Iterator<CapabilityDataDefinition> iteratorCap = listCapabilityDataDefinition.getListToscaDataDefinition().iterator();
1998 while (iteratorCap.hasNext()) {
1999 CapabilityDataDefinition cap = iteratorCap.next();
2000 if (cap.getUniqueId().equals(relationPair.getCapabilityUid()) && cap.getOwnerId().equals(relationPair.getCapabilityOwnerId())) {
2001 capabilityForRelation = cap;
2002 capReqRelationship.put(JsonPresentationFields.CAPABILITY, (T) capabilityForRelation);
2003 String leftOccurrences = cap.getLeftOccurrences();
2004 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
2005 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2006 if (leftIntValue > 0) {
2008 capabilityForRelation.setLeftOccurrences(String.valueOf(leftIntValue));
2009 if (leftIntValue == 0) {
2010 // remove from calculated
2011 iteratorCap.remove();
2012 // move to fulfilled
2013 MapListCapabilityDataDefinition mapListCapabiltyFullFilledInst = fullfilledCapabilty.get(toInstId);
2014 if (mapListCapabiltyFullFilledInst == null) {
2015 mapListCapabiltyFullFilledInst = new MapListCapabilityDataDefinition();
2016 fullfilledCapabilty.put(toInstId, mapListCapabiltyFullFilledInst);
2019 ListCapabilityDataDefinition listCapabilityFull = mapListCapabiltyFullFilledInst.findByKey(type);
2020 if (listCapabilityFull == null) {
2021 listCapabilityFull = new ListCapabilityDataDefinition();
2022 mapListCapabiltyFullFilledInst.put(type, listCapabilityFull);
2024 listCapabilityFull.add(capabilityForRelation);
2028 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences capabilty {} to {} in container {}.", capabilityForRelation.getType(), toInstId, containerId);
2029 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2034 if (capabilityForRelation == null) {
2035 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch capabilty for type {} for instance {} in container {}.", type, toInstId, containerId);
2036 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2040 String fromInstId = fromResInstance.getUniqueId();
2041 MapListRequirementDataDefinition mapListRequirementDataDefinition = calculatedRequirement.get(fromInstId);
2042 if (mapListRequirementDataDefinition == null) {
2043 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for instance {} in container {}.", fromInstId, containerId);
2044 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2046 ListRequirementDataDefinition listRequirementDataDefinition = mapListRequirementDataDefinition.getMapToscaDataDefinition().get(type);
2047 if (listRequirementDataDefinition == null) {
2048 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for type {} for instance {} in container {}.", type, fromInstId, containerId);
2049 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2052 RequirementDataDefinition requirementForRelation = null;
2053 Iterator<RequirementDataDefinition> iteratorReq = listRequirementDataDefinition.getListToscaDataDefinition().iterator();
2054 while (iteratorReq.hasNext()) {
2055 RequirementDataDefinition req = iteratorReq.next();
2056 if (req.getUniqueId().equals(relationPair.getRequirementUid()) && req.getOwnerId().equals(relationPair.getRequirementOwnerId())) {
2057 requirementForRelation = req;
2058 capReqRelationship.put(JsonPresentationFields.REQUIREMENT, (T) requirementForRelation);
2059 String leftOccurrences = req.getLeftOccurrences();
2060 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
2061 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2062 if (leftIntValue > 0) {
2064 req.setLeftOccurrences(String.valueOf(leftIntValue));
2065 if (leftIntValue == 0) {
2066 // remove from calculated
2067 iteratorReq.remove();
2068 // move to fulfilled
2069 MapListRequirementDataDefinition mapListRequirementFullFilledInst = fullfilledRequirement.get(fromInstId);
2070 if (mapListRequirementFullFilledInst == null) {
2071 mapListRequirementFullFilledInst = new MapListRequirementDataDefinition();
2072 fullfilledRequirement.put(fromInstId, mapListRequirementFullFilledInst);
2075 ListRequirementDataDefinition listRequirementFull = mapListRequirementFullFilledInst.findByKey(type);
2076 if (listRequirementFull == null) {
2077 listRequirementFull = new ListRequirementDataDefinition();
2078 mapListRequirementFullFilledInst.put(type, listRequirementFull);
2080 listRequirementFull.add(requirementForRelation);
2084 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences requirement {} from {} to {} in container {}.", requirementForRelation.getCapability(), fromInstId, toInstId, containerId);
2085 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2090 if (requirementForRelation == null) {
2091 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch requirement for type {} for instance {} in container {}.", type, toInstId, containerId);
2092 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2094 if (!capabilityForRelation.getType().equals(requirementForRelation.getCapability())) {
2095 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No macth for capability from type {} and requirement {} from {} to {} in container {}.", capabilityForRelation.getType(), requirementForRelation.getCapability(), fromInstId, toInstId,
2097 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2100 RelationshipInstDataDefinition relationshipTypeData = buildRelationshipInstData(fromInstId, toInstId, relationPair, originUI);
2101 if (requirementForRelation.getRelationship() != null)
2102 relationshipTypeData.setType(requirementForRelation.getRelationship());
2103 capReqRelationship.put(JsonPresentationFields.RELATIONSHIP, (T) relationshipTypeData);
2104 return Either.left(capReqRelationship);
2107 private RelationshipInstDataDefinition buildRelationshipInstData(String fromResInstanceUid, String toInstId, RelationshipInfo relationPair, boolean originUI) {
2109 RelationshipInstDataDefinition relationshipInstData = new RelationshipInstDataDefinition();
2110 relationshipInstData.setUniqueId(UniqueIdBuilder.buildRelationsipInstInstanceUid(fromResInstanceUid, toInstId));
2112 relationshipInstData.setType(relationPair.getRelationship().getType());
2113 Long creationDate = System.currentTimeMillis();
2114 relationshipInstData.setCreationTime(creationDate);
2115 relationshipInstData.setModificationTime(creationDate);
2116 relationshipInstData.setCapabilityOwnerId(relationPair.getCapabilityOwnerId());
2117 relationshipInstData.setRequirementOwnerId(relationPair.getRequirementOwnerId());
2118 relationshipInstData.setCapabilityId(relationPair.getCapabilityUid());
2119 relationshipInstData.setRequirementId(relationPair.getRequirementUid());
2120 relationshipInstData.setFromId(fromResInstanceUid);
2121 relationshipInstData.setToId(toInstId);
2122 relationshipInstData.setRequirement(relationPair.getRequirement());
2123 relationshipInstData.setCapability(relationPair.getCapability());
2124 relationshipInstData.setOriginUI(originUI);
2126 return relationshipInstData;
2129 public <T extends Component> Map<String, ComponentInstanceDataDefinition> associateComponentInstancesToComponent(Component containerComponent, Map<ComponentInstance, T> componentInstanceTMap, GraphVertex containerVertex, boolean allowDeleted, boolean isUpdateCsar) {
2131 String containerId = containerComponent.getUniqueId();
2132 Map<String, ComponentInstanceDataDefinition> instancesJsonData;
2133 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
2134 if (!validateInstanceNames(componentInstanceTMap)) {
2135 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2137 if (!allowDeleted) {
2138 if (!validateDeletedResources(componentInstanceTMap)) {
2139 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2142 instancesJsonData = convertToComponentInstanceDataDefinition(componentInstanceTMap, containerId, isUpdateCsar);
2144 if (MapUtils.isNotEmpty(instancesJsonData)) {
2145 containerVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
2146 Map<String, CompositionDataDefinition> compositions = new HashMap<>();
2147 CompositionDataDefinition composition = new CompositionDataDefinition();
2148 composition.setComponentInstances(instancesJsonData);
2149 compositions.put(JsonConstantKeysEnum.COMPOSITION.getValue(), composition);
2150 containerVertex.setJson(compositions);
2151 updateElement = janusGraphDao.updateVertex(containerVertex);
2152 if (updateElement.isRight()) {
2153 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new component instances. ", containerComponent.getName());
2154 throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
2157 if (updateElement != null) {
2158 GraphVertex vertexC = updateElement.left().value();
2159 instancesJsonData.entrySet().forEach(i -> createInstanceEdge(vertexC, i.getValue()));
2161 return instancesJsonData;
2164 private <T extends Component> Map<String, ComponentInstanceDataDefinition> convertToComponentInstanceDataDefinition(Map<ComponentInstance, T> componentInstanceTMap, String containerId, boolean isUpdateCsar) {
2166 Map<String, ComponentInstanceDataDefinition> instances = new HashMap<>();
2167 for (Entry<ComponentInstance, T> entry : componentInstanceTMap.entrySet()) {
2168 ComponentInstanceDataDefinition instance = buildComponentInstanceDataDefinition(entry.getKey(), containerId, null, !isUpdateCsar || entry.getKey().isCreatedFromCsar(), ModelConverter.convertToToscaElement(entry.getValue()));
2169 instances.put(instance.getUniqueId(), instance);
2174 private <T extends Component> boolean validateDeletedResources(Map<ComponentInstance, T> resourcesInstancesMap) {
2175 boolean result = true;
2176 for (Component component : resourcesInstancesMap.values()) {
2177 if (component.getIsDeleted() != null && component.getIsDeleted()) {
2178 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance. ", component.getName());
2186 private <T extends Component> boolean validateInstanceNames(Map<ComponentInstance, T> resourcesInstancesMap) {
2187 boolean result = true;
2188 Set<String> names = new HashSet<>();
2189 for (ComponentInstance instance : resourcesInstancesMap.keySet()) {
2190 if (StringUtils.isEmpty(instance.getName())) {
2191 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2192 "Component instance {} name is empty. Cannot add component instance. ", instance.getUniqueId());
2195 } else if (names.contains(instance.getName())) {
2196 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2197 "Component instance with the name {} already exsists. Cannot add component instance. ",
2198 instance.getName());
2202 names.add(instance.getName());
2208 public StorageOperationStatus addDeploymentArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2209 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS);
2212 public StorageOperationStatus addInformationalArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2213 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS);
2216 public StorageOperationStatus addArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexType) {
2217 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2218 .getVertexById(toscaElementId, JsonParseFlagEnum.NoParse);
2219 if (metadataVertex.isRight()) {
2220 JanusGraphOperationStatus status = metadataVertex.right().value();
2221 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2222 status = JanusGraphOperationStatus.INVALID_ID;
2224 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2226 MapArtifactDataDefinition instArtifacts = new MapArtifactDataDefinition(instDeplArtifacts);
2227 return addToscaDataDeepElementsBlockToToscaElement(metadataVertex.left().value(), edgeLabel, vertexType, instArtifacts, instanceId);
2231 @SuppressWarnings({"unchecked"})
2232 public StorageOperationStatus generateCustomizationUUIDOnInstance(String componentId, String instanceId) {
2233 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2234 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
2235 if (metadataVertex.isRight()) {
2236 JanusGraphOperationStatus status = metadataVertex.right().value();
2237 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2238 status = JanusGraphOperationStatus.INVALID_ID;
2240 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2242 GraphVertex metaVertex = metadataVertex.left().value();
2243 Map<String, CompositionDataDefinition> json = (Map<String, CompositionDataDefinition>) metaVertex.getJson();
2244 CompositionDataDefinition compositionDataDefinition = json.get(JsonConstantKeysEnum.COMPOSITION.getValue());
2245 StorageOperationStatus status = updateCustomizationUUID(instanceId, compositionDataDefinition);
2246 if (status != StorageOperationStatus.OK) {
2247 log.debug("Failed to update customization UUID for instance {} in component {} error {}", instanceId, componentId, status);
2250 Either<GraphVertex, JanusGraphOperationStatus> updateVertex = janusGraphDao.updateVertex(metaVertex);
2251 if (updateVertex.isRight()) {
2252 log.debug("Failed to update vertex of component {} error {}", componentId, updateVertex.right().value());
2253 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateVertex.right().value());
2255 return StorageOperationStatus.OK;
2258 public StorageOperationStatus generateCustomizationUUIDOnInstanceGroup(String componentId, String instanceId, List<String> groupInstances) {
2259 if (groupInstances != null) {
2260 Either<Map<String, MapGroupsDataDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(componentId, EdgeLabelEnum.INST_GROUPS);
2261 if (dataFromGraph.isRight()) {
2262 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(dataFromGraph.right().value());
2264 MapGroupsDataDefinition grInstPerInstance = dataFromGraph.left().value().get(instanceId);
2265 if (grInstPerInstance == null) {
2266 log.debug("No instance groups for instance {} in component {}", instanceId, componentId);
2267 return StorageOperationStatus.NOT_FOUND;
2269 for (String instGroupForUpdate : groupInstances) {
2270 GroupInstanceDataDefinition groupInst = grInstPerInstance.findByKey(instGroupForUpdate);
2271 if (groupInst == null) {
2272 log.debug("No group instance {} in group list for instance {} in component {}", instGroupForUpdate, instanceId, componentId);
2275 UUID uuid = UUID.randomUUID();
2276 groupInst.setCustomizationUUID(uuid.toString());
2280 return StorageOperationStatus.OK;
2283 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstance componentInstance, List<GroupInstance> groupInstances) {
2285 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS,
2286 new MapDataDefinition<>(groupInstances.stream().collect(Collectors.toMap(GroupInstanceDataDefinition::getName, gi -> gi))), componentInstance.getUniqueId());
2289 public StorageOperationStatus addDeploymentArtifactsToComponentInstance(Component containerComponent, ComponentInstance componentInstance, Map<String, ArtifactDefinition> deploymentArtifacts) {
2291 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, new MapDataDefinition<>(deploymentArtifacts),
2292 componentInstance.getUniqueId());
2295 public StorageOperationStatus updateComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2297 List<String> pathKeys = new ArrayList<>();
2298 pathKeys.add(componentInstanceId);
2299 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2302 public StorageOperationStatus updateComponentInstanceCapabilityProperty(Component containerComponent, String componentInstanceId, String capabilityPropertyKey, ComponentInstanceProperty property) {
2303 List<String> pathKeys = new ArrayList<>();
2304 pathKeys.add(componentInstanceId);
2305 pathKeys.add(capabilityPropertyKey);
2306 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2309 public StorageOperationStatus overrideComponentCapabilitiesProperties(Component containerComponent, Map<String, MapCapabilityProperty> capabilityPropertyMap) {
2310 return overrideToscaDataOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilityPropertyMap);
2313 public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2314 List<String> pathKeys = new ArrayList<>();
2315 pathKeys.add(componentInstanceId);
2316 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2319 public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId, List<ComponentInstanceProperty> properties) {
2320 List<String> pathKeys = new ArrayList<>();
2321 pathKeys.add(componentInstanceId);
2322 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME);
2325 public StorageOperationStatus updateComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute property){
2326 List<String> pathKeys = new ArrayList<>();
2327 pathKeys.add(componentInstanceId);
2328 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, property, pathKeys, JsonPresentationFields.NAME);
2331 public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute attribute){
2332 List<String> pathKeys = new ArrayList<>();
2333 pathKeys.add(componentInstanceId);
2334 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME);
2337 public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
2339 List<String> pathKeys = new ArrayList<>();
2340 pathKeys.add(componentInstanceId);
2341 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2344 public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, List<ComponentInstanceInput> properties) {
2345 List<String> pathKeys = new ArrayList<>();
2346 pathKeys.add(componentInstanceId);
2347 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, properties, pathKeys, JsonPresentationFields.NAME);
2350 public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
2351 List<String> pathKeys = new ArrayList<>();
2352 pathKeys.add(componentInstanceId);
2353 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2356 public StorageOperationStatus createInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2357 String instUniqueId = componentInstance.getUniqueId();
2359 // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2360 StorageOperationStatus result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId).either(v -> StorageOperationStatus.OK,
2361 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2363 if (result == StorageOperationStatus.OK && componentInstance.getIsProxy()) {
2364 // create edge between container and service origin
2365 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2366 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2371 public StorageOperationStatus createAllottedOfEdge(String componentId, String instanceId, String serviceUUID) {
2372 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentId);
2373 if (vertexById.isRight()) {
2374 log.debug("Failed to fetch component metadata vertex for id {} error {}", componentId, vertexById.right().value());
2375 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(vertexById.right().value());
2377 GraphVertex metadataVertex = vertexById.left().value();
2379 EnumMap<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
2380 props.put(GraphPropertyEnum.UUID, serviceUUID);
2381 props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
2383 EnumMap<GraphPropertyEnum, Object> hasNot = new EnumMap<>(GraphPropertyEnum.class);
2384 hasNot.put(GraphPropertyEnum.IS_DELETED, true);
2386 Either<List<GraphVertex>, JanusGraphOperationStatus> byCriteria = janusGraphDao
2387 .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, props,hasNot, JsonParseFlagEnum.ParseMetadata );
2388 if (byCriteria.isRight()) {
2389 log.debug("Failed to fetch vertex by criteria {} error {}", props, byCriteria.right().value());
2390 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(byCriteria.right().value());
2392 List<GraphVertex> vertecies = byCriteria.left().value();
2393 StorageOperationStatus result = StorageOperationStatus.OK;
2394 if (vertecies != null) {
2395 GraphVertex serviceVertex = vertecies.get(0);
2396 //remove previous edges
2398 log.debug("Try to create or update edge between resource {} and service {} ", metadataVertex, serviceVertex.getUniqueId());
2399 // create edge between container and service reference
2400 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.ALLOTTED_OF, serviceVertex.getUniqueId(), instanceId).either(v -> StorageOperationStatus.OK,
2401 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2407 public StorageOperationStatus removeInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2408 String instUniqueId = componentInstance.getUniqueId();
2410 // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2411 StorageOperationStatus result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId)
2412 .either(v -> StorageOperationStatus.OK,
2413 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2415 if (componentInstance.getIsProxy()) {
2416 // create edge between container and service origin
2417 result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2418 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2423 private Either<GraphVertex, JanusGraphOperationStatus> createOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2424 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2425 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2427 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties)
2429 .bind(v -> addInstanceToPropertyOnEdge(instUniqueId, v, metadataVertex))
2431 .bind(s -> createInstanceEdge(metadataVertex, edgeLabel, componentUid, instUniqueId, s));
2434 private Either<GraphVertex, JanusGraphOperationStatus> removeOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2435 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2436 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2438 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties).left().bind(v -> removeInstanceFromPropertyOnEdge(instUniqueId, v, metadataVertex)).right()
2439 .map(err -> removeInstanceEdgeLogError(metadataVertex, edgeLabel, componentUid, err));
2442 private Either<GraphVertex, JanusGraphOperationStatus> addInstanceToPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2443 // edge exist need to add instance id to list on edge's property
2444 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2445 if (property == null) {
2446 property = new ArrayList<>();
2448 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2449 if (!findFirst.isPresent()) {
2450 property.add(instUniqueId);
2453 String jsonArr = JsonParserUtils.toJson(property);
2454 log.debug("Update INSTANCES edge property with value {} ", jsonArr);
2455 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2456 } catch (IOException e) {
2457 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2458 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2460 return Either.left(metadataVertex);
2463 private Either<GraphVertex, JanusGraphOperationStatus> removeInstanceFromPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2464 // edge exist need to add instance id to list on edge's property
2465 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2466 if (property == null) {
2467 property = new ArrayList<>();
2469 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2470 if (findFirst.isPresent()) {
2471 property.remove(instUniqueId);
2473 if (property.isEmpty()) {
2474 // For last instance need to remove edge
2478 String jsonArr = JsonParserUtils.toJson(property);
2479 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2480 } catch (IOException e) {
2481 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2482 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2485 return Either.left(metadataVertex);
2488 private Either<GraphVertex, JanusGraphOperationStatus> createInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId, JanusGraphOperationStatus retrieveEdgeStatus) {
2489 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2491 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentUid);
2492 if (vertexById.isRight()) {
2495 GraphVertex originVertex = vertexById.left().value();
2496 Map<EdgePropertyEnum, Object> edgeProps = new EnumMap<>(EdgePropertyEnum.class);
2497 List<String> instList = new ArrayList<>();
2498 instList.add(instUniqueId);
2499 edgeProps.put(EdgePropertyEnum.INSTANCES, instList);
2501 log.debug("Create new edge {} between {} and {} and properties {} ", edgeLabel, metadataVertex.getUniqueId(), originVertex.getUniqueId(), edgeProps);
2502 JanusGraphOperationStatus
2503 edgeResult = janusGraphDao
2504 .createEdge(metadataVertex, originVertex, edgeLabel, edgeProps);
2505 return edgeResult == JanusGraphOperationStatus.OK ? Either.left(metadataVertex) : Either.right(edgeResult);
2508 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2509 return Either.right(retrieveEdgeStatus);
2512 private JanusGraphOperationStatus removeInstanceEdgeLogError(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, JanusGraphOperationStatus retrieveEdgeStatus) {
2513 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2514 log.debug("No edge {} to remove between container {} and origin {}", edgeLabel, metadataVertex.getUniqueId(), componentUid);
2517 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2519 return retrieveEdgeStatus;
2522 public void removeAllAllotedEdges(String uniqueId) {
2523 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(uniqueId);
2524 if (vertexById.isLeft()) {
2525 GraphVertex originVertex = vertexById.left().value();
2526 JanusGraphVertex vertex = originVertex.getVertex();
2527 Iterator<Edge> edges = vertex.edges(Direction.OUT, EdgeLabelEnum.ALLOTTED_OF.name());
2528 while (edges != null && edges.hasNext()) {
2529 Edge edge = edges.next();