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.Arrays;
27 import java.util.EnumMap;
28 import java.util.HashMap;
29 import java.util.HashSet;
30 import java.util.Iterator;
31 import java.util.List;
33 import java.util.Map.Entry;
34 import java.util.Optional;
36 import java.util.UUID;
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.ArtifactDefinition;
86 import org.openecomp.sdc.be.model.CapabilityDefinition;
87 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
88 import org.openecomp.sdc.be.model.Component;
89 import org.openecomp.sdc.be.model.ComponentInstance;
90 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
91 import org.openecomp.sdc.be.model.ComponentInstanceInput;
92 import org.openecomp.sdc.be.model.ComponentInstanceOutput;
93 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
94 import org.openecomp.sdc.be.model.ComponentParametersView;
95 import org.openecomp.sdc.be.model.GroupDefinition;
96 import org.openecomp.sdc.be.model.GroupInstance;
97 import org.openecomp.sdc.be.model.InputDefinition;
98 import org.openecomp.sdc.be.model.PropertyDefinition;
99 import org.openecomp.sdc.be.model.RelationshipImpl;
100 import org.openecomp.sdc.be.model.RelationshipInfo;
101 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
102 import org.openecomp.sdc.be.model.RequirementDefinition;
103 import org.openecomp.sdc.be.model.User;
104 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.NodeType;
105 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
106 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
107 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElementTypeEnum;
108 import org.openecomp.sdc.be.model.jsonjanusgraph.enums.JsonConstantKeysEnum;
109 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
110 import org.openecomp.sdc.be.model.operations.StorageException;
111 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
112 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
113 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
114 import org.openecomp.sdc.be.ui.model.OperationUi;
115 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
116 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
117 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
118 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
119 import org.openecomp.sdc.common.log.elements.LoggerSupportability;
120 import org.openecomp.sdc.common.log.enums.LogLevel;
121 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
122 import org.openecomp.sdc.common.log.enums.StatusCode;
123 import org.openecomp.sdc.common.log.wrappers.Logger;
124 import org.openecomp.sdc.common.util.ValidationUtils;
126 @org.springframework.stereotype.Component("node-template-operation")
127 public class NodeTemplateOperation extends BaseOperation {
128 private static final String FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR = "Failed to fetch container vertex {} error {}";
129 private static final String FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE = "Failed to update topology template {} with new component instance {}. ";
130 private static final String ARTIFACT_PLACEHOLDER_TYPE = "type";
131 private static final String ARTIFACT_PLACEHOLDER_DISPLAY_NAME = "displayName";
132 private static final Object ARTIFACT_PLACEHOLDER_DESCRIPTION = "description";
133 static final String HEAT_ENV_NAME = "heatEnv";
134 static final String HEAT_VF_ENV_NAME = "VfHeatEnv";
135 static final String HEAT_ENV_SUFFIX = "env";
136 private static Integer defaultHeatTimeout;
137 public static final Integer NON_HEAT_TIMEOUT = 0;
139 private static final Logger log = Logger.getLogger(NodeTemplateOperation.class.getName());
140 private static final LoggerSupportability loggerSupportability=LoggerSupportability.getLogger(NodeTemplateOperation.class.getName());
141 public NodeTemplateOperation() {
142 defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getDefaultMinutes();
143 if ((defaultHeatTimeout == null) || (defaultHeatTimeout < 1)) {
144 defaultHeatTimeout = 60;
148 public static Integer getDefaultHeatTimeout() {
149 return defaultHeatTimeout;
152 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceToTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, String instanceNumberSuffix, ComponentInstance componentInstance,
153 boolean allowDeleted, User user) {
155 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
156 Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceRes = null;
157 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to create component instance {} in component {}", componentInstance, container.getUniqueId());
158 ComponentInstanceDataDefinition componentInstanceData = null;
159 Either<String, StorageOperationStatus> newInstanceNameRes = null;
161 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
162 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseJson);
163 if (metadataVertex.isRight()) {
164 JanusGraphOperationStatus status = metadataVertex.right().value();
165 if (status == JanusGraphOperationStatus.NOT_FOUND) {
166 status = JanusGraphOperationStatus.INVALID_ID;
168 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
171 if (result == null) {
173 newInstanceNameRes = buildValidateInstanceName(container, originToscaElement, componentInstance, instanceNumberSuffix);
174 if (newInstanceNameRes.isRight()) {
175 result = Either.right(newInstanceNameRes.right().value());
178 if (result == null) {
179 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), newInstanceNameRes.left().value(), true, originToscaElement);
181 addComponentInstanceRes = addComponentInstanceToTopologyTemplate(container, originToscaElement, componentInstanceData, metadataVertex.left().value(), allowDeleted, user);
183 if (addComponentInstanceRes.isRight()) {
184 StorageOperationStatus status = addComponentInstanceRes.right().value();
185 if (status == StorageOperationStatus.NOT_FOUND) {
186 status = StorageOperationStatus.INVALID_ID;
188 result = Either.right(status);
190 final TopologyTemplate updatedContainer = addComponentInstanceRes.left().value();
191 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
192 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
193 result = addCapAndReqToProxyServiceInstance(updatedContainer, componentInstance, componentInstanceData);
194 if(result.isRight()) {
198 result = addServiceInstancePropertiesToProxyServiceInstance(updatedContainer, componentInstance);
199 if(result.isRight()) {
203 result = addServiceInstanceInputsToProxyServiceInstance(updatedContainer, componentInstance);
204 if(result.isRight()) {
208 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
209 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution
210 || componentInstance.getOriginType() == OriginTypeEnum.VF
211 || componentInstance.getOriginType() == OriginTypeEnum.VFC) {
212 result = addComponentInstanceInterfacesToTopologyTemplate(updatedContainer, componentInstance);
213 if(result.isRight()) {
218 if (result == null) {
219 result = Either.left(new ImmutablePair<>(addComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
224 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addCapAndReqToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance,
225 ComponentInstanceDataDefinition componentInstanceData) {
226 Map<String, MapListCapabilityDataDefinition> calcCap = updatedContainer.getCalculatedCapabilities();
227 Map<String, MapListRequirementDataDefinition> calcReg = updatedContainer.getCalculatedRequirements();
228 Map<String, MapCapabilityProperty> calcCapProp = updatedContainer.getCalculatedCapabilitiesProperties();
230 Map<String, List<CapabilityDefinition>> additionalCap = componentInstance.getCapabilities();
231 Map<String, List<RequirementDefinition>> additionalReq = componentInstance.getRequirements();
233 MapListCapabilityDataDefinition allCalculatedCap = calcCap == null || !calcCap.containsKey(componentInstanceData.getUniqueId()) ? new MapListCapabilityDataDefinition() : calcCap.get(componentInstanceData.getUniqueId());
234 /******** capability ****************************/
235 StorageOperationStatus status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceData.getUniqueId());
236 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
237 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
238 return Either.right(status);
241 if (additionalCap != null && !additionalCap.isEmpty()) {
243 Map<String, ListCapabilityDataDefinition> serverCap = additionalCap.entrySet().stream()
244 .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListCapabilityDataDefinition(en.getValue().stream().map(CapabilityDataDefinition::new).collect(Collectors.toList()))));
246 serverCap.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
247 cap.addToPath(componentInstance.getUniqueId());
248 allCalculatedCap.add(entryPerType.getKey(), cap);
251 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
253 /******** capability property ****************************/
254 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
255 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId());
256 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
257 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
258 "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ",
259 componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
260 return Either.right(status);
263 MapCapabilityProperty allCalculatedCapProp =
264 calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty()
265 : calcCapProp.get(componentInstanceData.getUniqueId());
267 additionalCap.forEach((s, caps) -> {
268 if (caps != null && !caps.isEmpty()) {
269 MapPropertiesDataDefinition dataToCreate;
270 for (CapabilityDefinition cap : caps) {
271 dataToCreate = new MapPropertiesDataDefinition();
272 List<ComponentInstanceProperty> capPrps = cap.getProperties();
273 if (capPrps != null) {
274 for (ComponentInstanceProperty cip : capPrps) {
275 dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip));
277 StringBuilder sb = new StringBuilder(componentInstance.getUniqueId());
278 sb.append(ModelConverter.CAP_PROP_DELIM);
279 sb.append(cap.getOwnerId());
280 sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName());
281 allCalculatedCapProp.put(sb.toString(), dataToCreate);
286 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
287 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId());
290 /******** Requirements property ****************************/
291 if (additionalReq != null && !additionalReq.isEmpty()) {
293 MapListRequirementDataDefinition allCalculatedReq = calcReg == null || !calcReg.containsKey(componentInstanceData.getUniqueId()) ? new MapListRequirementDataDefinition() : calcReg.get(componentInstanceData.getUniqueId());
294 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceData.getUniqueId());
295 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
296 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated Requirements for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
297 return Either.right(status);
300 Map<String, ListRequirementDataDefinition> serverReq = additionalReq.entrySet().stream()
301 .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListRequirementDataDefinition(en.getValue().stream().map(RequirementDataDefinition::new).collect(Collectors.toList()))));
303 serverReq.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
304 cap.addToPath(componentInstance.getUniqueId());
305 allCalculatedReq.add(entryPerType.getKey(), cap);
308 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
312 Either<ToscaElement, StorageOperationStatus> updatedComponentInstanceRes = topologyTemplateOperation.getToscaElement(updatedContainer.getUniqueId());
313 if (updatedComponentInstanceRes.isRight()) {
314 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", updatedContainer.getName(), componentInstance.getName());
315 Either.right(updatedComponentInstanceRes.right().value());
317 return Either.left(new ImmutablePair<>((TopologyTemplate) updatedComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
320 private Either<String, StorageOperationStatus> buildValidateInstanceName(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance, String instanceNumberSuffix) {
322 Either<String, StorageOperationStatus> result = null;
323 String instanceName = componentInstance.getName();
324 if (StringUtils.isEmpty(instanceName) || instanceName.equalsIgnoreCase(originToscaElement.getName()) || componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
325 instanceName = buildComponentInstanceName(instanceNumberSuffix, instanceName);
326 } else if (!isUniqueInstanceName(container, componentInstance.getName())) {
327 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());
328 result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
330 if (result == null) {
331 result = Either.left(instanceName);
336 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstancePropertiesToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
338 List<PropertyDefinition> propertiesList = componentInstance.getProperties();
340 if (propertiesList != null && !propertiesList.isEmpty()) {
341 Map<String, PropertyDataDefinition> propertiesMap = propertiesList.stream().map(PropertyDataDefinition::new)
342 .collect(Collectors.toMap(
343 PropertyDataDefinition::getName, i -> i));
344 MapPropertiesDataDefinition instProperties = new MapPropertiesDataDefinition(propertiesMap);
345 Map<String, MapPropertiesDataDefinition> instPropertiesMap = new HashMap<>();
346 instPropertiesMap.put(componentInstance.getUniqueId(), instProperties);
347 updatedContainer.setInstProperties(instPropertiesMap);
348 Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
349 .getVertexById(updatedContainer.getUniqueId(), JsonParseFlagEnum.NoParse);
350 if(getToscaElementRes.isLeft()){
351 deleteToscaDataDeepElementsBlockToToscaElement(getToscaElementRes.left().value(), EdgeLabelEnum.INST_PROPERTIES,
352 VertexTypeEnum.INST_PROPERTIES, componentInstance.getUniqueId());
354 StorageOperationStatus status = addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
355 EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, instProperties,
356 componentInstance.getUniqueId());
357 if (status != StorageOperationStatus.OK) {
358 return Either.right(status);
363 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
366 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInputsToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
368 List<InputDefinition> inputsList = componentInstance.getInputs();
370 if (CollectionUtils.isNotEmpty(inputsList)) {
371 Map<String, PropertyDataDefinition> inputsMap = inputsList.stream().map(
372 PropertyDataDefinition::new).collect(Collectors.toMap(PropertyDataDefinition::getName, i -> i));
373 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(inputsMap);
374 Map<String, MapPropertiesDataDefinition> instInputsMap = new HashMap<>();
375 instInputsMap.put(componentInstance.getUniqueId(), instInputs);
376 updatedContainer.setInstInputs(instInputsMap);
378 StorageOperationStatus status =
379 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
380 EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputs,
381 componentInstance.getUniqueId());
382 if(status != StorageOperationStatus.OK) {
383 return Either.right(status);
387 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
390 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceInterfacesToTopologyTemplate(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
391 Map<String, Object> interfaces = componentInstance.getInterfaces();
393 if(MapUtils.isNotEmpty(interfaces)){
394 Map<String, InterfaceDataDefinition> interfacesMap = interfaces.entrySet().stream().collect(Collectors.toMap(e -> ((InterfaceDataDefinition) e.getValue()).getUniqueId(), e -> (InterfaceDataDefinition) e.getValue()));
395 MapInterfaceDataDefinition instInterfaces = new MapInterfaceDataDefinition(interfacesMap);
397 Map<String, MapInterfaceDataDefinition> instInterfacesMap = new HashMap<>();
398 instInterfacesMap.put(componentInstance.getUniqueId(), instInterfaces);
399 updatedContainer.setComponentInstInterfaces(instInterfacesMap);
401 StorageOperationStatus status =
402 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
403 EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instInterfaces,
404 componentInstance.getUniqueId());
406 if(status != StorageOperationStatus.OK) {
407 return Either.right(status);
411 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
414 public Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceToTopologyTemplate(
415 TopologyTemplate container, ToscaElement originToscaElement,
416 ComponentInstanceDataDefinition componentInstance, GraphVertex metadataVertex, boolean allowDeleted,
419 Either<TopologyTemplate, StorageOperationStatus> result = null;
420 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
421 String containerComponentId = container.getUniqueId();
422 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to create component instance {} in component {}", componentInstance, containerComponentId);
423 String instOriginComponentId = componentInstance.getComponentUid();
424 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
426 Boolean isDeleted = (Boolean) originToscaElement.getMetadataValue(JsonPresentationFields.IS_DELETED);
428 if (!allowDeleted && (isDeleted != null) && isDeleted) {
429 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance", instOriginComponentId);
430 result = Either.right(StorageOperationStatus.INVALID_ID);
432 Boolean isArchived = originToscaElement.isArchived();
433 if (isArchived != null && isArchived) {
434 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create instance {}. Origin {} component is archived . ", componentInstance.getName(), originToscaElement.getName());
435 result = Either.right(StorageOperationStatus.COMPONENT_IS_ARCHIVED);
438 if (result == null) {
439 container.addComponentInstance(componentInstance);
440 metadataVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
441 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex, container, JsonParseFlagEnum.ParseAll);
442 updateElement = janusGraphDao.updateVertex(metadataVertex);
443 if (updateElement.isRight()) {
444 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
445 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
448 if (result == null) {
449 Either<GraphVertex, StorageOperationStatus> addToscaDataRes = addComponentInstanceToscaDataToContainerComponent(originToscaElement, componentInstance, updateElement.left().value());
450 if (addToscaDataRes.isRight()) {
451 result = Either.right(addToscaDataRes.right().value());
454 if (result == null) {
455 StorageOperationStatus createInstanceEdge = createInstanceEdge(metadataVertex, componentInstance);
456 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
459 if (result == null) {
460 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
461 if (updateContainerComponentRes.isRight()) {
462 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", container.getName(), componentInstance.getName());
463 result = Either.right(updateContainerComponentRes.right().value());
466 if (result == null) {
467 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
472 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance) {
474 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
475 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
477 String containerComponentId = container.getUniqueId();
478 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstance, containerComponentId);
479 ComponentInstanceDataDefinition componentInstanceData = null;
481 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
482 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
483 if (metadataVertex.isRight()) {
484 JanusGraphOperationStatus status = metadataVertex.right().value();
485 if (status == JanusGraphOperationStatus.NOT_FOUND) {
486 status = JanusGraphOperationStatus.INVALID_ID;
488 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
490 if (result == null) {
491 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), componentInstance.getName(), false, originToscaElement);
492 container.addComponentInstance(componentInstanceData);
493 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
494 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
495 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
496 .updateVertex(metadataVertex.left().value());
497 if (updateElement.isRight()) {
498 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
499 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
502 if (result == null) {
503 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
504 if (updateContainerComponentRes.isRight()) {
505 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with updated component instance {}. ", container.getName(), componentInstance.getName());
506 result = Either.right(updateContainerComponentRes.right().value());
509 if (result == null) {
510 result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceData.getUniqueId()));
515 public Either<TopologyTemplate, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ComponentParametersView filter) {
517 Either<TopologyTemplate, StorageOperationStatus> result = null;
518 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
520 String containerComponentId = container.getUniqueId();
521 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata of container component {}", containerComponentId);
523 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
524 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
525 if (metadataVertex.isRight()) {
526 JanusGraphOperationStatus status = metadataVertex.right().value();
527 if (status == JanusGraphOperationStatus.NOT_FOUND) {
528 status = JanusGraphOperationStatus.INVALID_ID;
530 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
532 if (result == null) {
533 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
534 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
535 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
536 .updateVertex(metadataVertex.left().value());
537 if (updateElement.isRight()) {
538 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {}. ", container.getName());
539 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
542 if (result == null) {
543 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId, filter);
544 if (updateContainerComponentRes.isRight()) {
545 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {}. ", container.getName());
546 result = Either.right(updateContainerComponentRes.right().value());
549 if (result == null) {
550 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
555 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> deleteComponentInstanceFromTopologyTemplate(TopologyTemplate container, String componentInstanceId) {
557 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
558 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
560 String containerComponentId = container.getUniqueId();
561 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstanceId, containerComponentId);
563 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
564 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
565 if (metadataVertex.isRight()) {
566 JanusGraphOperationStatus status = metadataVertex.right().value();
567 if (status == JanusGraphOperationStatus.NOT_FOUND) {
568 status = JanusGraphOperationStatus.INVALID_ID;
570 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
572 GraphVertex containerV = null;
573 ComponentInstanceDataDefinition removedComponentInstance = null;
574 if (result == null) {
575 removedComponentInstance = container.getComponentInstances().remove(componentInstanceId);
576 containerV = metadataVertex.left().value();
577 StorageOperationStatus status = removeRelationsOfInstance(container, componentInstanceId, containerV);
578 if (status != StorageOperationStatus.OK) {
579 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete relation for component instance {} in container. error {}", componentInstanceId, container.getUniqueId(), status);
580 result = Either.right(status);
583 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
584 topologyTemplateOperation.fillToscaElementVertexData(containerV, container, JsonParseFlagEnum.ParseAll);
585 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
586 if (updateElement.isRight()) {
587 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstanceId);
588 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
591 if (result == null) {
592 StorageOperationStatus status = deleteComponentInstanceToscaDataFromContainerComponent(containerV, componentInstanceId);
593 if (status != StorageOperationStatus.OK) {
594 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete data for instance {} in container {}. error {] ", componentInstanceId, container.getUniqueId(), status);
595 return Either.right(status);
597 ComponentInstance componentInstance = new ComponentInstance(removedComponentInstance);
598 StorageOperationStatus createInstanceEdge = removeInstanceEdge(containerV, componentInstance);
599 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
601 if (result == null) {
602 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
603 if (updateContainerComponentRes.isRight()) {
604 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} after deleting the component instance {}. ", container.getName(), componentInstanceId);
605 result = Either.right(updateContainerComponentRes.right().value());
608 if (result == null) {
609 result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceId));
614 private StorageOperationStatus removeRelationsOfInstance(TopologyTemplate container, String ciToRemove, GraphVertex containerV) {
615 CompositionDataDefinition composition = container.getCompositions().get(JsonConstantKeysEnum.COMPOSITION.getValue());
616 if (composition != null) {
617 Map<String, RelationshipInstDataDefinition> relations = composition.getRelations();
618 if (MapUtils.isNotEmpty(relations)) {
619 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
620 if (capResult.isRight()) {
621 return capResult.right().value();
624 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
626 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
627 if (capFullResult.isRight()) {
628 return capFullResult.right().value();
631 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
633 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
634 if (reqResult.isRight()) {
635 return reqResult.right().value();
637 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
639 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
640 if (reqResult.isRight()) {
641 return reqResult.right().value();
643 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
645 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
646 while (iterator.hasNext()) {
647 Entry<String, RelationshipInstDataDefinition> relation = iterator.next();
648 RelationshipInstDataDefinition relationToDelete = relation.getValue();
649 if (relationToDelete.getFromId().equals(ciToRemove) || relationToDelete.getToId().equals(ciToRemove)) {
651 if (relationToDelete.getFromId().equals(ciToRemove)) {
652 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, ciToRemove, relationToDelete, null);
653 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, relationToDelete.getToId(), relationToDelete, null);
655 if (relationToDelete.getToId().equals(ciToRemove)) {
656 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, relationToDelete.getFromId(), relationToDelete, null);
657 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, ciToRemove, relationToDelete, null);
661 return updateAllAndCalculatedCapReqOnGraph(container.getUniqueId(), containerV, capResult, capFullResult, reqResult, reqFullResult);
664 return StorageOperationStatus.OK;
667 private StorageOperationStatus deleteComponentInstanceToscaDataFromContainerComponent(GraphVertex containerV, String componentInstanceId) {
668 StorageOperationStatus status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceId);
669 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
670 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
673 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceId);
674 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
675 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
678 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceId);
679 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
680 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
683 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, componentInstanceId);
684 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
685 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled capabilities for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
688 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, componentInstanceId);
689 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
690 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
693 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, componentInstanceId);
694 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
695 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove attributes for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
698 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, componentInstanceId);
699 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
700 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
703 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, componentInstanceId);
704 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
705 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance inputs for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
708 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, componentInstanceId);
709 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
710 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
713 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, componentInstanceId);
714 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
715 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance deployment artifacts for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
718 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS, componentInstanceId);
719 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
720 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance artifacts for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
723 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, componentInstanceId);
724 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
725 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance external refs for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
728 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INTERFACES,
729 VertexTypeEnum.INST_INTERFACES, componentInstanceId);
730 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
731 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
732 "Failed to remove service instance interfaces for instance {} in container {}. " +
733 "error {] ", componentInstanceId, containerV.getUniqueId(), status);
736 return StorageOperationStatus.OK;
739 protected Either<GraphVertex, StorageOperationStatus> addComponentInstanceToscaDataToContainerComponent(ToscaElement originToscaElement, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
741 Either<GraphVertex, StorageOperationStatus> result;
742 StorageOperationStatus status;
743 if (originToscaElement.getToscaType() == ToscaElementTypeEnum.NODE_TYPE) {
744 status = addComponentInstanceToscaDataToNodeTypeContainer((NodeType) originToscaElement, componentInstance, updatedContainerVertex);
746 status = addComponentInstanceToscaDataToTopologyTemplateContainer((TopologyTemplate) originToscaElement, componentInstance, updatedContainerVertex);
748 if (status == StorageOperationStatus.OK) {
749 result = Either.left(updatedContainerVertex);
751 result = Either.right(status);
756 private StorageOperationStatus addComponentInstanceToscaDataToTopologyTemplateContainer(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
758 StorageOperationStatus status;
760 status = addCalculatedCapReqFromTopologyTemplate(originTopologyTemplate, componentInstance, updatedContainerVertex);
762 if (status != StorageOperationStatus.OK) {
767 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(originTopologyTemplate.getInputs());
768 MapPropertiesDataDefinition instInputsAsProperties = turnInputsIntoProperties(instInputs);
770 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputsAsProperties, componentInstance.getUniqueId());
771 if (status != StorageOperationStatus.OK) {
778 private MapPropertiesDataDefinition turnInputsIntoProperties(MapPropertiesDataDefinition instInput) {
779 if (instInput.getMapToscaDataDefinition() != null) {
780 for (PropertyDataDefinition currProp : instInput.getMapToscaDataDefinition().values()) {
781 String temp = currProp.getValue();
782 currProp.setValue(currProp.getDefaultValue());
783 currProp.setDefaultValue(temp);
789 private MapListCapabilityDataDefinition prepareCalculatedCapabiltyForTopologyTemplate(
790 Map<String, ListCapabilityDataDefinition> capabilities,
791 ComponentInstanceDataDefinition componentInstance,
792 MapListCapabilityDataDefinition calculatedCap) {
793 MapListCapabilityDataDefinition allCalculatedCap =
794 new MapListCapabilityDataDefinition(calculatedCap);
795 populateCapability(capabilities, componentInstance, allCalculatedCap);
796 return allCalculatedCap;
799 private void populateCapability(Map<String, ListCapabilityDataDefinition> capabilities,
800 ComponentInstanceDataDefinition componentInstance,
801 MapListCapabilityDataDefinition allCalculatedCap) {
802 capabilities.forEach((key, value) -> {
803 List<CapabilityDataDefinition> listCapabilities = value.getListToscaDataDefinition()
804 .stream().map(CapabilityDataDefinition::new).collect(Collectors.toList());
805 listCapabilities.forEach(cap -> {
806 cap.setSource(componentInstance.getComponentUid());
807 cap.addToPath(componentInstance.getUniqueId());
808 log.debug("enter populateCapability,get Capability OwnerId:{},get componentInstance UniqueId:{}",
809 cap.getOwnerId(), componentInstance.getUniqueId());
810 cap.setOwnerId(componentInstance.getUniqueId());
811 log.debug("enter populateCapability,get Capability OwnerName:{},get componentInstance Name:{}",
812 cap.getOwnerName(), componentInstance.getName());
813 if (cap.getOwnerName() == null || cap.getOwnerName().isEmpty()) {
814 cap.setOwnerName(componentInstance.getName());
816 cap.setLeftOccurrences(cap.getMaxOccurrences());
817 allCalculatedCap.add(key, cap);
822 private MapListRequirementDataDefinition prepareCalculatedRequirementForTopologyTemplate(
823 Map<String, ListRequirementDataDefinition> requirements,
824 ComponentInstanceDataDefinition componentInstance,
825 MapListRequirementDataDefinition calculatedReqs) {
826 MapListRequirementDataDefinition allCalculatedReq =
827 new MapListRequirementDataDefinition(calculatedReqs);
829 populateRequirement(requirements, componentInstance, allCalculatedReq);
830 return allCalculatedReq;
832 private void populateRequirement(Map<String, ListRequirementDataDefinition> requirements,
833 ComponentInstanceDataDefinition componentInstance,
834 MapListRequirementDataDefinition allCalculatedReq) {
835 requirements.forEach((key, value) -> {
836 List<RequirementDataDefinition> listRequirements = value.getListToscaDataDefinition()
837 .stream().map(RequirementDataDefinition::new).collect(Collectors.toList());
838 listRequirements.forEach(req -> {
839 req.setSource(componentInstance.getComponentUid());
840 req.addToPath(componentInstance.getUniqueId());
841 log.debug("enter populateRequirement,get init Requirements OwnerId:{},get componentInstance UniqueId:{}",
842 req.getOwnerId(), componentInstance.getUniqueId());
843 if (req.getOwnerId() == null || req.getOwnerId().isEmpty()) {
844 req.setOwnerId(componentInstance.getUniqueId());
846 log.debug("enter populateRequirement,get init Requirements OwnerName:{}", req.getOwnerName());
847 if (req.getOwnerName() == null || req.getOwnerName().isEmpty()) {
848 req.setOwnerName(componentInstance.getName());
850 req.setLeftOccurrences(req.getMaxOccurrences());
851 allCalculatedReq.add(key, req);
858 private StorageOperationStatus addCalculatedCapReqFromTopologyTemplate(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
859 Map<String, MapListCapabilityDataDefinition> calculatedCapabilities = originTopologyTemplate.getCalculatedCapabilities();
861 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
862 if (calculatedCapabilities != null) {
863 calculatedCapabilities.forEach((key1, value1) -> {
864 Map<String, ListCapabilityDataDefinition> mapByType = value1.getMapToscaDataDefinition();
865 mapByType.forEach((key, value) -> value.getListToscaDataDefinition().forEach(cap -> {
866 cap.addToPath(componentInstance.getUniqueId());
867 allCalculatedCap.add(key, cap);
871 MapListCapabilityDataDefinition allCaps;
872 Map<String, ListCapabilityDataDefinition> capabilities = originTopologyTemplate.getCapabilities();
873 if (MapUtils.isNotEmpty(capabilities)) {
874 allCaps = prepareCalculatedCapabiltyForTopologyTemplate(capabilities, componentInstance,
877 allCaps = new MapListCapabilityDataDefinition(allCalculatedCap);
879 if(!allCaps.isEmpty()) {
880 StorageOperationStatus calculatedCapabilitiesResult =
881 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
882 EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES,
883 allCaps, componentInstance.getUniqueId());
884 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
885 return calculatedCapabilitiesResult;
887 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
888 calculatedCapabilitiesResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
889 EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES,
890 fullCalculatedCap, componentInstance.getUniqueId());
891 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
892 return calculatedCapabilitiesResult;
895 Map<String, MapListRequirementDataDefinition> calculatedRequirements =
896 originTopologyTemplate.getCalculatedRequirements();
897 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
898 if (calculatedRequirements != null) {
899 calculatedRequirements.forEach((key, value) -> {
900 Map<String, ListRequirementDataDefinition> mapByType =
901 value.getMapToscaDataDefinition();
902 mapByType.forEach((key1, value1) -> value1.getListToscaDataDefinition().stream()
903 .filter(RequirementDataDefinition::isExternal).forEach(req -> {
904 req.addToPath(componentInstance.getUniqueId());
905 req.setExternal(false);
906 allCalculatedReq.add(key1, req);
912 MapListRequirementDataDefinition allReqs;
913 Map<String, ListRequirementDataDefinition> requirements = originTopologyTemplate.getRequirements();
914 if (MapUtils.isNotEmpty(requirements)) {
915 allReqs = prepareCalculatedRequirementForTopologyTemplate(requirements,
916 componentInstance, allCalculatedReq);
918 allReqs = new MapListRequirementDataDefinition(allCalculatedReq);
920 if(!allReqs.isEmpty()) {
921 StorageOperationStatus calculatedRequirementResult =
922 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
923 EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS,
924 allReqs, componentInstance.getUniqueId());
925 if (calculatedRequirementResult != StorageOperationStatus.OK) {
926 return calculatedRequirementResult;
928 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
929 calculatedRequirementResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
930 EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS,
932 componentInstance.getUniqueId());
933 if (calculatedRequirementResult != StorageOperationStatus.OK) {
934 return calculatedRequirementResult;
937 Map<String, MapCapabilityProperty> calculatedCapabilitiesProperties = originTopologyTemplate.getCalculatedCapabilitiesProperties();
938 Map<String, MapPropertiesDataDefinition> updateKeyMap = new HashMap<>();
940 if (calculatedCapabilitiesProperties != null && !calculatedCapabilitiesProperties.isEmpty()) {
941 for (MapCapabilityProperty map : calculatedCapabilitiesProperties.values()) {
942 for (Entry<String, MapPropertiesDataDefinition> entry : map.getMapToscaDataDefinition().entrySet()) {
943 String newKey = (componentInstance.getUniqueId() + ModelConverter.CAP_PROP_DELIM + entry.getKey());
944 updateKeyMap.put(newKey, entry.getValue());
948 Map<String, MapPropertiesDataDefinition> capabilitiesProperties =
949 originTopologyTemplate.getCapabilitiesProperties();
950 Map<String, MapPropertiesDataDefinition> updateKeyMapCapabilitiesProperties;
951 if (MapUtils.isNotEmpty(capabilitiesProperties)) {
952 updateKeyMapCapabilitiesProperties = capabilitiesProperties.entrySet().stream()
953 .collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(),
954 componentInstance.getUniqueId()), Entry::getValue));
957 updateKeyMapCapabilitiesProperties = new HashMap<>();
959 updateKeyMap.putAll(updateKeyMapCapabilitiesProperties);
960 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
962 if(MapUtils.isNotEmpty(capabilitiesProperties) || MapUtils.isNotEmpty(calculatedCapabilitiesProperties )) {
963 StorageOperationStatus calculatedResult =
964 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
965 EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
966 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty,
967 componentInstance.getUniqueId());
968 if (calculatedResult != StorageOperationStatus.OK) {
969 return calculatedResult;
972 return StorageOperationStatus.OK;
975 public StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition) {
976 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
977 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
978 if (containerVEither.isRight()) {
979 JanusGraphOperationStatus error = containerVEither.right().value();
980 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
981 return StorageOperationStatus.GENERAL_ERROR;
983 GraphVertex containerV = containerVEither.left().value();
984 return updateComponentInstanceRequirement(componentId, componentInstanceUniqueId, requirementDataDefinition, containerV);
987 private StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition, GraphVertex containerV) {
988 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> existingReqs = getCalculatedRequirements(componentId);
989 if (existingReqs.isRight()) {
990 return existingReqs.right().value();
992 MapListRequirementDataDefinition componentInstanceRequirementsMap = existingReqs.left().value().getRight().get(componentInstanceUniqueId);
993 if (componentInstanceRequirementsMap == null) {
994 return StorageOperationStatus.NOT_FOUND;
996 ListRequirementDataDefinition listRequirementDataDefinition = componentInstanceRequirementsMap.getMapToscaDataDefinition().get(requirementDataDefinition.getCapability());
998 listRequirementDataDefinition.getListToscaDataDefinition().stream()
999 .filter(e -> requirementDataDefinition.getOwnerId().equals(e.getOwnerId()) && requirementDataDefinition.getName().equals(e.getName()))
1000 .forEach(r -> r.setExternal(requirementDataDefinition.isExternal()));
1002 return updateCalculatedReqOnGraph(componentId, containerV, existingReqs);
1005 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> getCalculatedRequirements(String componentId) {
1006 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> result = null;
1007 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1008 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1009 if (containerVEither.isRight()) {
1010 JanusGraphOperationStatus error = containerVEither.right().value();
1011 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1012 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1014 if (result == null) {
1015 GraphVertex containerV = containerVEither.left().value();
1016 result = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1021 private StorageOperationStatus updateCalculatedReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult
1023 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1024 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1025 if (updateElement.isRight()) {
1026 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1027 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1030 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1031 Either<GraphVertex, JanusGraphOperationStatus> status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1032 if (status.isRight()) {
1033 JanusGraphOperationStatus error = status.right().value();
1034 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1035 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1037 return StorageOperationStatus.OK;
1040 private StorageOperationStatus addComponentInstanceToscaDataToNodeTypeContainer(NodeType originNodeType,
1041 ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1043 StorageOperationStatus status;
1045 if(MapUtils.isNotEmpty(originNodeType.getProperties())){
1046 MapPropertiesDataDefinition instProperties =
1047 new MapPropertiesDataDefinition(originNodeType.getProperties());
1048 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_PROPERTIES,
1049 VertexTypeEnum.INST_PROPERTIES, instProperties, componentInstance.getUniqueId());
1050 if (status != StorageOperationStatus.OK) {
1055 if(MapUtils.isNotEmpty(originNodeType.getAttributes())){
1056 MapAttributesDataDefinition instAttributes =
1057 new MapAttributesDataDefinition(originNodeType.getAttributes());
1058 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_ATTRIBUTES,
1059 VertexTypeEnum.INST_ATTRIBUTES, instAttributes, componentInstance.getUniqueId());
1060 if (status != StorageOperationStatus.OK) {
1065 return addCalculatedCapReqFromNodeType(originNodeType, componentInstance, updatedContainerVertex);
1068 public MapArtifactDataDefinition prepareInstDeploymentArtifactPerInstance(Map<String, ArtifactDataDefinition> deploymentArtifacts, String componentInstanceId, User user, String envType) {
1069 if (deploymentArtifacts != null && envType.equals(HEAT_VF_ENV_NAME)) {
1070 Map<String, ArtifactDataDefinition> instDeploymentArtifacts = new HashMap<>();
1072 deploymentArtifacts.entrySet().forEach(e -> {
1073 ArtifactDataDefinition artifact = e.getValue();
1074 String type = artifact.getArtifactType();
1075 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
1076 ArtifactDataDefinition artifactEnv = createArtifactPlaceHolderInfo(artifact, componentInstanceId, user, envType);
1077 instDeploymentArtifacts.put(artifactEnv.getArtifactLabel(), artifactEnv);
1081 deploymentArtifacts.putAll(instDeploymentArtifacts);
1083 return new MapArtifactDataDefinition(deploymentArtifacts);
1089 @SuppressWarnings({"unchecked"})
1090 private ArtifactDataDefinition createArtifactPlaceHolderInfo(ArtifactDataDefinition artifactHeat, String componentId, User user, String heatEnvType) {
1091 Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getDeploymentResourceInstanceArtifacts();
1092 if (deploymentResourceArtifacts == null) {
1093 log.debug("no deployment artifacts are configured for generated artifacts");
1096 Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(heatEnvType);
1097 if (placeHolderData == null) {
1098 log.debug("no env type {} are configured for generated artifacts", heatEnvType);
1102 String envLabel = (artifactHeat.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
1104 ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition();
1106 String artifactName = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DISPLAY_NAME);
1107 String artifactType = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_TYPE);
1108 String artifactDescription = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DESCRIPTION);
1110 artifactInfo.setArtifactDisplayName(artifactName);
1111 artifactInfo.setArtifactLabel(envLabel);
1112 artifactInfo.setArtifactType(artifactType);
1113 artifactInfo.setDescription(artifactDescription);
1114 artifactInfo.setArtifactGroupType(artifactHeat.getArtifactGroupType());
1115 setDefaultArtifactTimeout(artifactHeat.getArtifactGroupType(), artifactInfo);
1116 artifactInfo.setGeneratedFromId(artifactHeat.getUniqueId());
1117 // clone heat parameters in case of heat env only not VF heat env
1118 if (heatEnvType.equals(HEAT_ENV_NAME)) {
1119 artifactInfo.setHeatParameters(artifactHeat.getHeatParameters());
1121 setArtifactPlaceholderCommonFields(componentId, user, artifactInfo);
1123 return artifactInfo;
1126 public void setDefaultArtifactTimeout(ArtifactGroupTypeEnum groupType, ArtifactDataDefinition artifactInfo) {
1127 if (groupType.equals(ArtifactGroupTypeEnum.DEPLOYMENT)) {
1128 artifactInfo.setTimeout(defaultHeatTimeout);
1130 artifactInfo.setTimeout(NON_HEAT_TIMEOUT);
1134 private void setArtifactPlaceholderCommonFields(String resourceId, User user, ArtifactDataDefinition artifactInfo) {
1135 if (resourceId != null) {
1136 String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(resourceId.toLowerCase(), artifactInfo.getArtifactLabel().toLowerCase());
1137 artifactInfo.setUniqueId(uniqueId);
1139 artifactInfo.setUserIdCreator(user.getUserId());
1140 String fullName = user.getFullName();
1141 artifactInfo.setUpdaterFullName(fullName);
1143 long time = System.currentTimeMillis();
1145 artifactInfo.setCreatorFullName(fullName);
1146 artifactInfo.setCreationDate(time);
1148 artifactInfo.setLastUpdateDate(time);
1149 artifactInfo.setUserIdLastUpdater(user.getUserId());
1151 artifactInfo.setMandatory(true);
1155 * @param originNodeType
1156 * @param componentInstance
1157 * @param updatedContainerVertex
1160 private StorageOperationStatus addCalculatedCapReqFromNodeType(NodeType originNodeType, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1162 Map<String, ListCapabilityDataDefinition> capabilities = originNodeType.getCapabilities();
1163 MapListCapabilityDataDefinition allCalculatedCap = prepareCalculatedCapabiltyForNodeType(capabilities, componentInstance);
1164 StorageOperationStatus calculatedResult;
1165 if (allCalculatedCap != null) {
1166 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
1168 if (calculatedResult != StorageOperationStatus.OK) {
1169 return calculatedResult;
1172 Map<String, MapPropertiesDataDefinition> capabiltiesProperties = originNodeType.getCapabilitiesProperties();
1173 if (capabiltiesProperties != null) {
1174 Map<String, MapPropertiesDataDefinition> updateKeyMap = capabiltiesProperties.entrySet().stream().collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(), componentInstance.getUniqueId()), Entry::getValue));
1175 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
1176 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty, componentInstance.getUniqueId());
1177 if (calculatedResult != StorageOperationStatus.OK) {
1178 return calculatedResult;
1182 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
1183 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, fullCalculatedCap, componentInstance.getUniqueId());
1185 if (calculatedResult != StorageOperationStatus.OK) {
1186 return calculatedResult;
1189 Map<String, ListRequirementDataDefinition> requirements = originNodeType.getRequirements();
1191 MapListRequirementDataDefinition allCalculatedReq = prepareCalculatedRequirementForNodeType(requirements, componentInstance);
1193 StorageOperationStatus status;
1194 if (allCalculatedReq != null) {
1195 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
1196 if (status != StorageOperationStatus.OK) {
1200 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
1201 return addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, fullCalculatedReq, componentInstance.getUniqueId());
1204 public static String createCapPropertyKey(String key, String instanceId) {
1205 StringBuffer sb = new StringBuffer(instanceId);
1206 sb.append(ModelConverter.CAP_PROP_DELIM).append(instanceId).append(ModelConverter.CAP_PROP_DELIM).append(key);
1207 return sb.toString();
1211 * 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
1213 * @param capabilities
1214 * @param componentInstance
1217 public MapListCapabilityDataDefinition prepareCalculatedCapabiltyForNodeType(Map<String, ListCapabilityDataDefinition> capabilities, ComponentInstanceDataDefinition componentInstance) {
1218 if (capabilities != null) {
1219 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
1221 populateCapability(capabilities, componentInstance, allCalculatedCap);
1222 return allCalculatedCap;
1228 * 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
1230 * @param requirements
1231 * @param componentInstance
1234 public MapListRequirementDataDefinition prepareCalculatedRequirementForNodeType(Map<String, ListRequirementDataDefinition> requirements, ComponentInstanceDataDefinition componentInstance) {
1235 if (requirements != null) {
1236 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
1238 populateRequirement(requirements, componentInstance, allCalculatedReq);
1239 return allCalculatedReq;
1244 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstanceDataDefinition componentInstance, List<GroupDefinition> groups, Map<String, List<ArtifactDefinition>> groupInstancesArtifacts) {
1246 StorageOperationStatus result = null;
1247 Map<String, GroupInstanceDataDefinition> groupInstanceToCreate = new HashMap<>();
1248 if (groupInstancesArtifacts != null && CollectionUtils.isNotEmpty(groups)) {
1249 for (Map.Entry<String, List<ArtifactDefinition>> groupArtifacts : groupInstancesArtifacts.entrySet()) {
1250 Optional<GroupDefinition> groupOptional = groups.stream().filter(g -> g.getUniqueId().equals(groupArtifacts.getKey())).findFirst();
1251 if (groupOptional.isPresent()) {
1252 GroupInstanceDataDefinition groupInstance = buildGroupInstanceDataDefinition((GroupDataDefinition) groupOptional.get(), (ComponentInstanceDataDefinition) componentInstance, null);
1253 groupInstance.setGroupInstanceArtifacts(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getUniqueId).collect(Collectors.toList()));
1254 groupInstance.setGroupInstanceArtifactsUuid(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getArtifactUUID).collect(Collectors.toList()));
1255 groupInstanceToCreate.put(groupInstance.getName(), groupInstance);
1259 if (MapUtils.isNotEmpty(groupInstanceToCreate)) {
1260 result = addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, new MapDataDefinition<>(groupInstanceToCreate), componentInstance.getUniqueId());
1262 if (result == null) {
1263 result = StorageOperationStatus.OK;
1268 private ComponentInstanceDataDefinition buildComponentInstanceDataDefinition(ComponentInstance resourceInstance, String containerComponentId, String instanceNewName, boolean generateUid, ToscaElement originToscaElement) {
1269 String ciOriginComponentUid = resourceInstance.getComponentUid();
1271 if (!ValidationUtils.validateStringNotEmpty(resourceInstance.getCustomizationUUID())) {
1272 resourceInstance.setCustomizationUUID(generateCustomizationUUID());
1274 ComponentInstanceDataDefinition dataDefinition = new ComponentInstanceDataDefinition(resourceInstance);
1276 Long creationDate = resourceInstance.getCreationTime();
1277 Long modificationTime;
1278 if (creationDate == null) {
1279 creationDate = System.currentTimeMillis();
1280 modificationTime = creationDate;
1282 modificationTime = System.currentTimeMillis();
1284 dataDefinition.setComponentUid(ciOriginComponentUid);
1285 dataDefinition.setCreationTime(creationDate);
1286 dataDefinition.setModificationTime(modificationTime);
1287 if (StringUtils.isNotEmpty(instanceNewName)) {
1288 dataDefinition.setName(instanceNewName);
1289 resourceInstance.setName(instanceNewName);
1291 if (StringUtils.isNotEmpty(dataDefinition.getName()))
1292 dataDefinition.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(dataDefinition.getName()));
1293 dataDefinition.setIcon(resourceInstance.getIcon());
1295 dataDefinition.setUniqueId(UniqueIdBuilder.buildResourceInstanceUniuqeId(containerComponentId, ciOriginComponentUid, dataDefinition.getNormalizedName()));
1296 resourceInstance.setUniqueId(dataDefinition.getUniqueId());
1298 if (StringUtils.isEmpty(dataDefinition.getComponentVersion()) && originToscaElement != null)
1299 dataDefinition.setComponentVersion((String) originToscaElement.getMetadataValue(JsonPresentationFields.VERSION));
1300 if (StringUtils.isEmpty(dataDefinition.getComponentName()) && originToscaElement != null)
1301 dataDefinition.setComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.NAME));
1302 if (originToscaElement != null && dataDefinition.getToscaComponentName() == null)
1303 dataDefinition.setToscaComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
1304 if (dataDefinition.getOriginType() == null && originToscaElement != null) {
1305 ResourceTypeEnum resourceType = originToscaElement.getResourceType();
1306 OriginTypeEnum originType = OriginTypeEnum.findByValue(resourceType.name());
1307 dataDefinition.setOriginType(originType);
1309 if (dataDefinition.getOriginType() == OriginTypeEnum.ServiceProxy)
1310 dataDefinition.setIsProxy(true);
1312 return dataDefinition;
1315 private Boolean isUniqueInstanceName(TopologyTemplate container, String instanceName) {
1316 Boolean isUniqueName = true;
1318 isUniqueName = container.getComponentInstances().values().stream().noneMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName));
1319 } catch (Exception e) {
1320 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Exception occured during fetching component instance with name {} from component container {}. {} ", instanceName, container.getName(), e.getMessage());
1322 return isUniqueName;
1325 private String buildComponentInstanceName(String instanceSuffixNumber, String instanceName) {
1326 return instanceName + " " + (instanceSuffixNumber == null ? 0 : instanceSuffixNumber);
1329 public Either<RequirementCapabilityRelDef, StorageOperationStatus> associateResourceInstances(Component component, String componentId, RequirementCapabilityRelDef relation) {
1330 List<RequirementCapabilityRelDef> relations = new ArrayList<>();
1331 relations.add(relation);
1332 Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances = associateResourceInstances(component, componentId, relations);
1333 if (associateResourceInstances.isRight()) {
1334 return Either.right(associateResourceInstances.right().value());
1336 return Either.left(associateResourceInstances.left().value().get(0));
1339 @SuppressWarnings({"unchecked"})
1340 public <T extends ToscaDataDefinition> Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances(Component component, String componentId, List<RequirementCapabilityRelDef> relations) {
1342 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1343 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1344 if (containerVEither.isRight()) {
1345 JanusGraphOperationStatus error = containerVEither.right().value();
1346 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1347 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1349 GraphVertex containerV = containerVEither.left().value();
1350 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1351 if (capResult.isRight()) {
1352 return Either.right(capResult.right().value());
1355 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
1357 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1358 if (capResult.isRight()) {
1359 return Either.right(capResult.right().value());
1362 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
1364 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1365 if (reqResult.isRight()) {
1366 return Either.right(reqResult.right().value());
1368 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1370 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1371 if (reqResult.isRight()) {
1372 return Either.right(reqResult.right().value());
1374 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
1376 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1377 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1379 StorageOperationStatus status;
1380 List<RequirementCapabilityRelDef> relationsList = new ArrayList<>();
1381 for (RequirementCapabilityRelDef relation : relations) {
1382 List<CapabilityRequirementRelationship> relationshipsResult = new ArrayList<>();
1383 String fromNode = relation.getFromNode();
1384 String toNode = relation.getToNode();
1385 List<CapabilityRequirementRelationship> relationships = relation.getRelationships();
1386 if (relationships == null || relationships.isEmpty()) {
1387 BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1388 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement definition sent in order to set the relation between {} to {}", fromNode, toNode);
1389 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATION.getName(),"componentId: "+componentId+" No requirement definition sent in order to set the relation between: "+fromNode+" to: "+toNode);
1390 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
1393 for (final CapabilityRequirementRelationship relationship : relationships) {
1394 final String requirement = relationship.getRelation().getRequirement();
1396 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> associateRes = connectInstancesInContainer(fromNode, toNode, relationship.getRelation(), relation.isOriginUI(), calculatedCapabilty, calculatedRequirement,
1397 fullFilledCapabilty, fullfilledRequirement, compositionDataDefinition, containerV.getUniqueId());
1400 if (associateRes.isRight()) {
1401 status = associateRes.right().value();
1402 BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1403 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),
1404 StatusCode.ERROR,"missing relationship: "+fromNode,"ComopnentId: "+componentId);
1405 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to associate resource instance {} to resource instance {}. status is {}", fromNode, toNode, status);
1406 return Either.right(status);
1409 final Map<JsonPresentationFields, T> relationshipFieldsMap = associateRes.left().value();
1410 final RelationshipInstDataDefinition relationshipInstData =
1411 (RelationshipInstDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.RELATIONSHIP);
1412 createRelationshipInterfaces(relationship.getOperations()).ifPresent(relationshipInstData::setInterfaces);
1413 RelationshipImpl relationshipImplResult = new RelationshipImpl();
1414 relationshipImplResult.setType(relationshipInstData.getType());
1415 RelationshipInfo requirementAndRelationshipPair = new RelationshipInfo(requirement, relationshipImplResult);
1416 requirementAndRelationshipPair.setCapability(relationship.getRelation().getCapability());
1417 requirementAndRelationshipPair.setRequirement(relationship.getRelation().getRequirement());
1418 requirementAndRelationshipPair.setCapabilityOwnerId(relationshipInstData.getCapabilityOwnerId());
1419 requirementAndRelationshipPair.setRequirementOwnerId(relationshipInstData.getRequirementOwnerId());
1420 requirementAndRelationshipPair.setCapabilityUid(relationship.getRelation().getCapabilityUid());
1421 requirementAndRelationshipPair.setRequirementUid(relationship.getRelation().getRequirementUid());
1422 requirementAndRelationshipPair.setId(relationshipInstData.getUniqueId());
1423 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
1424 capReqRel.setRelation(requirementAndRelationshipPair);
1425 capReqRel.setCapability((CapabilityDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.CAPABILITY));
1426 capReqRel.setRequirement((RequirementDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.REQUIREMENT));
1427 capReqRel.setOperations(relationship.getOperations());
1428 relationshipsResult.add(capReqRel);
1429 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "update customization UUID for from CI {} and to CI {}", relation.getFromNode(), relation.getToNode());
1430 status = updateCustomizationUUID(relation.getFromNode(), compositionDataDefinition);
1431 if (status != StorageOperationStatus.OK) {
1432 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());
1433 return Either.right(status);
1435 status = updateCustomizationUUID(relation.getToNode(), compositionDataDefinition);
1436 if (status != StorageOperationStatus.OK) {
1437 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());
1438 return Either.right(status);
1441 RequirementCapabilityRelDef reqCapRelDef = new RequirementCapabilityRelDef(relation);
1442 reqCapRelDef.setRelationships(relationshipsResult);
1443 relationsList.add(reqCapRelDef);
1445 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1446 if (status != StorageOperationStatus.OK) {
1447 return Either.right(status);
1449 return Either.left(relationsList);
1452 private Optional<ListDataDefinition<InterfaceDataDefinition>> createRelationshipInterfaces(
1453 final List<OperationUi> operationList) {
1455 if (CollectionUtils.isEmpty(operationList)) {
1456 return Optional.empty();
1458 final ListDataDefinition<InterfaceDataDefinition> interfaceList = new ListDataDefinition<>();
1459 final Map<String, List<OperationUi>> operationByInterfaceType = operationList.stream()
1460 .collect(Collectors.groupingBy(OperationUi::getInterfaceType));
1461 for (final Entry<String, List<OperationUi>> interfaceEntry : operationByInterfaceType.entrySet()) {
1462 interfaceList.add(createInterface(interfaceEntry.getKey(), interfaceEntry.getValue()));
1464 return Optional.of(interfaceList);
1467 private InterfaceDataDefinition createInterface(final String interfaceType, final List<OperationUi> operationList) {
1468 final InterfaceDataDefinition interfaceDataDefinition = new InterfaceDataDefinition();
1469 interfaceDataDefinition.setType(interfaceType);
1470 if (CollectionUtils.isNotEmpty(operationList)) {
1471 final Map<String, OperationDataDefinition> operationMap =
1472 operationList.stream().collect(Collectors.toMap(OperationUi::getOperationType, this::createOperation));
1473 interfaceDataDefinition.setOperations(operationMap);
1475 return interfaceDataDefinition;
1478 private OperationDataDefinition createOperation(final OperationUi operation) {
1479 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
1480 operationDataDefinition.setName(operation.getOperationType());
1481 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
1482 final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
1483 implementation.setArtifactName(operation.getImplementation());
1484 operationDataDefinition.setImplementation(implementation);
1485 if (CollectionUtils.isNotEmpty(operation.getInputs())) {
1486 final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
1487 operation.getInputs().forEach(input -> {
1488 final OperationInputDefinition operationInputDefinition = new OperationInputDefinition();
1489 operationInputDefinition.setLabel(input.getName());
1490 operationInputDefinition.setType(input.getType());
1491 operationInputDefinition.setValue(input.getValue());
1492 inputs.add(operationInputDefinition);
1494 operationDataDefinition.setInputs(inputs);
1497 return operationDataDefinition;
1500 private StorageOperationStatus updateAllAndCalculatedCapReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult,
1501 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult,
1502 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult) {
1503 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1504 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1505 if (updateElement.isRight()) {
1506 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1507 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1509 // update cap/req jsons, fulfilled cap/req jsons!!!!!
1510 Either<GraphVertex, JanusGraphOperationStatus> status;
1511 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated capabilty for container {}", containerV.getUniqueId());
1512 status = updateOrCopyOnUpdate(capResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1513 if (status.isRight()) {
1514 JanusGraphOperationStatus error = status.right().value();
1515 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated capabilty for container {} error {}", containerV.getUniqueId(), error);
1516 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1519 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1520 status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1521 if (status.isRight()) {
1522 JanusGraphOperationStatus error = status.right().value();
1523 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1524 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1527 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled capabilty for container {}", containerV.getUniqueId());
1528 status = updateOrCopyOnUpdate(capFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1529 if (status.isRight()) {
1530 JanusGraphOperationStatus error = status.right().value();
1531 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled capabilty for container {} error {}", containerV.getUniqueId(), error);
1532 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1535 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled requirement for container {}", containerV.getUniqueId());
1536 status = updateOrCopyOnUpdate(reqFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1537 if (status.isRight()) {
1538 JanusGraphOperationStatus error = status.right().value();
1539 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled requirement for container {} error {}", containerV.getUniqueId(), error);
1540 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1542 return StorageOperationStatus.OK;
1545 @SuppressWarnings({"unchecked"})
1546 public Either<RequirementCapabilityRelDef, StorageOperationStatus> dissociateResourceInstances(String componentId, RequirementCapabilityRelDef requirementDef) {
1547 if (requirementDef.getRelationships() == null) {
1548 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation pair in request [ {} ]", requirementDef);
1549 return Either.right(StorageOperationStatus.BAD_REQUEST);
1552 String fromResInstanceUid = requirementDef.getFromNode();
1553 String toResInstanceUid = requirementDef.getToNode();
1555 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1556 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1557 if (containerVEither.isRight()) {
1558 JanusGraphOperationStatus error = containerVEither.right().value();
1559 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1560 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1562 GraphVertex containerV = containerVEither.left().value();
1564 // DE191707 - validations
1565 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1566 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1567 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1568 ComponentInstanceDataDefinition ciFrom = componentInstances.get(fromResInstanceUid);
1569 if (ciFrom == null) {
1570 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "FROM instance {} isn't under container {}", fromResInstanceUid, componentId);
1571 return Either.right(StorageOperationStatus.NOT_FOUND);
1574 ComponentInstanceDataDefinition ciTo = componentInstances.get(toResInstanceUid);
1575 if (ciFrom == ciTo) {
1576 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "TO instance {} isn't under container {}", toResInstanceUid, componentId);
1577 return Either.right(StorageOperationStatus.NOT_FOUND);
1580 Map<String, RelationshipInstDataDefinition> relations = compositionDataDefinition.getRelations();
1582 List<CapabilityRequirementRelationship> relationPairList = requirementDef.getRelationships();
1583 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1584 if (capResult.isRight()) {
1585 return Either.right(capResult.right().value());
1587 Map<String, MapListCapabilityDataDefinition> calculatedCapability = capResult.left().value().getRight();
1589 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1590 if (capResult.isRight()) {
1591 return Either.right(capResult.right().value());
1594 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1596 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1597 if (reqResult.isRight()) {
1598 return Either.right(reqResult.right().value());
1600 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1602 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1603 if (reqResult.isRight()) {
1604 return Either.right(reqResult.right().value());
1606 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1608 for (CapabilityRequirementRelationship relationPair : relationPairList) {
1609 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
1610 boolean isDeleted = false;
1611 while (iterator.hasNext()) {
1612 Entry<String, RelationshipInstDataDefinition> entryInJson = iterator.next();
1613 RelationshipInstDataDefinition relationInJson = entryInJson.getValue();
1614 if (relationInJson.getFromId().equals(fromResInstanceUid) && relationInJson.getToId().equals(toResInstanceUid) && relationInJson.getUniqueId().equals(relationPair.getRelation().getId())) {
1615 if (relationPair.getRelation().equalsTo(relationInJson)) {
1616 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Remove relation from {} to {} capability {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationInJson.getType(), relationInJson.getCapabilityOwnerId(),
1617 relationInJson.getRequirementOwnerId());
1620 // update calculated cap/req
1621 StorageOperationStatus status = updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapability, fulfilledCapability, toResInstanceUid, relationInJson, relationPair);
1622 if (status != StorageOperationStatus.OK) {
1623 return Either.right(status);
1625 status = updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fulfilledRequirement, fromResInstanceUid, relationInJson, relationPair);
1626 if (status != StorageOperationStatus.OK) {
1627 return Either.right(status);
1634 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation to delete from {} to {} capabilty {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationPair.getCapability(),
1635 relationPair.getRelation().getCapabilityOwnerId(), relationPair.getRelation().getRequirementOwnerId());
1636 return Either.right(StorageOperationStatus.NOT_FOUND);
1639 StorageOperationStatus status = updateCustomizationUUID(fromResInstanceUid, compositionDataDefinition);
1640 if (status != StorageOperationStatus.OK) {
1641 return Either.right(status);
1643 status = updateCustomizationUUID(toResInstanceUid, compositionDataDefinition);
1644 if (status != StorageOperationStatus.OK) {
1645 return Either.right(status);
1649 // update metadata of container and composition json
1650 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1651 if (status != StorageOperationStatus.OK) {
1652 return Either.right(status);
1655 return Either.left(requirementDef);
1659 * Retrieves fulfilled requirement according to relation and received predicate
1661 * @param componentId
1663 * @param foundRelation
1667 public Either<RequirementDataDefinition, StorageOperationStatus> getFulfilledRequirementByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1668 BiPredicate<RelationshipInfo, RequirementDataDefinition> predicate) {
1670 Either<RequirementDataDefinition, StorageOperationStatus> result = null;
1671 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = null;
1672 MapListRequirementDataDefinition reqMapOfLists = null;
1673 Optional<RequirementDataDefinition> foundRequirement;
1674 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1675 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1676 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1677 if (containerVEither.isRight()) {
1678 JanusGraphOperationStatus error = containerVEither.right().value();
1679 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1680 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1682 if (result == null) {
1683 GraphVertex containerV = containerVEither.left().value();
1684 reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1685 if (reqFullResult.isRight()) {
1686 result = Either.right(reqFullResult.right().value());
1689 if (result == null) {
1690 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1691 reqMapOfLists = fulfilledRequirement.get(instanceId);
1692 if (reqMapOfLists == null) {
1693 result = Either.right(StorageOperationStatus.NOT_FOUND);
1696 if (result == null && reqMapOfLists != null) {
1697 for (ListRequirementDataDefinition requirements : reqMapOfLists.getMapToscaDataDefinition().values()) {
1698 foundRequirement = requirements.getListToscaDataDefinition().stream().filter(req -> predicate.test(relationshipInfo, req)).findFirst();
1699 if (foundRequirement.isPresent()) {
1700 result = Either.left(foundRequirement.get());
1708 * Retrieves fulfilled capability according to relation and received predicate
1710 * @param componentId
1712 * @param foundRelation
1716 public Either<CapabilityDataDefinition, StorageOperationStatus> getFulfilledCapabilityByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1717 BiPredicate<RelationshipInfo, CapabilityDataDefinition> predicate) {
1719 Either<CapabilityDataDefinition, StorageOperationStatus> result = null;
1720 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = null;
1721 MapListCapabilityDataDefinition capMapOfLists = null;
1722 Optional<CapabilityDataDefinition> foundRequirement;
1724 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1725 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1726 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1727 if (containerVEither.isRight()) {
1728 JanusGraphOperationStatus error = containerVEither.right().value();
1729 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1730 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1732 if (result == null) {
1733 GraphVertex containerV = containerVEither.left().value();
1734 capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1735 if (capFullResult.isRight()) {
1736 result = Either.right(capFullResult.right().value());
1739 if (result == null) {
1740 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1741 capMapOfLists = fulfilledCapability.get(instanceId);
1742 if (capMapOfLists == null) {
1743 result = Either.right(StorageOperationStatus.NOT_FOUND);
1746 if (result == null && capMapOfLists != null) {
1747 for (ListCapabilityDataDefinition capabilities : capMapOfLists.getMapToscaDataDefinition().values()) {
1748 foundRequirement = capabilities.getListToscaDataDefinition().stream().filter(cap -> predicate.test(relationshipInfo, cap)).findFirst();
1749 if (foundRequirement.isPresent()) {
1750 result = Either.left(foundRequirement.get());
1757 private StorageOperationStatus updateCalculatedRequirementsAfterDeleteRelation(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1758 RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1759 StorageOperationStatus status;
1760 String hereIsTheKey = null;
1761 MapListRequirementDataDefinition reqByInstance = calculatedRequirement.get(fromResInstanceUid);
1762 if (reqByInstance == null || reqByInstance.findKeyByItemUidMatch(relation.getRequirementId()) == null) {
1763 // move from fulfilled
1764 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1766 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1767 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1768 Optional<RequirementDataDefinition> requirementOptional = reqByType.getListToscaDataDefinition().stream()
1769 .filter(req -> req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())).findFirst();
1771 if (requirementOptional.isPresent()) {
1773 RequirementDataDefinition requirement = requirementOptional.get();
1774 String leftOccurrences = requirement.getLeftOccurrences();
1775 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
1776 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1778 requirement.setLeftOccurrences(String.valueOf(leftIntValue));
1780 if (relationship != null) {
1781 relationship.setRequirement(requirement);
1783 status = StorageOperationStatus.OK;
1785 // move from fulfilled
1786 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1792 private StorageOperationStatus updateCalculatedCapabiltyAfterDeleteRelation(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1793 RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1794 StorageOperationStatus status;
1795 String hereIsTheKey = null;
1796 MapListCapabilityDataDefinition capByInstance = calculatedCapability.get(toResInstanceUid);
1797 if (capByInstance == null || capByInstance.findKeyByItemUidMatch(relation.getCapabilityId()) == null) {
1798 // move from fulfilled
1799 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1801 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1802 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1803 Optional<CapabilityDataDefinition> capabilityOptional = capByType.getListToscaDataDefinition().stream().filter(cap -> cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId()))
1806 if (capabilityOptional.isPresent()) {
1808 CapabilityDataDefinition capability = capabilityOptional.get();
1809 String leftOccurrences = capability.getLeftOccurrences();
1810 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
1811 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1813 capability.setLeftOccurrences(String.valueOf(leftIntValue));
1815 if (relationship != null) {
1816 relationship.setCapability(capability);
1818 status = StorageOperationStatus.OK;
1820 // move from fulfilled
1821 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1827 private StorageOperationStatus moveFromFullFilledCapabilty(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1828 RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1829 MapListCapabilityDataDefinition capByInstance = fullFilledCapability.get(toResInstanceUid);
1830 if (capByInstance == null) {
1831 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability in fulfilled list for instance {} ", toResInstanceUid);
1832 return StorageOperationStatus.GENERAL_ERROR;
1834 if (null == hereIsTheKey)
1835 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1836 if (null == hereIsTheKey) {
1837 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability with id {} in fulfilled list for instance {} ", relation.getCapabilityId(), toResInstanceUid);
1838 return StorageOperationStatus.GENERAL_ERROR;
1840 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1841 Iterator<CapabilityDataDefinition> iterator = capByType.getListToscaDataDefinition().iterator();
1842 boolean found = false;
1843 while (iterator.hasNext()) {
1844 CapabilityDataDefinition cap = iterator.next();
1845 if (cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId())) {
1848 // return to calculated list
1849 String leftOccurrences = cap.getLeftOccurrences();
1850 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1852 cap.setLeftOccurrences(String.valueOf(leftIntValue));
1854 MapListCapabilityDataDefinition mapListCapaDataDef = calculatedCapability.get(toResInstanceUid);
1855 if (mapListCapaDataDef == null) {
1856 mapListCapaDataDef = new MapListCapabilityDataDefinition();
1858 ListCapabilityDataDefinition findByKey = mapListCapaDataDef.findByKey(hereIsTheKey);
1859 if (findByKey == null) {
1860 findByKey = new ListCapabilityDataDefinition();
1861 mapListCapaDataDef.put(hereIsTheKey, findByKey);
1864 if (relationship != null)
1865 relationship.setCapability(cap);
1870 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getCapabilityOwnerId(), toResInstanceUid);
1871 return StorageOperationStatus.GENERAL_ERROR;
1873 return StorageOperationStatus.OK;
1876 private StorageOperationStatus moveFromFullFilledRequirement(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1877 RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1878 MapListRequirementDataDefinition reqByInstance = fullFilledRequirement.get(fromResInstanceUid);
1879 if (reqByInstance == null) {
1880 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement in fullfilled list for instance {} ", fromResInstanceUid);
1881 return StorageOperationStatus.GENERAL_ERROR;
1883 if (null == hereIsTheKey)
1884 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1885 if (null == hereIsTheKey) {
1886 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement with id {} in fulfilled list for instance {} ", relation.getRequirementId(), fromResInstanceUid);
1887 return StorageOperationStatus.GENERAL_ERROR;
1889 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1890 Iterator<RequirementDataDefinition> iterator = reqByType.getListToscaDataDefinition().iterator();
1891 boolean found = false;
1892 while (iterator.hasNext()) {
1893 RequirementDataDefinition req = iterator.next();
1894 if (req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())) {
1897 // return to calculated list
1898 String leftOccurrences = req.getLeftOccurrences();
1899 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1901 req.setLeftOccurrences(String.valueOf(leftIntValue));
1903 MapListRequirementDataDefinition mapListReqDataDef = calculatedRequirement.get(fromResInstanceUid);
1904 if (mapListReqDataDef == null) {
1905 mapListReqDataDef = new MapListRequirementDataDefinition();
1907 ListRequirementDataDefinition findByKey = mapListReqDataDef.findByKey(hereIsTheKey);
1908 if (findByKey == null) {
1909 findByKey = new ListRequirementDataDefinition();
1910 mapListReqDataDef.put(hereIsTheKey, findByKey);
1913 if (relationship != null)
1914 relationship.setRequirement(req);
1919 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getRequirementOwnerId(), fromResInstanceUid);
1920 return StorageOperationStatus.GENERAL_ERROR;
1922 return StorageOperationStatus.OK;
1926 public StorageOperationStatus updateCustomizationUUID(String componentInstanceId, CompositionDataDefinition compositionDataDefinition) {
1927 ComponentInstanceDataDefinition componentInstance = compositionDataDefinition.getComponentInstances().get(componentInstanceId);
1929 if (componentInstance == null) {
1930 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch component instance by id {} from map of instances ", componentInstanceId);
1931 return StorageOperationStatus.NOT_FOUND;
1933 UUID uuid = UUID.randomUUID();
1934 componentInstance.setCustomizationUUID(uuid.toString());
1936 return StorageOperationStatus.OK;
1939 public <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectInstancesInContainer(String fromResInstanceUid, String toResInstanceUid, RelationshipInfo relationPair, boolean originUI,
1940 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty,
1941 Map<String, MapListRequirementDataDefinition> fullfilledRequirement, CompositionDataDefinition compositionDataDefinition, String containerId) {
1942 String requirement = relationPair.getRequirement();
1943 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1945 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to associate resource instance {} to resource instance {} under component {}. Requirement is {}.", fromResInstanceUid, toResInstanceUid, containerId, requirement);
1947 ComponentInstanceDataDefinition fromResourceInstData = componentInstances.get(fromResInstanceUid);
1948 if (fromResourceInstData == null) {
1949 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find from resource instance {}.", fromResInstanceUid);
1950 return Either.right(StorageOperationStatus.NOT_FOUND);
1952 ComponentInstanceDataDefinition toResourceInstData = componentInstances.get(toResInstanceUid);
1953 if (toResourceInstData == null) {
1954 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find to resource instance {}.", toResInstanceUid);
1955 return Either.right(StorageOperationStatus.NOT_FOUND);
1958 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> reqVsCap = connectRequirementVsCapability(fromResourceInstData, toResourceInstData, relationPair, originUI, calculatedCapabilty, calculatedRequirement, fullfilledCapabilty,
1959 fullfilledRequirement, containerId);
1960 if (reqVsCap.isRight()) {
1961 StorageOperationStatus status = reqVsCap.right().value();
1962 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to connect requirement {} between resource instance {} to resource instance {}. status is {}", requirement, fromResInstanceUid, toResInstanceUid, status);
1963 return Either.right(status);
1965 Map<JsonPresentationFields, T> relationship = reqVsCap.left().value();
1967 // add to json new relations
1968 compositionDataDefinition.addRelation(((RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP)).getUniqueId(), (RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP));
1970 return Either.left(relationship);
1973 private Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedCapability(GraphVertex containerV, EdgeLabelEnum capLabel) {
1975 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, JanusGraphOperationStatus> calculatedCapabiltyEither = getDataAndVertexFromGraph(containerV, capLabel);
1976 if (calculatedCapabiltyEither.isRight()) {
1977 JanusGraphOperationStatus error = calculatedCapabiltyEither.right().value();
1978 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilties for container {}.", containerV.getUniqueId(), error);
1979 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1981 Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>> calculatedCapabilty = calculatedCapabiltyEither.left().value();
1982 return Either.left(calculatedCapabilty);
1985 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedRequirement(GraphVertex containerV, EdgeLabelEnum reqLabel) {
1986 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, JanusGraphOperationStatus> calculatedRequirementEither = getDataAndVertexFromGraph(containerV, reqLabel);
1987 if (calculatedRequirementEither.isRight()) {
1988 JanusGraphOperationStatus error = calculatedRequirementEither.right().value();
1989 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for container {}.", containerV.getUniqueId(), error);
1990 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1992 Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>> calculatedRequirement = calculatedRequirementEither.left().value();
1993 return Either.left(calculatedRequirement);
1996 @SuppressWarnings("unchecked")
1997 private <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectRequirementVsCapability(ComponentInstanceDataDefinition fromResInstance, ComponentInstanceDataDefinition toResInstance,
1998 RelationshipInfo relationPair, boolean originUI, Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement,
1999 Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty, Map<String, MapListRequirementDataDefinition> fullfilledRequirement, String containerId) {
2000 String type = relationPair.getRelationship().getType();
2003 String toInstId = toResInstance.getUniqueId();
2004 MapListCapabilityDataDefinition mapListCapabilityDataDefinition = calculatedCapabilty.get(toInstId);
2005 Map<JsonPresentationFields, T> capReqRelationship = new EnumMap<>(JsonPresentationFields.class);
2007 if (mapListCapabilityDataDefinition == null) {
2008 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for instance {} in container {}.", toInstId, containerId);
2009 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2011 ListCapabilityDataDefinition listCapabilityDataDefinition = mapListCapabilityDataDefinition.getMapToscaDataDefinition().get(type);
2012 if (listCapabilityDataDefinition == null) {
2013 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for type {} for instance {} in container {}.", type, toInstId, containerId);
2014 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2016 CapabilityDataDefinition capabilityForRelation = null;
2017 Iterator<CapabilityDataDefinition> iteratorCap = listCapabilityDataDefinition.getListToscaDataDefinition().iterator();
2018 while (iteratorCap.hasNext()) {
2019 CapabilityDataDefinition cap = iteratorCap.next();
2020 if (cap.getUniqueId().equals(relationPair.getCapabilityUid()) && cap.getOwnerId().equals(relationPair.getCapabilityOwnerId())) {
2021 capabilityForRelation = cap;
2022 capReqRelationship.put(JsonPresentationFields.CAPABILITY, (T) capabilityForRelation);
2023 String leftOccurrences = cap.getLeftOccurrences();
2024 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
2025 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2026 if (leftIntValue > 0) {
2028 capabilityForRelation.setLeftOccurrences(String.valueOf(leftIntValue));
2029 if (leftIntValue == 0) {
2030 // remove from calculated
2031 iteratorCap.remove();
2032 // move to fulfilled
2033 MapListCapabilityDataDefinition mapListCapabiltyFullFilledInst = fullfilledCapabilty.get(toInstId);
2034 if (mapListCapabiltyFullFilledInst == null) {
2035 mapListCapabiltyFullFilledInst = new MapListCapabilityDataDefinition();
2036 fullfilledCapabilty.put(toInstId, mapListCapabiltyFullFilledInst);
2039 ListCapabilityDataDefinition listCapabilityFull = mapListCapabiltyFullFilledInst.findByKey(type);
2040 if (listCapabilityFull == null) {
2041 listCapabilityFull = new ListCapabilityDataDefinition();
2042 mapListCapabiltyFullFilledInst.put(type, listCapabilityFull);
2044 listCapabilityFull.add(capabilityForRelation);
2048 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences capabilty {} to {} in container {}.", capabilityForRelation.getType(), toInstId, containerId);
2049 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2054 if (capabilityForRelation == null) {
2055 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch capabilty for type {} for instance {} in container {}.", type, toInstId, containerId);
2056 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2060 String fromInstId = fromResInstance.getUniqueId();
2061 MapListRequirementDataDefinition mapListRequirementDataDefinition = calculatedRequirement.get(fromInstId);
2062 if (mapListRequirementDataDefinition == null) {
2063 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for instance {} in container {}.", fromInstId, containerId);
2064 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2066 ListRequirementDataDefinition listRequirementDataDefinition = mapListRequirementDataDefinition.getMapToscaDataDefinition().get(type);
2067 if (listRequirementDataDefinition == null) {
2068 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for type {} for instance {} in container {}.", type, fromInstId, containerId);
2069 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2072 RequirementDataDefinition requirementForRelation = null;
2073 Iterator<RequirementDataDefinition> iteratorReq = listRequirementDataDefinition.getListToscaDataDefinition().iterator();
2074 while (iteratorReq.hasNext()) {
2075 RequirementDataDefinition req = iteratorReq.next();
2076 if (req.getUniqueId().equals(relationPair.getRequirementUid()) && req.getOwnerId().equals(relationPair.getRequirementOwnerId())) {
2077 requirementForRelation = req;
2078 capReqRelationship.put(JsonPresentationFields.REQUIREMENT, (T) requirementForRelation);
2079 String leftOccurrences = req.getLeftOccurrences();
2080 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
2081 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2082 if (leftIntValue > 0) {
2084 req.setLeftOccurrences(String.valueOf(leftIntValue));
2085 if (leftIntValue == 0) {
2086 // remove from calculated
2087 iteratorReq.remove();
2088 // move to fulfilled
2089 MapListRequirementDataDefinition mapListRequirementFullFilledInst = fullfilledRequirement.get(fromInstId);
2090 if (mapListRequirementFullFilledInst == null) {
2091 mapListRequirementFullFilledInst = new MapListRequirementDataDefinition();
2092 fullfilledRequirement.put(fromInstId, mapListRequirementFullFilledInst);
2095 ListRequirementDataDefinition listRequirementFull = mapListRequirementFullFilledInst.findByKey(type);
2096 if (listRequirementFull == null) {
2097 listRequirementFull = new ListRequirementDataDefinition();
2098 mapListRequirementFullFilledInst.put(type, listRequirementFull);
2100 listRequirementFull.add(requirementForRelation);
2104 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences requirement {} from {} to {} in container {}.", requirementForRelation.getCapability(), fromInstId, toInstId, containerId);
2105 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2110 if (requirementForRelation == null) {
2111 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch requirement for type {} for instance {} in container {}.", type, toInstId, containerId);
2112 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2114 if (!capabilityForRelation.getType().equals(requirementForRelation.getCapability())) {
2115 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No macth for capability from type {} and requirement {} from {} to {} in container {}.", capabilityForRelation.getType(), requirementForRelation.getCapability(), fromInstId, toInstId,
2117 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2120 RelationshipInstDataDefinition relationshipTypeData = buildRelationshipInstData(fromInstId, toInstId, relationPair, originUI);
2121 if (requirementForRelation.getRelationship() != null)
2122 relationshipTypeData.setType(requirementForRelation.getRelationship());
2123 capReqRelationship.put(JsonPresentationFields.RELATIONSHIP, (T) relationshipTypeData);
2124 return Either.left(capReqRelationship);
2127 private RelationshipInstDataDefinition buildRelationshipInstData(String fromResInstanceUid, String toInstId, RelationshipInfo relationPair, boolean originUI) {
2129 RelationshipInstDataDefinition relationshipInstData = new RelationshipInstDataDefinition();
2130 relationshipInstData.setUniqueId(UniqueIdBuilder.buildRelationsipInstInstanceUid(fromResInstanceUid, toInstId));
2132 relationshipInstData.setType(relationPair.getRelationship().getType());
2133 Long creationDate = System.currentTimeMillis();
2134 relationshipInstData.setCreationTime(creationDate);
2135 relationshipInstData.setModificationTime(creationDate);
2136 relationshipInstData.setCapabilityOwnerId(relationPair.getCapabilityOwnerId());
2137 relationshipInstData.setRequirementOwnerId(relationPair.getRequirementOwnerId());
2138 relationshipInstData.setCapabilityId(relationPair.getCapabilityUid());
2139 relationshipInstData.setRequirementId(relationPair.getRequirementUid());
2140 relationshipInstData.setFromId(fromResInstanceUid);
2141 relationshipInstData.setToId(toInstId);
2142 relationshipInstData.setRequirement(relationPair.getRequirement());
2143 relationshipInstData.setCapability(relationPair.getCapability());
2144 relationshipInstData.setOriginUI(originUI);
2146 return relationshipInstData;
2149 public <T extends Component> Map<String, ComponentInstanceDataDefinition> associateComponentInstancesToComponent(Component containerComponent, Map<ComponentInstance, T> componentInstanceTMap, GraphVertex containerVertex, boolean allowDeleted, boolean isUpdateCsar) {
2151 String containerId = containerComponent.getUniqueId();
2152 Map<String, ComponentInstanceDataDefinition> instancesJsonData;
2153 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
2154 if (!validateInstanceNames(componentInstanceTMap)) {
2155 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2157 if (!allowDeleted && !validateDeletedResources(componentInstanceTMap)) {
2158 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2160 instancesJsonData = convertToComponentInstanceDataDefinition(componentInstanceTMap, containerId, isUpdateCsar);
2162 if (MapUtils.isNotEmpty(instancesJsonData)) {
2163 containerVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
2164 Map<String, CompositionDataDefinition> compositions = new HashMap<>();
2165 CompositionDataDefinition composition = new CompositionDataDefinition();
2166 composition.setComponentInstances(instancesJsonData);
2167 compositions.put(JsonConstantKeysEnum.COMPOSITION.getValue(), composition);
2168 containerVertex.setJson(compositions);
2169 updateElement = janusGraphDao.updateVertex(containerVertex);
2170 if (updateElement.isRight()) {
2171 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new component instances. ", containerComponent.getName());
2172 throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
2175 if (updateElement != null) {
2176 GraphVertex vertexC = updateElement.left().value();
2177 instancesJsonData.entrySet().forEach(i -> createInstanceEdge(vertexC, i.getValue()));
2179 return instancesJsonData;
2182 private <T extends Component> Map<String, ComponentInstanceDataDefinition> convertToComponentInstanceDataDefinition(Map<ComponentInstance, T> componentInstanceTMap, String containerId, boolean isUpdateCsar) {
2184 Map<String, ComponentInstanceDataDefinition> instances = new HashMap<>();
2185 for (Entry<ComponentInstance, T> entry : componentInstanceTMap.entrySet()) {
2186 ComponentInstanceDataDefinition instance = buildComponentInstanceDataDefinition(entry.getKey(), containerId, null, !isUpdateCsar || entry.getKey().isCreatedFromCsar(), ModelConverter.convertToToscaElement(entry.getValue()));
2187 instances.put(instance.getUniqueId(), instance);
2192 private <T extends Component> boolean validateDeletedResources(Map<ComponentInstance, T> resourcesInstancesMap) {
2193 boolean result = true;
2194 for (Component component : resourcesInstancesMap.values()) {
2195 if (component.getIsDeleted() != null && component.getIsDeleted()) {
2196 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance. ", component.getName());
2204 private <T extends Component> boolean validateInstanceNames(Map<ComponentInstance, T> resourcesInstancesMap) {
2205 boolean result = true;
2206 Set<String> names = new HashSet<>();
2207 for (ComponentInstance instance : resourcesInstancesMap.keySet()) {
2208 if (StringUtils.isEmpty(instance.getName())) {
2209 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2210 "Component instance {} name is empty. Cannot add component instance. ", instance.getUniqueId());
2213 } else if (names.contains(instance.getName())) {
2214 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2215 "Component instance with the name {} already exsists. Cannot add component instance. ",
2216 instance.getName());
2220 names.add(instance.getName());
2226 public StorageOperationStatus addDeploymentArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2227 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS);
2230 public StorageOperationStatus addInformationalArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2231 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS);
2234 public StorageOperationStatus addArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexType) {
2235 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2236 .getVertexById(toscaElementId, JsonParseFlagEnum.NoParse);
2237 if (metadataVertex.isRight()) {
2238 JanusGraphOperationStatus status = metadataVertex.right().value();
2239 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2240 status = JanusGraphOperationStatus.INVALID_ID;
2242 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2244 MapArtifactDataDefinition instArtifacts = new MapArtifactDataDefinition(instDeplArtifacts);
2245 return addToscaDataDeepElementsBlockToToscaElement(metadataVertex.left().value(), edgeLabel, vertexType, instArtifacts, instanceId);
2249 @SuppressWarnings({"unchecked"})
2250 public StorageOperationStatus generateCustomizationUUIDOnInstance(String componentId, String instanceId) {
2251 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2252 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
2253 if (metadataVertex.isRight()) {
2254 JanusGraphOperationStatus status = metadataVertex.right().value();
2255 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2256 status = JanusGraphOperationStatus.INVALID_ID;
2258 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2260 GraphVertex metaVertex = metadataVertex.left().value();
2261 Map<String, CompositionDataDefinition> json = (Map<String, CompositionDataDefinition>) metaVertex.getJson();
2262 CompositionDataDefinition compositionDataDefinition = json.get(JsonConstantKeysEnum.COMPOSITION.getValue());
2263 StorageOperationStatus status = updateCustomizationUUID(instanceId, compositionDataDefinition);
2264 if (status != StorageOperationStatus.OK) {
2265 log.debug("Failed to update customization UUID for instance {} in component {} error {}", instanceId, componentId, status);
2268 Either<GraphVertex, JanusGraphOperationStatus> updateVertex = janusGraphDao.updateVertex(metaVertex);
2269 if (updateVertex.isRight()) {
2270 log.debug("Failed to update vertex of component {} error {}", componentId, updateVertex.right().value());
2271 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateVertex.right().value());
2273 return StorageOperationStatus.OK;
2276 public StorageOperationStatus generateCustomizationUUIDOnInstanceGroup(String componentId, String instanceId, List<String> groupInstances) {
2277 if (groupInstances != null) {
2278 Either<Map<String, MapGroupsDataDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(componentId, EdgeLabelEnum.INST_GROUPS);
2279 if (dataFromGraph.isRight()) {
2280 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(dataFromGraph.right().value());
2282 MapGroupsDataDefinition grInstPerInstance = dataFromGraph.left().value().get(instanceId);
2283 if (grInstPerInstance == null) {
2284 log.debug("No instance groups for instance {} in component {}", instanceId, componentId);
2285 return StorageOperationStatus.NOT_FOUND;
2287 for (String instGroupForUpdate : groupInstances) {
2288 GroupInstanceDataDefinition groupInst = grInstPerInstance.findByKey(instGroupForUpdate);
2289 if (groupInst == null) {
2290 log.debug("No group instance {} in group list for instance {} in component {}", instGroupForUpdate, instanceId, componentId);
2293 UUID uuid = UUID.randomUUID();
2294 groupInst.setCustomizationUUID(uuid.toString());
2298 return StorageOperationStatus.OK;
2301 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstance componentInstance, List<GroupInstance> groupInstances) {
2303 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS,
2304 new MapDataDefinition<>(groupInstances.stream().collect(Collectors.toMap(GroupInstanceDataDefinition::getName, gi -> gi))), componentInstance.getUniqueId());
2307 public StorageOperationStatus addDeploymentArtifactsToComponentInstance(Component containerComponent, ComponentInstance componentInstance, Map<String, ArtifactDefinition> deploymentArtifacts) {
2309 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, new MapDataDefinition<>(deploymentArtifacts),
2310 componentInstance.getUniqueId());
2313 public StorageOperationStatus updateComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2315 List<String> pathKeys = new ArrayList<>();
2316 pathKeys.add(componentInstanceId);
2317 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2320 public StorageOperationStatus updateComponentInstanceCapabilityProperty(Component containerComponent, String componentInstanceId, String capabilityPropertyKey, ComponentInstanceProperty property) {
2321 List<String> pathKeys = new ArrayList<>();
2322 pathKeys.add(componentInstanceId);
2323 pathKeys.add(capabilityPropertyKey);
2324 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2327 public StorageOperationStatus overrideComponentCapabilitiesProperties(Component containerComponent, Map<String, MapCapabilityProperty> capabilityPropertyMap) {
2328 return overrideToscaDataOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilityPropertyMap);
2331 public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2332 List<String> pathKeys = new ArrayList<>();
2333 pathKeys.add(componentInstanceId);
2334 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES,
2335 property, pathKeys, JsonPresentationFields.NAME);
2338 public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId,
2339 List<ComponentInstanceProperty> properties) {
2340 List<String> pathKeys = new ArrayList<>();
2341 pathKeys.add(componentInstanceId);
2342 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES,
2343 VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME);
2346 public StorageOperationStatus updateComponentInstanceAttributes(final Component containerComponent,
2347 final String componentInstanceId,
2348 final List<ComponentInstanceAttribute> attributes) {
2349 final List<String> pathKeys = Arrays.asList(componentInstanceId);
2350 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2351 VertexTypeEnum.INST_ATTRIBUTES, attributes, pathKeys, JsonPresentationFields.NAME);
2354 public StorageOperationStatus updateComponentInstanceAttribute(final Component containerComponent,
2355 final String componentInstanceId,
2356 final ComponentInstanceAttribute attribute) {
2357 final List<String> pathKeys = Arrays.asList(componentInstanceId);
2358 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2359 VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME);
2362 public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId,
2363 ComponentInstanceAttribute attribute) {
2364 List<String> pathKeys = new ArrayList<>();
2365 pathKeys.add(componentInstanceId);
2366 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES,
2367 attribute, pathKeys, JsonPresentationFields.NAME);
2370 public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId,
2371 ComponentInstanceInput property) {
2372 List<String> pathKeys = new ArrayList<>();
2373 pathKeys.add(componentInstanceId);
2374 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2377 public StorageOperationStatus updateComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) {
2378 List<String> pathKeys = new ArrayList<>();
2379 pathKeys.add(componentInstanceId);
2380 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME);
2383 public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, List<ComponentInstanceInput> properties) {
2384 List<String> pathKeys = new ArrayList<>();
2385 pathKeys.add(componentInstanceId);
2386 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, properties, pathKeys, JsonPresentationFields.NAME);
2389 public StorageOperationStatus updateComponentInstanceOutputs(Component containerComponent, String componentInstanceId, List<ComponentInstanceOutput> properties) {
2390 List<String> pathKeys = new ArrayList<>();
2391 pathKeys.add(componentInstanceId);
2392 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, properties, pathKeys, JsonPresentationFields.NAME);
2395 public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
2396 List<String> pathKeys = new ArrayList<>();
2397 pathKeys.add(componentInstanceId);
2398 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2401 public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) {
2402 List<String> pathKeys = new ArrayList<>(){};
2403 pathKeys.add(componentInstanceId);
2404 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME);
2407 public StorageOperationStatus createInstanceEdge(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 = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId).either(v -> StorageOperationStatus.OK,
2412 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2414 if (result == StorageOperationStatus.OK && componentInstance.getIsProxy()) {
2415 // create edge between container and service origin
2416 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2417 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2422 public StorageOperationStatus createAllottedOfEdge(String componentId, String instanceId, String serviceUUID) {
2423 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentId);
2424 if (vertexById.isRight()) {
2425 log.debug("Failed to fetch component metadata vertex for id {} error {}", componentId, vertexById.right().value());
2426 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(vertexById.right().value());
2428 GraphVertex metadataVertex = vertexById.left().value();
2430 EnumMap<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
2431 props.put(GraphPropertyEnum.UUID, serviceUUID);
2432 props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
2434 EnumMap<GraphPropertyEnum, Object> hasNot = new EnumMap<>(GraphPropertyEnum.class);
2435 hasNot.put(GraphPropertyEnum.IS_DELETED, true);
2437 Either<List<GraphVertex>, JanusGraphOperationStatus> byCriteria = janusGraphDao
2438 .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, props,hasNot, JsonParseFlagEnum.ParseMetadata );
2439 if (byCriteria.isRight()) {
2440 log.debug("Failed to fetch vertex by criteria {} error {}", props, byCriteria.right().value());
2441 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(byCriteria.right().value());
2443 List<GraphVertex> vertecies = byCriteria.left().value();
2444 StorageOperationStatus result = StorageOperationStatus.OK;
2445 if (vertecies != null) {
2446 GraphVertex serviceVertex = vertecies.get(0);
2447 //remove previous edges
2449 log.debug("Try to create or update edge between resource {} and service {} ", metadataVertex, serviceVertex.getUniqueId());
2450 // create edge between container and service reference
2451 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.ALLOTTED_OF, serviceVertex.getUniqueId(), instanceId).either(v -> StorageOperationStatus.OK,
2452 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2458 public StorageOperationStatus removeInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2459 String instUniqueId = componentInstance.getUniqueId();
2461 // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2462 StorageOperationStatus result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId)
2463 .either(v -> StorageOperationStatus.OK,
2464 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2466 if (componentInstance.getIsProxy()) {
2467 // create edge between container and service origin
2468 result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2469 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2474 private Either<GraphVertex, JanusGraphOperationStatus> createOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2475 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2476 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2478 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties)
2480 .bind(v -> addInstanceToPropertyOnEdge(instUniqueId, v, metadataVertex))
2482 .bind(s -> createInstanceEdge(metadataVertex, edgeLabel, componentUid, instUniqueId, s));
2485 private Either<GraphVertex, JanusGraphOperationStatus> removeOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2486 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2487 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2489 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties).left().bind(v -> removeInstanceFromPropertyOnEdge(instUniqueId, v, metadataVertex)).right()
2490 .map(err -> removeInstanceEdgeLogError(metadataVertex, edgeLabel, componentUid, err));
2493 private Either<GraphVertex, JanusGraphOperationStatus> addInstanceToPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2494 // edge exist need to add instance id to list on edge's property
2495 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2496 if (property == null) {
2497 property = new ArrayList<>();
2499 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2500 if (!findFirst.isPresent()) {
2501 property.add(instUniqueId);
2504 String jsonArr = JsonParserUtils.toJson(property);
2505 log.debug("Update INSTANCES edge property with value {} ", jsonArr);
2506 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2507 } catch (IOException e) {
2508 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2509 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2511 return Either.left(metadataVertex);
2514 private Either<GraphVertex, JanusGraphOperationStatus> removeInstanceFromPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2515 // edge exist need to add instance id to list on edge's property
2516 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2517 if (property == null) {
2518 property = new ArrayList<>();
2520 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2521 if (findFirst.isPresent()) {
2522 property.remove(instUniqueId);
2524 if (property.isEmpty()) {
2525 // For last instance need to remove edge
2529 String jsonArr = JsonParserUtils.toJson(property);
2530 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2531 } catch (IOException e) {
2532 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2533 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2536 return Either.left(metadataVertex);
2539 private Either<GraphVertex, JanusGraphOperationStatus> createInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId, JanusGraphOperationStatus retrieveEdgeStatus) {
2540 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2542 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentUid);
2543 if (vertexById.isRight()) {
2546 GraphVertex originVertex = vertexById.left().value();
2547 Map<EdgePropertyEnum, Object> edgeProps = new EnumMap<>(EdgePropertyEnum.class);
2548 List<String> instList = new ArrayList<>();
2549 instList.add(instUniqueId);
2550 edgeProps.put(EdgePropertyEnum.INSTANCES, instList);
2552 log.debug("Create new edge {} between {} and {} and properties {} ", edgeLabel, metadataVertex.getUniqueId(), originVertex.getUniqueId(), edgeProps);
2553 JanusGraphOperationStatus
2554 edgeResult = janusGraphDao
2555 .createEdge(metadataVertex, originVertex, edgeLabel, edgeProps);
2556 return edgeResult == JanusGraphOperationStatus.OK ? Either.left(metadataVertex) : Either.right(edgeResult);
2559 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2560 return Either.right(retrieveEdgeStatus);
2563 private JanusGraphOperationStatus removeInstanceEdgeLogError(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, JanusGraphOperationStatus retrieveEdgeStatus) {
2564 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2565 log.debug("No edge {} to remove between container {} and origin {}", edgeLabel, metadataVertex.getUniqueId(), componentUid);
2568 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2570 return retrieveEdgeStatus;
2573 public void removeAllAllotedEdges(String uniqueId) {
2574 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(uniqueId);
2575 if (vertexById.isLeft()) {
2576 GraphVertex originVertex = vertexById.left().value();
2577 JanusGraphVertex vertex = originVertex.getVertex();
2578 Iterator<Edge> edges = vertex.edges(Direction.OUT, EdgeLabelEnum.ALLOTTED_OF.name());
2579 while (edges != null && edges.hasNext()) {
2580 Edge edge = edges.next();