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=========================================================
20 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
22 import fj.data.Either;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.EnumMap;
27 import java.util.HashMap;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.List;
32 import java.util.Map.Entry;
33 import java.util.Optional;
35 import java.util.UUID;
36 import java.util.function.BiPredicate;
37 import java.util.stream.Collectors;
38 import org.apache.commons.collections.CollectionUtils;
39 import org.apache.commons.collections.MapUtils;
40 import org.apache.commons.lang3.StringUtils;
41 import org.apache.commons.lang3.tuple.ImmutablePair;
42 import org.apache.commons.lang3.tuple.Pair;
43 import org.apache.tinkerpop.gremlin.structure.Direction;
44 import org.apache.tinkerpop.gremlin.structure.Edge;
45 import org.janusgraph.core.JanusGraphVertex;
46 import org.openecomp.sdc.be.config.BeEcompErrorManager;
47 import org.openecomp.sdc.be.config.ConfigurationManager;
48 import org.openecomp.sdc.be.dao.api.ActionStatus;
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.operations.exception.OperationException;
110 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
111 import org.openecomp.sdc.be.model.operations.StorageException;
112 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
113 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
114 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
115 import org.openecomp.sdc.be.ui.model.OperationUi;
116 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
117 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
118 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
119 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
120 import org.openecomp.sdc.common.log.elements.ErrorLogOptionalData;
121 import org.openecomp.sdc.common.log.elements.LoggerSupportability;
122 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
123 import org.openecomp.sdc.common.log.enums.LogLevel;
124 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
125 import org.openecomp.sdc.common.log.enums.StatusCode;
126 import org.openecomp.sdc.common.log.wrappers.Logger;
127 import org.openecomp.sdc.common.util.ValidationUtils;
129 @org.springframework.stereotype.Component("node-template-operation")
130 public class NodeTemplateOperation extends BaseOperation {
132 public static final Integer NON_HEAT_TIMEOUT = 0;
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 final String FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR = "Failed to fetch container vertex {} error {}";
137 private static final String FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE = "Failed to update topology template {} with new component instance {}. ";
138 private static final String ARTIFACT_PLACEHOLDER_TYPE = "type";
139 private static final String ARTIFACT_PLACEHOLDER_DISPLAY_NAME = "displayName";
140 private static final Object ARTIFACT_PLACEHOLDER_DESCRIPTION = "description";
141 private static final Logger log = Logger.getLogger(NodeTemplateOperation.class.getName());
142 private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(NodeTemplateOperation.class.getName());
143 private static Integer defaultHeatTimeout;
145 public NodeTemplateOperation() {
146 defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getDefaultMinutes();
147 if ((defaultHeatTimeout == null) || (defaultHeatTimeout < 1)) {
148 defaultHeatTimeout = 60;
152 public static Integer getDefaultHeatTimeout() {
153 return defaultHeatTimeout;
156 public static String createCapPropertyKey(String key, String instanceId) {
157 StringBuffer sb = new StringBuffer(instanceId);
158 sb.append(ModelConverter.CAP_PROP_DELIM).append(instanceId).append(ModelConverter.CAP_PROP_DELIM).append(key);
159 return sb.toString();
162 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceToTopologyTemplate(TopologyTemplate container,
163 ToscaElement originToscaElement,
164 String instanceNumberSuffix,
165 ComponentInstance componentInstance,
166 boolean allowDeleted, User user) {
167 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
168 Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceRes = null;
169 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to create component instance {} in component {}", componentInstance,
170 container.getUniqueId());
171 ComponentInstanceDataDefinition componentInstanceData = null;
172 Either<String, StorageOperationStatus> newInstanceNameRes = null;
173 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
174 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseJson);
175 if (metadataVertex.isRight()) {
176 JanusGraphOperationStatus status = metadataVertex.right().value();
177 if (status == JanusGraphOperationStatus.NOT_FOUND) {
178 status = JanusGraphOperationStatus.INVALID_ID;
180 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
182 if (result == null) {
183 newInstanceNameRes = buildValidateInstanceName(container, originToscaElement, componentInstance, instanceNumberSuffix);
184 if (newInstanceNameRes.isRight()) {
185 result = Either.right(newInstanceNameRes.right().value());
188 if (result == null) {
189 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(),
190 newInstanceNameRes.left().value(), true, originToscaElement);
191 addComponentInstanceRes = addComponentInstanceToTopologyTemplate(container, originToscaElement, componentInstanceData,
192 metadataVertex.left().value(), allowDeleted, user);
193 if (addComponentInstanceRes.isRight()) {
194 StorageOperationStatus status = addComponentInstanceRes.right().value();
195 if (status == StorageOperationStatus.NOT_FOUND) {
196 status = StorageOperationStatus.INVALID_ID;
198 result = Either.right(status);
200 final TopologyTemplate updatedContainer = addComponentInstanceRes.left().value();
201 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
202 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
203 result = addCapAndReqToProxyServiceInstance(updatedContainer, componentInstance, componentInstanceData);
204 if (result.isRight()) {
207 result = addServiceInstancePropertiesToProxyServiceInstance(updatedContainer, componentInstance);
208 if (result.isRight()) {
211 result = addServiceInstanceInputsToProxyServiceInstance(updatedContainer, componentInstance);
212 if (result.isRight()) {
216 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
217 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution || componentInstance.getOriginType() == OriginTypeEnum.VF
218 || componentInstance.getOriginType() == OriginTypeEnum.VFC) {
219 result = addComponentInstanceInterfacesToTopologyTemplate(updatedContainer, componentInstance);
220 if (result.isRight()) {
225 if (result == null) {
226 result = Either.left(new ImmutablePair<>(addComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
231 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addCapAndReqToProxyServiceInstance(
232 TopologyTemplate updatedContainer, ComponentInstance componentInstance, ComponentInstanceDataDefinition componentInstanceData) {
233 Map<String, MapListCapabilityDataDefinition> calcCap = updatedContainer.getCalculatedCapabilities();
234 Map<String, MapListRequirementDataDefinition> calcReg = updatedContainer.getCalculatedRequirements();
235 Map<String, MapCapabilityProperty> calcCapProp = updatedContainer.getCalculatedCapabilitiesProperties();
236 Map<String, List<CapabilityDefinition>> additionalCap = componentInstance.getCapabilities();
237 Map<String, List<RequirementDefinition>> additionalReq = componentInstance.getRequirements();
238 MapListCapabilityDataDefinition allCalculatedCap =
239 calcCap == null || !calcCap.containsKey(componentInstanceData.getUniqueId()) ? new MapListCapabilityDataDefinition()
240 : calcCap.get(componentInstanceData.getUniqueId());
241 /******** capability ****************************/
242 StorageOperationStatus status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(),
243 EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceData.getUniqueId());
244 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
245 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ",
246 componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
247 return Either.right(status);
250 if (additionalCap != null && !additionalCap.isEmpty()) {
252 Map<String, ListCapabilityDataDefinition> serverCap = additionalCap.entrySet().stream()
253 .collect(Collectors.toMap(Map.Entry::getKey,
254 en -> new ListCapabilityDataDefinition(en.getValue().stream().map(CapabilityDataDefinition::new).collect(Collectors.toList()))));
256 serverCap.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
257 cap.addToPath(componentInstance.getUniqueId());
258 allCalculatedCap.add(entryPerType.getKey(), cap);
261 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES,
262 VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
264 /******** capability property ****************************/
265 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
266 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId());
267 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
268 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
269 "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ",
270 componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
271 return Either.right(status);
273 MapCapabilityProperty allCalculatedCapProp =
274 calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty()
275 : calcCapProp.get(componentInstanceData.getUniqueId());
276 additionalCap.forEach((s, caps) -> {
277 if (caps != null && !caps.isEmpty()) {
278 MapPropertiesDataDefinition dataToCreate;
279 for (CapabilityDefinition cap : caps) {
280 dataToCreate = new MapPropertiesDataDefinition();
281 List<ComponentInstanceProperty> capPrps = cap.getProperties();
282 if (capPrps != null) {
283 for (ComponentInstanceProperty cip : capPrps) {
284 dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip));
286 StringBuilder sb = new StringBuilder(componentInstance.getUniqueId());
287 sb.append(ModelConverter.CAP_PROP_DELIM);
288 sb.append(cap.getOwnerId());
289 sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName());
290 allCalculatedCapProp.put(sb.toString(), dataToCreate);
295 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
296 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId());
298 /******** Requirements property ****************************/
299 if (additionalReq != null && !additionalReq.isEmpty()) {
301 MapListRequirementDataDefinition allCalculatedReq =
302 calcReg == null || !calcReg.containsKey(componentInstanceData.getUniqueId()) ? new MapListRequirementDataDefinition()
303 : calcReg.get(componentInstanceData.getUniqueId());
304 status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS,
305 VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceData.getUniqueId());
306 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
308 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated Requirements for instance {} in container {}. error {] ",
309 componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
310 return Either.right(status);
313 Map<String, ListRequirementDataDefinition> serverReq = additionalReq.entrySet().stream()
314 .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListRequirementDataDefinition(
315 en.getValue().stream().map(RequirementDataDefinition::new).collect(Collectors.toList()))));
317 serverReq.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
318 cap.addToPath(componentInstance.getUniqueId());
319 allCalculatedReq.add(entryPerType.getKey(), cap);
322 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS,
323 VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
327 Either<ToscaElement, StorageOperationStatus> updatedComponentInstanceRes = topologyTemplateOperation
328 .getToscaElement(updatedContainer.getUniqueId());
329 if (updatedComponentInstanceRes.isRight()) {
330 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ",
331 updatedContainer.getName(), componentInstance.getName());
332 Either.right(updatedComponentInstanceRes.right().value());
334 return Either.left(new ImmutablePair<>((TopologyTemplate) updatedComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
337 private Either<String, StorageOperationStatus> buildValidateInstanceName(TopologyTemplate container, ToscaElement originToscaElement,
338 ComponentInstance componentInstance, String instanceNumberSuffix) {
340 Either<String, StorageOperationStatus> result = null;
341 String instanceName = componentInstance.getName();
342 if (StringUtils.isEmpty(instanceName) || instanceName.equalsIgnoreCase(originToscaElement.getName())
343 || componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
344 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
345 instanceName = buildComponentInstanceName(instanceNumberSuffix, instanceName);
346 } else if (!isUniqueInstanceName(container, componentInstance.getName())) {
347 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
348 "Failed to create component instance with name {} on component container {}. The instance with the same name already exists. ",
349 componentInstance.getName(), container.getName());
350 result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
352 if (result == null) {
353 result = Either.left(instanceName);
358 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstancePropertiesToProxyServiceInstance(
359 TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
361 List<PropertyDefinition> propertiesList = componentInstance.getProperties();
363 if (propertiesList != null && !propertiesList.isEmpty()) {
364 Map<String, PropertyDataDefinition> propertiesMap = propertiesList.stream().map(PropertyDataDefinition::new)
365 .collect(Collectors.toMap(
366 PropertyDataDefinition::getName, i -> i));
367 MapPropertiesDataDefinition instProperties = new MapPropertiesDataDefinition(propertiesMap);
368 Map<String, MapPropertiesDataDefinition> instPropertiesMap = new HashMap<>();
369 instPropertiesMap.put(componentInstance.getUniqueId(), instProperties);
370 updatedContainer.setInstProperties(instPropertiesMap);
371 Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
372 .getVertexById(updatedContainer.getUniqueId(), JsonParseFlagEnum.NoParse);
373 if (getToscaElementRes.isLeft()) {
374 deleteToscaDataDeepElementsBlockToToscaElement(getToscaElementRes.left().value(), EdgeLabelEnum.INST_PROPERTIES,
375 VertexTypeEnum.INST_PROPERTIES, componentInstance.getUniqueId());
377 StorageOperationStatus status = addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
378 EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, instProperties,
379 componentInstance.getUniqueId());
380 if (status != StorageOperationStatus.OK) {
381 return Either.right(status);
386 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
389 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInputsToProxyServiceInstance(
390 TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
392 List<InputDefinition> inputsList = componentInstance.getInputs();
394 if (CollectionUtils.isNotEmpty(inputsList)) {
395 Map<String, PropertyDataDefinition> inputsMap = inputsList.stream().map(
396 PropertyDataDefinition::new).collect(Collectors.toMap(PropertyDataDefinition::getName, i -> i));
397 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(inputsMap);
398 Map<String, MapPropertiesDataDefinition> instInputsMap = new HashMap<>();
399 instInputsMap.put(componentInstance.getUniqueId(), instInputs);
400 updatedContainer.setInstInputs(instInputsMap);
402 StorageOperationStatus status =
403 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
404 EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputs,
405 componentInstance.getUniqueId());
406 if (status != StorageOperationStatus.OK) {
407 return Either.right(status);
411 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
414 private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceInterfacesToTopologyTemplate(
415 TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
416 Map<String, Object> interfaces = componentInstance.getInterfaces();
418 if (MapUtils.isNotEmpty(interfaces)) {
419 Map<String, InterfaceDataDefinition> interfacesMap = interfaces.entrySet().stream()
420 .collect(Collectors.toMap(e -> ((InterfaceDataDefinition) e.getValue()).getUniqueId(), e -> (InterfaceDataDefinition) e.getValue()));
421 MapInterfaceDataDefinition instInterfaces = new MapInterfaceDataDefinition(interfacesMap);
423 Map<String, MapInterfaceDataDefinition> instInterfacesMap = new HashMap<>();
424 instInterfacesMap.put(componentInstance.getUniqueId(), instInterfaces);
425 updatedContainer.setComponentInstInterfaces(instInterfacesMap);
427 StorageOperationStatus status =
428 addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
429 EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instInterfaces,
430 componentInstance.getUniqueId());
432 if (status != StorageOperationStatus.OK) {
433 return Either.right(status);
437 return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
440 public Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceToTopologyTemplate(
441 TopologyTemplate container, ToscaElement originToscaElement,
442 ComponentInstanceDataDefinition componentInstance, GraphVertex metadataVertex, boolean allowDeleted,
445 Either<TopologyTemplate, StorageOperationStatus> result = null;
446 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
447 String containerComponentId = container.getUniqueId();
448 CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to create component instance {} in component {}", componentInstance,
449 containerComponentId);
450 String instOriginComponentId = componentInstance.getComponentUid();
451 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
453 Boolean isDeleted = (Boolean) originToscaElement.getMetadataValue(JsonPresentationFields.IS_DELETED);
455 if (!allowDeleted && (isDeleted != null) && isDeleted) {
457 .addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance", instOriginComponentId);
458 result = Either.right(StorageOperationStatus.INVALID_ID);
460 Boolean isArchived = originToscaElement.isArchived();
461 if (isArchived != null && isArchived) {
462 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create instance {}. Origin {} component is archived . ",
463 componentInstance.getName(), originToscaElement.getName());
464 result = Either.right(StorageOperationStatus.COMPONENT_IS_ARCHIVED);
467 if (result == null) {
468 container.addComponentInstance(componentInstance);
469 metadataVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
470 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex, container, JsonParseFlagEnum.ParseAll);
471 updateElement = janusGraphDao.updateVertex(metadataVertex);
472 if (updateElement.isRight()) {
474 .addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(),
475 componentInstance.getName());
476 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
479 if (result == null) {
480 Either<GraphVertex, StorageOperationStatus> addToscaDataRes = addComponentInstanceToscaDataToContainerComponent(originToscaElement,
481 componentInstance, updateElement.left().value());
482 if (addToscaDataRes.isRight()) {
483 result = Either.right(addToscaDataRes.right().value());
486 if (result == null) {
487 StorageOperationStatus createInstanceEdge = createInstanceEdge(metadataVertex, componentInstance);
488 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
491 if (result == null) {
492 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
493 if (updateContainerComponentRes.isRight()) {
494 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ",
495 container.getName(), componentInstance.getName());
496 result = Either.right(updateContainerComponentRes.right().value());
499 if (result == null) {
500 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
505 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(
506 TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance) {
508 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
509 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
511 String containerComponentId = container.getUniqueId();
513 .addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstance,
514 containerComponentId);
515 ComponentInstanceDataDefinition componentInstanceData = null;
517 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
518 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
519 if (metadataVertex.isRight()) {
520 JanusGraphOperationStatus status = metadataVertex.right().value();
521 if (status == JanusGraphOperationStatus.NOT_FOUND) {
522 status = JanusGraphOperationStatus.INVALID_ID;
524 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
526 if (result == null) {
527 componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), componentInstance.getName(),
528 false, originToscaElement);
529 container.addComponentInstance(componentInstanceData);
530 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
531 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
532 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
533 .updateVertex(metadataVertex.left().value());
534 if (updateElement.isRight()) {
536 .addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(),
537 componentInstance.getName());
538 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
541 if (result == null) {
542 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
543 if (updateContainerComponentRes.isRight()) {
545 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with updated component instance {}. ",
546 container.getName(), componentInstance.getName());
547 result = Either.right(updateContainerComponentRes.right().value());
550 if (result == null) {
552 .left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceData.getUniqueId()));
557 public Either<TopologyTemplate, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container,
558 ComponentParametersView filter) {
560 Either<TopologyTemplate, StorageOperationStatus> result = null;
561 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
563 String containerComponentId = container.getUniqueId();
565 .addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata of container component {}", containerComponentId);
567 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
568 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
569 if (metadataVertex.isRight()) {
570 JanusGraphOperationStatus status = metadataVertex.right().value();
571 if (status == JanusGraphOperationStatus.NOT_FOUND) {
572 status = JanusGraphOperationStatus.INVALID_ID;
574 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
576 if (result == null) {
577 metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
578 topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
579 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
580 .updateVertex(metadataVertex.left().value());
581 if (updateElement.isRight()) {
582 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {}. ", container.getName());
583 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
586 if (result == null) {
587 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId, filter);
588 if (updateContainerComponentRes.isRight()) {
589 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {}. ", container.getName());
590 result = Either.right(updateContainerComponentRes.right().value());
593 if (result == null) {
594 result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
599 public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> deleteComponentInstanceFromTopologyTemplate(
600 TopologyTemplate container, String componentInstanceId) {
602 Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
603 Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
605 String containerComponentId = container.getUniqueId();
607 .addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstanceId,
608 containerComponentId);
610 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
611 .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
612 if (metadataVertex.isRight()) {
613 JanusGraphOperationStatus status = metadataVertex.right().value();
614 if (status == JanusGraphOperationStatus.NOT_FOUND) {
615 status = JanusGraphOperationStatus.INVALID_ID;
617 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
619 GraphVertex containerV = null;
620 ComponentInstanceDataDefinition removedComponentInstance = null;
621 if (result == null) {
622 removedComponentInstance = container.getComponentInstances().remove(componentInstanceId);
623 containerV = metadataVertex.left().value();
624 StorageOperationStatus status = removeRelationsOfInstance(container, componentInstanceId, containerV);
625 if (status != StorageOperationStatus.OK) {
626 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete relation for component instance {} in container. error {}",
627 componentInstanceId, container.getUniqueId(), status);
628 result = Either.right(status);
631 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
632 topologyTemplateOperation.fillToscaElementVertexData(containerV, container, JsonParseFlagEnum.ParseAll);
633 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
634 if (updateElement.isRight()) {
636 .addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(),
637 componentInstanceId);
638 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
641 if (result == null) {
642 StorageOperationStatus status = deleteComponentInstanceToscaDataFromContainerComponent(containerV, componentInstanceId);
643 if (status != StorageOperationStatus.OK) {
645 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete data for instance {} in container {}. error {] ", componentInstanceId,
646 container.getUniqueId(), status);
647 return Either.right(status);
649 ComponentInstance componentInstance = new ComponentInstance(removedComponentInstance);
650 StorageOperationStatus createInstanceEdge = removeInstanceEdge(containerV, componentInstance);
651 result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
653 if (result == null) {
654 updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
655 if (updateContainerComponentRes.isRight()) {
656 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
657 "Failed to fetch updated topology template {} after deleting the component instance {}. ", container.getName(),
658 componentInstanceId);
659 result = Either.right(updateContainerComponentRes.right().value());
662 if (result == null) {
663 result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceId));
668 private StorageOperationStatus removeRelationsOfInstance(TopologyTemplate container, String ciToRemove, GraphVertex containerV) {
669 CompositionDataDefinition composition = container.getCompositions().get(JsonConstantKeysEnum.COMPOSITION.getValue());
670 if (composition != null) {
671 Map<String, RelationshipInstDataDefinition> relations = composition.getRelations();
672 if (MapUtils.isNotEmpty(relations)) {
673 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(
674 containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
675 if (capResult.isRight()) {
676 return capResult.right().value();
679 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
681 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(
682 containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
683 if (capFullResult.isRight()) {
684 return capFullResult.right().value();
687 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
689 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(
690 containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
691 if (reqResult.isRight()) {
692 return reqResult.right().value();
694 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
696 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(
697 containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
698 if (reqResult.isRight()) {
699 return reqResult.right().value();
701 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
703 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
704 while (iterator.hasNext()) {
705 Entry<String, RelationshipInstDataDefinition> relation = iterator.next();
706 RelationshipInstDataDefinition relationToDelete = relation.getValue();
707 if (relationToDelete.getFromId().equals(ciToRemove) || relationToDelete.getToId().equals(ciToRemove)) {
709 if (relationToDelete.getFromId().equals(ciToRemove)) {
710 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, ciToRemove,
711 relationToDelete, null);
712 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, relationToDelete.getToId(),
713 relationToDelete, null);
715 if (relationToDelete.getToId().equals(ciToRemove)) {
716 updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement,
717 relationToDelete.getFromId(), relationToDelete, null);
718 updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, ciToRemove, relationToDelete,
723 return updateAllAndCalculatedCapReqOnGraph(container.getUniqueId(), containerV, capResult, capFullResult, reqResult, reqFullResult);
726 return StorageOperationStatus.OK;
729 private StorageOperationStatus deleteComponentInstanceToscaDataFromContainerComponent(GraphVertex containerV, String componentInstanceId) {
730 StorageOperationStatus status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES,
731 VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceId);
732 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
733 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty for instance {} in container {}. error {] ",
734 componentInstanceId, containerV.getUniqueId(), status);
737 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
738 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceId);
739 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
740 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
741 "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceId,
742 containerV.getUniqueId(), status);
745 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS,
746 VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceId);
747 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
749 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated requirement for instance {} in container {}. error {] ",
750 componentInstanceId, containerV.getUniqueId(), status);
753 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES,
754 VertexTypeEnum.FULLFILLED_CAPABILITIES, componentInstanceId);
755 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
757 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled capabilities for instance {} in container {}. error {] ",
758 componentInstanceId, containerV.getUniqueId(), status);
761 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS,
762 VertexTypeEnum.FULLFILLED_REQUIREMENTS, componentInstanceId);
763 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
765 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ",
766 componentInstanceId, containerV.getUniqueId(), status);
769 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES,
770 componentInstanceId);
771 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
772 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove attributes for instance {} in container {}. error {] ",
773 componentInstanceId, containerV.getUniqueId(), status);
776 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES,
777 componentInstanceId);
778 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
779 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove properties for instance {} in container {}. error {] ",
780 componentInstanceId, containerV.getUniqueId(), status);
783 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS,
784 componentInstanceId);
785 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
786 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance inputs for instance {} in container {}. error {] ",
787 componentInstanceId, containerV.getUniqueId(), status);
790 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS,
791 componentInstanceId);
792 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
794 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement for instance {} in container {}. error {] ",
795 componentInstanceId, containerV.getUniqueId(), status);
798 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS,
799 VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, componentInstanceId);
800 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
802 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance deployment artifacts for instance {} in container {}. error {] ",
803 componentInstanceId, containerV.getUniqueId(), status);
806 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS,
807 componentInstanceId);
808 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
809 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance artifacts for instance {} in container {}. error {] ",
810 componentInstanceId, containerV.getUniqueId(), status);
813 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF,
814 componentInstanceId);
815 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
817 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance external refs for instance {} in container {}. error {] ",
818 componentInstanceId, containerV.getUniqueId(), status);
821 status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INTERFACES,
822 VertexTypeEnum.INST_INTERFACES, componentInstanceId);
823 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
824 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
825 "Failed to remove service instance interfaces for instance {} in container {}. " +
826 "error {] ", componentInstanceId, containerV.getUniqueId(), status);
829 return StorageOperationStatus.OK;
832 protected Either<GraphVertex, StorageOperationStatus> addComponentInstanceToscaDataToContainerComponent(ToscaElement originToscaElement,
833 ComponentInstanceDataDefinition componentInstance,
834 GraphVertex updatedContainerVertex) {
836 Either<GraphVertex, StorageOperationStatus> result;
837 StorageOperationStatus status;
838 if (originToscaElement.getToscaType() == ToscaElementTypeEnum.NODE_TYPE) {
839 status = addComponentInstanceToscaDataToNodeTypeContainer((NodeType) originToscaElement, componentInstance, updatedContainerVertex);
841 status = addComponentInstanceToscaDataToTopologyTemplateContainer((TopologyTemplate) originToscaElement, componentInstance,
842 updatedContainerVertex);
844 if (status == StorageOperationStatus.OK) {
845 result = Either.left(updatedContainerVertex);
847 result = Either.right(status);
852 private StorageOperationStatus addComponentInstanceToscaDataToTopologyTemplateContainer(TopologyTemplate originTopologyTemplate,
853 ComponentInstanceDataDefinition componentInstance,
854 GraphVertex updatedContainerVertex) {
856 StorageOperationStatus status;
858 status = addCalculatedCapReqFromTopologyTemplate(originTopologyTemplate, componentInstance, updatedContainerVertex);
860 if (status != StorageOperationStatus.OK) {
865 MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(originTopologyTemplate.getInputs());
866 MapPropertiesDataDefinition instInputsAsProperties = turnInputsIntoProperties(instInputs);
868 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS,
869 instInputsAsProperties, componentInstance.getUniqueId());
870 if (status != StorageOperationStatus.OK) {
877 private MapPropertiesDataDefinition turnInputsIntoProperties(MapPropertiesDataDefinition instInput) {
878 if (instInput.getMapToscaDataDefinition() != null) {
879 for (PropertyDataDefinition currProp : instInput.getMapToscaDataDefinition().values()) {
880 String temp = currProp.getValue();
881 currProp.setValue(currProp.getDefaultValue());
882 currProp.setDefaultValue(temp);
888 private MapListCapabilityDataDefinition prepareCalculatedCapabiltyForTopologyTemplate(
889 Map<String, ListCapabilityDataDefinition> capabilities,
890 ComponentInstanceDataDefinition componentInstance,
891 MapListCapabilityDataDefinition calculatedCap) {
892 MapListCapabilityDataDefinition allCalculatedCap =
893 new MapListCapabilityDataDefinition(calculatedCap);
894 populateCapability(capabilities, componentInstance, allCalculatedCap);
895 return allCalculatedCap;
898 private void populateCapability(Map<String, ListCapabilityDataDefinition> capabilities,
899 ComponentInstanceDataDefinition componentInstance,
900 MapListCapabilityDataDefinition allCalculatedCap) {
901 capabilities.forEach((key, value) -> {
902 List<CapabilityDataDefinition> listCapabilities = value.getListToscaDataDefinition()
903 .stream().map(CapabilityDataDefinition::new).collect(Collectors.toList());
904 listCapabilities.forEach(cap -> {
905 cap.setSource(componentInstance.getComponentUid());
906 cap.addToPath(componentInstance.getUniqueId());
907 log.debug("enter populateCapability,get Capability OwnerId:{},get componentInstance UniqueId:{}",
908 cap.getOwnerId(), componentInstance.getUniqueId());
909 cap.setOwnerId(componentInstance.getUniqueId());
910 log.debug("enter populateCapability,get Capability OwnerName:{},get componentInstance Name:{}",
911 cap.getOwnerName(), componentInstance.getName());
912 if (cap.getOwnerName() == null || cap.getOwnerName().isEmpty()) {
913 cap.setOwnerName(componentInstance.getName());
915 cap.setLeftOccurrences(cap.getMaxOccurrences());
916 allCalculatedCap.add(key, cap);
921 private MapListRequirementDataDefinition prepareCalculatedRequirementForTopologyTemplate(
922 Map<String, ListRequirementDataDefinition> requirements,
923 ComponentInstanceDataDefinition componentInstance,
924 MapListRequirementDataDefinition calculatedReqs) {
925 MapListRequirementDataDefinition allCalculatedReq =
926 new MapListRequirementDataDefinition(calculatedReqs);
928 populateRequirement(requirements, componentInstance, allCalculatedReq);
929 return allCalculatedReq;
932 private void populateRequirement(Map<String, ListRequirementDataDefinition> requirements,
933 ComponentInstanceDataDefinition componentInstance,
934 MapListRequirementDataDefinition allCalculatedReq) {
935 requirements.forEach((key, value) -> {
936 List<RequirementDataDefinition> listRequirements = value.getListToscaDataDefinition()
937 .stream().map(RequirementDataDefinition::new).collect(Collectors.toList());
938 listRequirements.forEach(req -> {
939 req.setSource(componentInstance.getComponentUid());
940 req.addToPath(componentInstance.getUniqueId());
941 log.debug("enter populateRequirement,get init Requirements OwnerId:{},get componentInstance UniqueId:{}",
942 req.getOwnerId(), componentInstance.getUniqueId());
943 if (req.getOwnerId() == null || req.getOwnerId().isEmpty()) {
944 req.setOwnerId(componentInstance.getUniqueId());
946 log.debug("enter populateRequirement,get init Requirements OwnerName:{}", req.getOwnerName());
947 if (req.getOwnerName() == null || req.getOwnerName().isEmpty()) {
948 req.setOwnerName(componentInstance.getName());
950 req.setLeftOccurrences(req.getMaxOccurrences());
951 allCalculatedReq.add(key, req);
956 private StorageOperationStatus addCalculatedCapReqFromTopologyTemplate(TopologyTemplate originTopologyTemplate,
957 ComponentInstanceDataDefinition componentInstance,
958 GraphVertex updatedContainerVertex) {
959 Map<String, MapListCapabilityDataDefinition> calculatedCapabilities = originTopologyTemplate.getCalculatedCapabilities();
961 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
962 if (calculatedCapabilities != null) {
963 calculatedCapabilities.forEach((key1, value1) -> {
964 final Map<String, ListCapabilityDataDefinition> mapByType = value1.getMapToscaDataDefinition();
965 mapByType.forEach((key, value) -> value.getListToscaDataDefinition().stream()
966 .filter(CapabilityDataDefinition::isExternal)
968 cap.addToPath(componentInstance.getUniqueId());
969 allCalculatedCap.add(key, cap);
973 MapListCapabilityDataDefinition allCaps;
974 Map<String, ListCapabilityDataDefinition> capabilities = originTopologyTemplate.getCapabilities();
975 if (MapUtils.isNotEmpty(capabilities)) {
976 allCaps = prepareCalculatedCapabiltyForTopologyTemplate(capabilities, componentInstance,
979 allCaps = new MapListCapabilityDataDefinition(allCalculatedCap);
981 if (!allCaps.isEmpty()) {
982 StorageOperationStatus calculatedCapabilitiesResult =
983 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
984 EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES,
985 allCaps, componentInstance.getUniqueId());
986 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
987 return calculatedCapabilitiesResult;
989 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
990 calculatedCapabilitiesResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
991 EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES,
992 fullCalculatedCap, componentInstance.getUniqueId());
993 if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
994 return calculatedCapabilitiesResult;
997 Map<String, MapListRequirementDataDefinition> calculatedRequirements =
998 originTopologyTemplate.getCalculatedRequirements();
999 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
1000 if (calculatedRequirements != null) {
1001 calculatedRequirements.forEach((key, value) -> {
1002 Map<String, ListRequirementDataDefinition> mapByType =
1003 value.getMapToscaDataDefinition();
1004 mapByType.forEach((key1, value1) -> value1.getListToscaDataDefinition().stream()
1005 .filter(RequirementDataDefinition::isExternal).forEach(req -> {
1006 req.addToPath(componentInstance.getUniqueId());
1007 req.setExternal(false);
1008 allCalculatedReq.add(key1, req);
1014 MapListRequirementDataDefinition allReqs;
1015 Map<String, ListRequirementDataDefinition> requirements = originTopologyTemplate.getRequirements();
1016 if (MapUtils.isNotEmpty(requirements)) {
1017 allReqs = prepareCalculatedRequirementForTopologyTemplate(requirements,
1018 componentInstance, allCalculatedReq);
1020 allReqs = new MapListRequirementDataDefinition(allCalculatedReq);
1023 if (!allReqs.isEmpty()) {
1024 StorageOperationStatus calculatedRequirementResult =
1025 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
1026 EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS,
1027 allReqs, componentInstance.getUniqueId());
1028 if (calculatedRequirementResult != StorageOperationStatus.OK) {
1029 return calculatedRequirementResult;
1031 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
1032 calculatedRequirementResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
1033 EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS,
1035 componentInstance.getUniqueId());
1036 if (calculatedRequirementResult != StorageOperationStatus.OK) {
1037 return calculatedRequirementResult;
1040 Map<String, MapCapabilityProperty> calculatedCapabilitiesProperties = originTopologyTemplate.getCalculatedCapabilitiesProperties();
1041 Map<String, MapPropertiesDataDefinition> updateKeyMap = new HashMap<>();
1043 if (calculatedCapabilitiesProperties != null && !calculatedCapabilitiesProperties.isEmpty()) {
1044 for (MapCapabilityProperty map : calculatedCapabilitiesProperties.values()) {
1045 for (Entry<String, MapPropertiesDataDefinition> entry : map.getMapToscaDataDefinition().entrySet()) {
1046 String newKey = (componentInstance.getUniqueId() + ModelConverter.CAP_PROP_DELIM + entry.getKey());
1047 updateKeyMap.put(newKey, entry.getValue());
1051 Map<String, MapPropertiesDataDefinition> capabilitiesProperties =
1052 originTopologyTemplate.getCapabilitiesProperties();
1053 Map<String, MapPropertiesDataDefinition> updateKeyMapCapabilitiesProperties;
1054 if (MapUtils.isNotEmpty(capabilitiesProperties)) {
1055 updateKeyMapCapabilitiesProperties = capabilitiesProperties.entrySet().stream()
1056 .collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(),
1057 componentInstance.getUniqueId()), Entry::getValue));
1059 updateKeyMapCapabilitiesProperties = new HashMap<>();
1061 updateKeyMap.putAll(updateKeyMapCapabilitiesProperties);
1062 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
1064 if (MapUtils.isNotEmpty(capabilitiesProperties) || MapUtils.isNotEmpty(calculatedCapabilitiesProperties)) {
1065 StorageOperationStatus calculatedResult =
1066 addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
1067 EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
1068 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty,
1069 componentInstance.getUniqueId());
1070 if (calculatedResult != StorageOperationStatus.OK) {
1071 return calculatedResult;
1074 return StorageOperationStatus.OK;
1077 public CapabilityDataDefinition updateComponentInstanceCapabilities(final String componentId, final String componentInstanceUniqueId,
1078 final CapabilityDataDefinition capabilityDataDefinition) {
1080 final GraphVertex containerVertex = findComponentVertex(componentId).orElse(null);
1081 if (containerVertex == null) {
1082 throw new OperationException(ActionStatus.COMPONENT_NOT_FOUND, componentId);
1085 final Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>> capabilityVertexAndDataPair =
1086 findCapabilityVertex(containerVertex).orElse(null);
1087 if (capabilityVertexAndDataPair == null) {
1088 throw new OperationException(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, capabilityDataDefinition.getName(),
1089 capabilityDataDefinition.getOwnerName(), componentId);
1091 final GraphVertex capabilitiesVertex = capabilityVertexAndDataPair.getLeft();
1092 final Map<String, MapListCapabilityDataDefinition> capabilityDataMap = capabilityVertexAndDataPair.getRight();
1094 final CapabilityDataDefinition actualCapabilityDataDefinition =
1095 findCapability(capabilityDataMap, componentInstanceUniqueId, capabilityDataDefinition.getType(), capabilityDataDefinition.getUniqueId())
1097 if (actualCapabilityDataDefinition == null) {
1098 throw new OperationException(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, capabilityDataDefinition.getName(),
1099 capabilityDataDefinition.getOwnerName(), componentId);
1101 bindCapabilityDefinition(capabilityDataDefinition, actualCapabilityDataDefinition);
1103 var storageOperationStatus = updateCapabilityVertex(containerVertex, capabilitiesVertex);
1104 if (storageOperationStatus != StorageOperationStatus.OK) {
1105 throw new OperationException(ActionStatus.COMPONENT_INSTANCE_CAPABILITY_UPDATE_ERROR, capabilityDataDefinition.getName());
1107 return new CapabilityDataDefinition(actualCapabilityDataDefinition);
1110 private void bindCapabilityDefinition(final CapabilityDataDefinition fromCapabilityDefinition,
1111 final CapabilityDataDefinition capabilityDefinitionToUpdate) {
1112 capabilityDefinitionToUpdate.setExternal(fromCapabilityDefinition.isExternal());
1113 capabilityDefinitionToUpdate.setExternalName(fromCapabilityDefinition.getExternalName());
1116 private Optional<GraphVertex> findComponentVertex(final String componentId) {
1117 final Either<GraphVertex, JanusGraphOperationStatus> componentEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1118 if (componentEither.isRight()) {
1119 final JanusGraphOperationStatus error = componentEither.right().value();
1120 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1121 if (error == JanusGraphOperationStatus.NOT_FOUND) {
1122 return Optional.empty();
1124 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, NodeTemplateOperation.class.getName(), (ErrorLogOptionalData) null,
1125 FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1126 throw new OperationException(ActionStatus.COMPONENT_FIND_ERROR, componentId);
1128 return Optional.ofNullable(componentEither.left().value());
1131 private Optional<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>> findCapabilityVertex(final GraphVertex containerVertex) {
1133 final Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capabilitiesEither =
1134 fetchContainerCalculatedCapability(containerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1135 if (capabilitiesEither.isRight()) {
1136 final StorageOperationStatus error = capabilitiesEither.right().value();
1137 if (error == StorageOperationStatus.NOT_FOUND) {
1138 return Optional.empty();
1140 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, NodeTemplateOperation.class.getName(), (ErrorLogOptionalData) null,
1141 FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, containerVertex.getUniqueId(), error);
1142 throw new OperationException(ActionStatus.COMPONENT_CAPABILITIES_FIND_ERROR, containerVertex.getUniqueId());
1144 return Optional.ofNullable(capabilitiesEither.left().value());
1147 private Optional<CapabilityDataDefinition> findCapability(final Map<String, MapListCapabilityDataDefinition> capabilityMap,
1148 final String componentInstanceUniqueId,
1149 final String capabilityType,
1150 final String capabilityUniqueId) {
1151 var componentInstanceCapabilitiesMap = capabilityMap.get(componentInstanceUniqueId);
1152 if (componentInstanceCapabilitiesMap == null || componentInstanceCapabilitiesMap.isEmpty()) {
1153 return Optional.empty();
1155 var listCapabilityDataDefinition = componentInstanceCapabilitiesMap.getMapToscaDataDefinition().get(capabilityType);
1156 if (listCapabilityDataDefinition == null || listCapabilityDataDefinition.isEmpty()) {
1157 return Optional.empty();
1160 return listCapabilityDataDefinition.getListToscaDataDefinition().stream()
1161 .filter(e -> e.getUniqueId().equals(capabilityUniqueId))
1165 public StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId,
1166 RequirementDataDefinition requirementDataDefinition) {
1167 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1168 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1169 if (containerVEither.isRight()) {
1170 JanusGraphOperationStatus error = containerVEither.right().value();
1171 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1172 return StorageOperationStatus.GENERAL_ERROR;
1174 GraphVertex containerV = containerVEither.left().value();
1175 return updateComponentInstanceRequirement(componentId, componentInstanceUniqueId, requirementDataDefinition, containerV);
1178 private StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId,
1179 RequirementDataDefinition requirementDataDefinition, GraphVertex containerV) {
1180 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> existingReqs = getCalculatedRequirements(
1182 if (existingReqs.isRight()) {
1183 return existingReqs.right().value();
1185 MapListRequirementDataDefinition componentInstanceRequirementsMap = existingReqs.left().value().getRight().get(componentInstanceUniqueId);
1186 if (componentInstanceRequirementsMap == null) {
1187 return StorageOperationStatus.NOT_FOUND;
1189 ListRequirementDataDefinition listRequirementDataDefinition = componentInstanceRequirementsMap.getMapToscaDataDefinition()
1190 .get(requirementDataDefinition.getCapability());
1192 listRequirementDataDefinition.getListToscaDataDefinition().stream()
1193 .filter(e -> requirementDataDefinition.getOwnerId().equals(e.getOwnerId()) && requirementDataDefinition.getName().equals(e.getName()))
1194 .forEach(r -> {r.setExternal(requirementDataDefinition.isExternal()); r.setExternalName(requirementDataDefinition.getExternalName());});
1196 return updateCalculatedReqOnGraph(componentId, containerV, existingReqs);
1199 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> getCalculatedRequirements(
1200 String componentId) {
1201 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> result = null;
1202 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1203 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1204 if (containerVEither.isRight()) {
1205 JanusGraphOperationStatus error = containerVEither.right().value();
1206 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1207 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1209 if (result == null) {
1210 GraphVertex containerV = containerVEither.left().value();
1211 result = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1216 private StorageOperationStatus updateCalculatedReqOnGraph(String componentId, GraphVertex containerV,
1217 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult
1219 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1220 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1221 if (updateElement.isRight()) {
1222 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId,
1223 updateElement.right().value());
1224 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1227 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1228 Either<GraphVertex, JanusGraphOperationStatus> status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV,
1229 EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1230 if (status.isRight()) {
1231 JanusGraphOperationStatus error = status.right().value();
1233 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(),
1235 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1237 return StorageOperationStatus.OK;
1240 private StorageOperationStatus updateCapabilityVertex(final GraphVertex containerVertex, final GraphVertex capabilitiesVertex) {
1241 containerVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1242 final Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerVertex);
1243 if (updateElement.isRight()) {
1244 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template '{}' with new capabilities. Error '{}'.",
1245 containerVertex.getUniqueId(), updateElement.right().value());
1246 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1249 final Either<GraphVertex, JanusGraphOperationStatus> statusEither =
1250 updateOrCopyOnUpdate(capabilitiesVertex, containerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1251 if (statusEither.isRight()) {
1252 JanusGraphOperationStatus error = statusEither.right().value();
1253 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1254 "Failed to update calculated capability for container {} error {}", containerVertex.getUniqueId(), error);
1255 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1257 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Updated calculated capability for container '{}'", containerVertex.getUniqueId());
1258 return StorageOperationStatus.OK;
1261 private StorageOperationStatus addComponentInstanceToscaDataToNodeTypeContainer(NodeType originNodeType,
1262 ComponentInstanceDataDefinition componentInstance,
1263 GraphVertex updatedContainerVertex) {
1265 StorageOperationStatus status;
1267 if (MapUtils.isNotEmpty(originNodeType.getProperties())) {
1268 MapPropertiesDataDefinition instProperties =
1269 new MapPropertiesDataDefinition(originNodeType.getProperties());
1270 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_PROPERTIES,
1271 VertexTypeEnum.INST_PROPERTIES, instProperties, componentInstance.getUniqueId());
1272 if (status != StorageOperationStatus.OK) {
1277 if (MapUtils.isNotEmpty(originNodeType.getAttributes())) {
1278 MapAttributesDataDefinition instAttributes =
1279 new MapAttributesDataDefinition(originNodeType.getAttributes());
1280 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_ATTRIBUTES,
1281 VertexTypeEnum.INST_ATTRIBUTES, instAttributes, componentInstance.getUniqueId());
1282 if (status != StorageOperationStatus.OK) {
1287 return addCalculatedCapReqFromNodeType(originNodeType, componentInstance, updatedContainerVertex);
1290 public MapArtifactDataDefinition prepareInstDeploymentArtifactPerInstance(Map<String, ArtifactDataDefinition> deploymentArtifacts,
1291 String componentInstanceId, User user, String envType) {
1292 if (deploymentArtifacts != null && envType.equals(HEAT_VF_ENV_NAME)) {
1293 Map<String, ArtifactDataDefinition> instDeploymentArtifacts = new HashMap<>();
1295 deploymentArtifacts.entrySet().forEach(e -> {
1296 ArtifactDataDefinition artifact = e.getValue();
1297 String type = artifact.getArtifactType();
1298 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type
1299 .equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
1300 ArtifactDataDefinition artifactEnv = createArtifactPlaceHolderInfo(artifact, componentInstanceId, user, envType);
1301 instDeploymentArtifacts.put(artifactEnv.getArtifactLabel(), artifactEnv);
1305 deploymentArtifacts.putAll(instDeploymentArtifacts);
1307 return new MapArtifactDataDefinition(deploymentArtifacts);
1313 @SuppressWarnings({"unchecked"})
1314 private ArtifactDataDefinition createArtifactPlaceHolderInfo(ArtifactDataDefinition artifactHeat, String componentId, User user,
1315 String heatEnvType) {
1316 Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration()
1317 .getDeploymentResourceInstanceArtifacts();
1318 if (deploymentResourceArtifacts == null) {
1319 log.debug("no deployment artifacts are configured for generated artifacts");
1322 Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(heatEnvType);
1323 if (placeHolderData == null) {
1324 log.debug("no env type {} are configured for generated artifacts", heatEnvType);
1328 String envLabel = (artifactHeat.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
1330 ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition();
1332 String artifactName = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DISPLAY_NAME);
1333 String artifactType = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_TYPE);
1334 String artifactDescription = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DESCRIPTION);
1336 artifactInfo.setArtifactDisplayName(artifactName);
1337 artifactInfo.setArtifactLabel(envLabel);
1338 artifactInfo.setArtifactType(artifactType);
1339 artifactInfo.setDescription(artifactDescription);
1340 artifactInfo.setArtifactGroupType(artifactHeat.getArtifactGroupType());
1341 setDefaultArtifactTimeout(artifactHeat.getArtifactGroupType(), artifactInfo);
1342 artifactInfo.setGeneratedFromId(artifactHeat.getUniqueId());
1343 // clone heat parameters in case of heat env only not VF heat env
1344 if (heatEnvType.equals(HEAT_ENV_NAME)) {
1345 artifactInfo.setHeatParameters(artifactHeat.getHeatParameters());
1347 setArtifactPlaceholderCommonFields(componentId, user, artifactInfo);
1349 return artifactInfo;
1352 public void setDefaultArtifactTimeout(ArtifactGroupTypeEnum groupType, ArtifactDataDefinition artifactInfo) {
1353 if (groupType.equals(ArtifactGroupTypeEnum.DEPLOYMENT)) {
1354 artifactInfo.setTimeout(defaultHeatTimeout);
1356 artifactInfo.setTimeout(NON_HEAT_TIMEOUT);
1360 private void setArtifactPlaceholderCommonFields(String resourceId, User user, ArtifactDataDefinition artifactInfo) {
1361 if (resourceId != null) {
1362 String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(resourceId.toLowerCase(), artifactInfo.getArtifactLabel().toLowerCase());
1363 artifactInfo.setUniqueId(uniqueId);
1365 artifactInfo.setUserIdCreator(user.getUserId());
1366 String fullName = user.getFullName();
1367 artifactInfo.setUpdaterFullName(fullName);
1369 long time = System.currentTimeMillis();
1371 artifactInfo.setCreatorFullName(fullName);
1372 artifactInfo.setCreationDate(time);
1374 artifactInfo.setLastUpdateDate(time);
1375 artifactInfo.setUserIdLastUpdater(user.getUserId());
1377 artifactInfo.setMandatory(true);
1381 * @param originNodeType
1382 * @param componentInstance
1383 * @param updatedContainerVertex
1386 private StorageOperationStatus addCalculatedCapReqFromNodeType(NodeType originNodeType, ComponentInstanceDataDefinition componentInstance,
1387 GraphVertex updatedContainerVertex) {
1388 Map<String, ListCapabilityDataDefinition> capabilities = originNodeType.getCapabilities();
1389 MapListCapabilityDataDefinition allCalculatedCap = prepareCalculatedCapabiltyForNodeType(capabilities, componentInstance);
1390 StorageOperationStatus calculatedResult;
1391 if (allCalculatedCap != null) {
1392 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES,
1393 VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
1394 if (calculatedResult != StorageOperationStatus.OK) {
1395 return calculatedResult;
1398 Map<String, MapPropertiesDataDefinition> capabiltiesProperties = originNodeType.getCapabilitiesProperties();
1399 if (capabiltiesProperties != null) {
1400 Map<String, MapPropertiesDataDefinition> updateKeyMap = capabiltiesProperties.entrySet().stream()
1401 .collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(), componentInstance.getUniqueId()), Entry::getValue));
1402 MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
1403 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
1404 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty, componentInstance.getUniqueId());
1405 if (calculatedResult != StorageOperationStatus.OK) {
1406 return calculatedResult;
1409 MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
1410 calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_CAPABILITIES,
1411 VertexTypeEnum.FULLFILLED_CAPABILITIES, fullCalculatedCap, componentInstance.getUniqueId());
1412 if (calculatedResult != StorageOperationStatus.OK) {
1413 return calculatedResult;
1415 Map<String, ListRequirementDataDefinition> requirements = originNodeType.getRequirements();
1416 MapListRequirementDataDefinition allCalculatedReq = prepareCalculatedRequirementForNodeType(requirements, componentInstance);
1417 StorageOperationStatus status;
1418 if (allCalculatedReq != null) {
1419 status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_REQUIREMENTS,
1420 VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
1421 if (status != StorageOperationStatus.OK) {
1425 MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
1426 return addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_REQUIREMENTS,
1427 VertexTypeEnum.FULLFILLED_REQUIREMENTS, fullCalculatedReq, componentInstance.getUniqueId());
1431 * Prepares a map of capabilities lists Produces a deep copy of the received map of capabilities Sets values to the specific fields according to
1432 * received component instance
1434 * @param capabilities
1435 * @param componentInstance
1438 public MapListCapabilityDataDefinition prepareCalculatedCapabiltyForNodeType(Map<String, ListCapabilityDataDefinition> capabilities,
1439 ComponentInstanceDataDefinition componentInstance) {
1440 if (capabilities != null) {
1441 MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
1442 populateCapability(capabilities, componentInstance, allCalculatedCap);
1443 return allCalculatedCap;
1449 * Prepares a map of requirements lists Produces a deep copy of the received map of requirements Sets values to the specific fields according to
1450 * received component instance
1452 * @param requirements
1453 * @param componentInstance
1456 public MapListRequirementDataDefinition prepareCalculatedRequirementForNodeType(Map<String, ListRequirementDataDefinition> requirements,
1457 ComponentInstanceDataDefinition componentInstance) {
1458 if (requirements != null) {
1459 MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
1460 populateRequirement(requirements, componentInstance, allCalculatedReq);
1461 return allCalculatedReq;
1466 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent,
1467 ComponentInstanceDataDefinition componentInstance,
1468 List<GroupDefinition> groups,
1469 Map<String, List<ArtifactDefinition>> groupInstancesArtifacts) {
1470 StorageOperationStatus result = null;
1471 Map<String, GroupInstanceDataDefinition> groupInstanceToCreate = new HashMap<>();
1472 if (groupInstancesArtifacts != null && CollectionUtils.isNotEmpty(groups)) {
1473 for (Map.Entry<String, List<ArtifactDefinition>> groupArtifacts : groupInstancesArtifacts.entrySet()) {
1474 Optional<GroupDefinition> groupOptional = groups.stream().filter(g -> g.getUniqueId().equals(groupArtifacts.getKey())).findFirst();
1475 if (groupOptional.isPresent()) {
1476 GroupInstanceDataDefinition groupInstance = buildGroupInstanceDataDefinition((GroupDataDefinition) groupOptional.get(),
1477 (ComponentInstanceDataDefinition) componentInstance, null);
1478 groupInstance.setGroupInstanceArtifacts(
1479 groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getUniqueId).collect(Collectors.toList()));
1480 groupInstance.setGroupInstanceArtifactsUuid(
1481 groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getArtifactUUID).collect(Collectors.toList()));
1482 groupInstanceToCreate.put(groupInstance.getName(), groupInstance);
1486 if (MapUtils.isNotEmpty(groupInstanceToCreate)) {
1487 result = addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS,
1488 VertexTypeEnum.INST_GROUPS, new MapDataDefinition<>(groupInstanceToCreate), componentInstance.getUniqueId());
1490 if (result == null) {
1491 result = StorageOperationStatus.OK;
1496 private ComponentInstanceDataDefinition buildComponentInstanceDataDefinition(ComponentInstance resourceInstance, String containerComponentId,
1497 String instanceNewName, boolean generateUid,
1498 ToscaElement originToscaElement) {
1499 String ciOriginComponentUid = resourceInstance.getComponentUid();
1500 if (!ValidationUtils.validateStringNotEmpty(resourceInstance.getCustomizationUUID())) {
1501 resourceInstance.setCustomizationUUID(generateCustomizationUUID());
1503 ComponentInstanceDataDefinition dataDefinition = new ComponentInstanceDataDefinition(resourceInstance);
1504 Long creationDate = resourceInstance.getCreationTime();
1505 Long modificationTime;
1506 if (creationDate == null) {
1507 creationDate = System.currentTimeMillis();
1508 modificationTime = creationDate;
1510 modificationTime = System.currentTimeMillis();
1512 dataDefinition.setComponentUid(ciOriginComponentUid);
1513 dataDefinition.setCreationTime(creationDate);
1514 dataDefinition.setModificationTime(modificationTime);
1515 if (StringUtils.isNotEmpty(instanceNewName)) {
1516 dataDefinition.setName(instanceNewName);
1517 resourceInstance.setName(instanceNewName);
1519 if (StringUtils.isNotEmpty(dataDefinition.getName())) {
1520 dataDefinition.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(dataDefinition.getName()));
1522 dataDefinition.setIcon(resourceInstance.getIcon());
1524 dataDefinition.setUniqueId(
1525 UniqueIdBuilder.buildResourceInstanceUniuqeId(containerComponentId, ciOriginComponentUid, dataDefinition.getNormalizedName()));
1526 resourceInstance.setUniqueId(dataDefinition.getUniqueId());
1528 if (StringUtils.isEmpty(dataDefinition.getComponentVersion()) && originToscaElement != null) {
1529 dataDefinition.setComponentVersion((String) originToscaElement.getMetadataValue(JsonPresentationFields.VERSION));
1531 if (StringUtils.isEmpty(dataDefinition.getComponentName()) && originToscaElement != null) {
1532 dataDefinition.setComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.NAME));
1534 if (originToscaElement != null && dataDefinition.getToscaComponentName() == null) {
1535 dataDefinition.setToscaComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
1537 if (dataDefinition.getOriginType() == null && originToscaElement != null) {
1538 ResourceTypeEnum resourceType = originToscaElement.getResourceType();
1539 OriginTypeEnum originType = OriginTypeEnum.findByValue(resourceType.name());
1540 dataDefinition.setOriginType(originType);
1542 if (dataDefinition.getOriginType() == OriginTypeEnum.ServiceProxy) {
1543 dataDefinition.setIsProxy(true);
1545 return dataDefinition;
1548 private Boolean isUniqueInstanceName(TopologyTemplate container, String instanceName) {
1549 Boolean isUniqueName = true;
1551 isUniqueName = container.getComponentInstances().values().stream()
1552 .noneMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName));
1553 } catch (Exception e) {
1554 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1555 "Exception occured during fetching component instance with name {} from component container {}. {} ", instanceName,
1556 container.getName(), e.getMessage());
1558 return isUniqueName;
1561 private String buildComponentInstanceName(String instanceSuffixNumber, String instanceName) {
1562 return instanceName + " " + (instanceSuffixNumber == null ? 0 : instanceSuffixNumber);
1565 public Either<RequirementCapabilityRelDef, StorageOperationStatus> associateResourceInstances(Component component, String componentId,
1566 RequirementCapabilityRelDef relation) {
1567 List<RequirementCapabilityRelDef> relations = new ArrayList<>();
1568 relations.add(relation);
1569 Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances = associateResourceInstances(component,
1570 componentId, relations);
1571 if (associateResourceInstances.isRight()) {
1572 return Either.right(associateResourceInstances.right().value());
1574 return Either.left(associateResourceInstances.left().value().get(0));
1577 @SuppressWarnings({"unchecked"})
1578 public <T extends ToscaDataDefinition> Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances(
1579 Component component, String componentId, List<RequirementCapabilityRelDef> relations) {
1580 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1581 if (containerVEither.isRight()) {
1582 JanusGraphOperationStatus error = containerVEither.right().value();
1583 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1584 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1586 GraphVertex containerV = containerVEither.left().value();
1587 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(
1588 containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1589 if (capResult.isRight()) {
1590 return Either.right(capResult.right().value());
1592 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
1593 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(
1594 containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1595 if (capResult.isRight()) {
1596 return Either.right(capResult.right().value());
1598 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
1599 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(
1600 containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1601 if (reqResult.isRight()) {
1602 return Either.right(reqResult.right().value());
1604 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1605 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(
1606 containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1607 if (reqResult.isRight()) {
1608 return Either.right(reqResult.right().value());
1610 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
1611 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1612 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1613 StorageOperationStatus status;
1614 List<RequirementCapabilityRelDef> relationsList = new ArrayList<>();
1615 for (RequirementCapabilityRelDef relation : relations) {
1616 List<CapabilityRequirementRelationship> relationshipsResult = new ArrayList<>();
1617 String fromNode = relation.getFromNode();
1618 String toNode = relation.getToNode();
1619 List<CapabilityRequirementRelationship> relationships = relation.getRelationships();
1620 if (relationships == null || relationships.isEmpty()) {
1621 BeEcompErrorManager.getInstance()
1622 .logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1624 .addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement definition sent in order to set the relation between {} to {}", fromNode,
1626 loggerSupportability.log(LogLevel.INFO, LoggerSupportabilityActions.CREATE_RELATION.getName(),
1627 "componentId: " + componentId + " No requirement definition sent in order to set the relation between: " + fromNode + " to: "
1629 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
1631 for (final CapabilityRequirementRelationship relationship : relationships) {
1632 final String requirement = relationship.getRelation().getRequirement();
1633 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> associateRes = connectInstancesInContainer(fromNode, toNode,
1634 relationship.getRelation(), relation.isOriginUI(), calculatedCapabilty, calculatedRequirement, fullFilledCapabilty,
1635 fullfilledRequirement, compositionDataDefinition, containerV.getUniqueId());
1636 if (associateRes.isRight()) {
1637 status = associateRes.right().value();
1638 BeEcompErrorManager.getInstance()
1639 .logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1640 loggerSupportability.log(LogLevel.INFO, LoggerSupportabilityActions.CREATE_RELATIONS.name(), StatusCode.ERROR,
1641 "missing relationship: " + fromNode, "ComopnentId: " + componentId);
1643 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to associate resource instance {} to resource instance {}. status is {}",
1644 fromNode, toNode, status);
1645 return Either.right(status);
1647 final Map<JsonPresentationFields, T> relationshipFieldsMap = associateRes.left().value();
1648 final RelationshipInstDataDefinition relationshipInstData = (RelationshipInstDataDefinition) relationshipFieldsMap
1649 .get(JsonPresentationFields.RELATIONSHIP);
1650 createRelationshipInterfaces(relationship.getOperations()).ifPresent(relationshipInstData::setInterfaces);
1651 RelationshipImpl relationshipImplResult = new RelationshipImpl();
1652 relationshipImplResult.setType(relationshipInstData.getType());
1653 RelationshipInfo requirementAndRelationshipPair = new RelationshipInfo(requirement, relationshipImplResult);
1654 requirementAndRelationshipPair.setCapability(relationship.getRelation().getCapability());
1655 requirementAndRelationshipPair.setRequirement(relationship.getRelation().getRequirement());
1656 requirementAndRelationshipPair.setCapabilityOwnerId(relationshipInstData.getCapabilityOwnerId());
1657 requirementAndRelationshipPair.setRequirementOwnerId(relationshipInstData.getRequirementOwnerId());
1658 requirementAndRelationshipPair.setCapabilityUid(relationship.getRelation().getCapabilityUid());
1659 requirementAndRelationshipPair.setRequirementUid(relationship.getRelation().getRequirementUid());
1660 requirementAndRelationshipPair.setId(relationshipInstData.getUniqueId());
1661 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
1662 capReqRel.setRelation(requirementAndRelationshipPair);
1663 capReqRel.setCapability((CapabilityDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.CAPABILITY));
1664 capReqRel.setRequirement((RequirementDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.REQUIREMENT));
1665 capReqRel.setOperations(relationship.getOperations());
1666 relationshipsResult.add(capReqRel);
1667 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "update customization UUID for from CI {} and to CI {}", relation.getFromNode(),
1668 relation.getToNode());
1669 status = updateCustomizationUUID(relation.getFromNode(), compositionDataDefinition);
1670 if (status != StorageOperationStatus.OK) {
1671 loggerSupportability.log(LogLevel.INFO, LoggerSupportabilityActions.CREATE_RELATIONS.name(), StatusCode.ERROR,
1672 "ERROR while update customization UUID for from CI " + relation.getFromNode() + " and to CI: " + relation.getToNode());
1673 return Either.right(status);
1675 status = updateCustomizationUUID(relation.getToNode(), compositionDataDefinition);
1676 if (status != StorageOperationStatus.OK) {
1677 loggerSupportability.log(LogLevel.INFO, LoggerSupportabilityActions.CREATE_RELATIONS.name(), StatusCode.ERROR,
1678 "ERROR while update customization UUID for from CI " + relation.getFromNode() + " and to CI: " + relation.getToNode());
1679 return Either.right(status);
1682 RequirementCapabilityRelDef reqCapRelDef = new RequirementCapabilityRelDef(relation);
1683 reqCapRelDef.setRelationships(relationshipsResult);
1684 relationsList.add(reqCapRelDef);
1686 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1687 if (status != StorageOperationStatus.OK) {
1688 return Either.right(status);
1690 return Either.left(relationsList);
1693 private Optional<ListDataDefinition<InterfaceDataDefinition>> createRelationshipInterfaces(final List<OperationUi> operationList) {
1694 if (CollectionUtils.isEmpty(operationList)) {
1695 return Optional.empty();
1697 final ListDataDefinition<InterfaceDataDefinition> interfaceList = new ListDataDefinition<>();
1698 final Map<String, List<OperationUi>> operationByInterfaceType = operationList.stream()
1699 .collect(Collectors.groupingBy(OperationUi::getInterfaceType));
1700 for (final Entry<String, List<OperationUi>> interfaceEntry : operationByInterfaceType.entrySet()) {
1701 interfaceList.add(createInterface(interfaceEntry.getKey(), interfaceEntry.getValue()));
1703 return Optional.of(interfaceList);
1706 private InterfaceDataDefinition createInterface(final String interfaceType, final List<OperationUi> operationList) {
1707 final InterfaceDataDefinition interfaceDataDefinition = new InterfaceDataDefinition();
1708 interfaceDataDefinition.setType(interfaceType);
1709 if (CollectionUtils.isNotEmpty(operationList)) {
1710 final Map<String, OperationDataDefinition> operationMap = operationList.stream()
1711 .collect(Collectors.toMap(OperationUi::getOperationType, this::createOperation));
1712 interfaceDataDefinition.setOperations(operationMap);
1714 return interfaceDataDefinition;
1717 private OperationDataDefinition createOperation(final OperationUi operation) {
1718 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
1719 operationDataDefinition.setName(operation.getOperationType());
1720 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
1721 final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
1722 implementation.setArtifactName(operation.getImplementation());
1723 operationDataDefinition.setImplementation(implementation);
1724 if (CollectionUtils.isNotEmpty(operation.getInputs())) {
1725 final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
1726 operation.getInputs().forEach(input -> {
1727 final OperationInputDefinition operationInputDefinition = new OperationInputDefinition();
1728 operationInputDefinition.setLabel(input.getName());
1729 operationInputDefinition.setType(input.getType());
1730 operationInputDefinition.setValue(input.getValue());
1731 inputs.add(operationInputDefinition);
1733 operationDataDefinition.setInputs(inputs);
1735 return operationDataDefinition;
1738 private StorageOperationStatus updateAllAndCalculatedCapReqOnGraph(String componentId, GraphVertex containerV,
1739 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult,
1740 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult,
1741 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult,
1742 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult) {
1743 containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1744 Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1745 if (updateElement.isRight()) {
1746 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId,
1747 updateElement.right().value());
1748 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1750 // update cap/req jsons, fulfilled cap/req jsons!!!!!
1751 Either<GraphVertex, JanusGraphOperationStatus> status;
1752 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated capabilty for container {}", containerV.getUniqueId());
1753 status = updateOrCopyOnUpdate(capResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1754 if (status.isRight()) {
1755 JanusGraphOperationStatus error = status.right().value();
1757 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated capabilty for container {} error {}", containerV.getUniqueId(),
1759 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1761 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1762 status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1763 if (status.isRight()) {
1764 JanusGraphOperationStatus error = status.right().value();
1766 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(),
1768 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1770 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled capabilty for container {}", containerV.getUniqueId());
1771 status = updateOrCopyOnUpdate(capFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1772 if (status.isRight()) {
1773 JanusGraphOperationStatus error = status.right().value();
1775 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled capabilty for container {} error {}", containerV.getUniqueId(),
1777 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1779 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled requirement for container {}", containerV.getUniqueId());
1780 status = updateOrCopyOnUpdate(reqFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1781 if (status.isRight()) {
1782 JanusGraphOperationStatus error = status.right().value();
1783 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled requirement for container {} error {}",
1784 containerV.getUniqueId(), error);
1785 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1787 return StorageOperationStatus.OK;
1790 @SuppressWarnings({"unchecked"})
1791 public Either<RequirementCapabilityRelDef, StorageOperationStatus> dissociateResourceInstances(String componentId,
1792 RequirementCapabilityRelDef requirementDef) {
1793 if (requirementDef.getRelationships() == null) {
1794 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation pair in request [ {} ]", requirementDef);
1795 return Either.right(StorageOperationStatus.BAD_REQUEST);
1797 String fromResInstanceUid = requirementDef.getFromNode();
1798 String toResInstanceUid = requirementDef.getToNode();
1799 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1800 if (containerVEither.isRight()) {
1801 JanusGraphOperationStatus error = containerVEither.right().value();
1802 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1803 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1805 GraphVertex containerV = containerVEither.left().value();
1806 // DE191707 - validations
1807 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1808 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1809 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1810 ComponentInstanceDataDefinition ciFrom = componentInstances.get(fromResInstanceUid);
1811 if (ciFrom == null) {
1812 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "FROM instance {} isn't under container {}", fromResInstanceUid, componentId);
1813 return Either.right(StorageOperationStatus.NOT_FOUND);
1815 ComponentInstanceDataDefinition ciTo = componentInstances.get(toResInstanceUid);
1816 if (ciFrom == ciTo) {
1817 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "TO instance {} isn't under container {}", toResInstanceUid, componentId);
1818 return Either.right(StorageOperationStatus.NOT_FOUND);
1820 Map<String, RelationshipInstDataDefinition> relations = compositionDataDefinition.getRelations();
1821 List<CapabilityRequirementRelationship> relationPairList = requirementDef.getRelationships();
1822 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(
1823 containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1824 if (capResult.isRight()) {
1825 return Either.right(capResult.right().value());
1827 Map<String, MapListCapabilityDataDefinition> calculatedCapability = capResult.left().value().getRight();
1828 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(
1829 containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1830 if (capResult.isRight()) {
1831 return Either.right(capResult.right().value());
1833 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1834 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(
1835 containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1836 if (reqResult.isRight()) {
1837 return Either.right(reqResult.right().value());
1839 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1840 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(
1841 containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1842 if (reqResult.isRight()) {
1843 return Either.right(reqResult.right().value());
1845 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1846 for (CapabilityRequirementRelationship relationPair : relationPairList) {
1847 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
1848 boolean isDeleted = false;
1849 while (iterator.hasNext()) {
1850 Entry<String, RelationshipInstDataDefinition> entryInJson = iterator.next();
1851 RelationshipInstDataDefinition relationInJson = entryInJson.getValue();
1852 if (relationInJson.getFromId().equals(fromResInstanceUid) && relationInJson.getToId().equals(toResInstanceUid) && relationInJson
1853 .getUniqueId().equals(relationPair.getRelation().getId())) {
1854 if (relationPair.getRelation().equalsTo(relationInJson)) {
1856 .addRecordToLog(log, LogLevelEnum.DEBUG, "Remove relation from {} to {} capability {} capOwnerId {} reqOwnerId {} ",
1857 toResInstanceUid, componentId, relationInJson.getType(), relationInJson.getCapabilityOwnerId(),
1858 relationInJson.getRequirementOwnerId());
1860 // update calculated cap/req
1861 StorageOperationStatus status = updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapability, fulfilledCapability,
1862 toResInstanceUid, relationInJson, relationPair);
1863 if (status != StorageOperationStatus.OK) {
1864 return Either.right(status);
1866 status = updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fulfilledRequirement, fromResInstanceUid,
1867 relationInJson, relationPair);
1868 if (status != StorageOperationStatus.OK) {
1869 return Either.right(status);
1876 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation to delete from {} to {} capabilty {} capOwnerId {} reqOwnerId {} ",
1877 toResInstanceUid, componentId, relationPair.getCapability(), relationPair.getRelation().getCapabilityOwnerId(),
1878 relationPair.getRelation().getRequirementOwnerId());
1879 return Either.right(StorageOperationStatus.NOT_FOUND);
1882 StorageOperationStatus status = updateCustomizationUUID(fromResInstanceUid, compositionDataDefinition);
1883 if (status != StorageOperationStatus.OK) {
1884 return Either.right(status);
1886 status = updateCustomizationUUID(toResInstanceUid, compositionDataDefinition);
1887 if (status != StorageOperationStatus.OK) {
1888 return Either.right(status);
1892 // update metadata of container and composition json
1893 status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1894 if (status != StorageOperationStatus.OK) {
1895 return Either.right(status);
1897 return Either.left(requirementDef);
1901 * Retrieves fulfilled requirement according to relation and received predicate
1903 * @param componentId
1905 * @param foundRelation
1909 public Either<RequirementDataDefinition, StorageOperationStatus> getFulfilledRequirementByRelation(String componentId, String instanceId,
1910 RequirementCapabilityRelDef foundRelation,
1911 BiPredicate<RelationshipInfo, RequirementDataDefinition> predicate) {
1912 Either<RequirementDataDefinition, StorageOperationStatus> result = null;
1913 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = null;
1914 MapListRequirementDataDefinition reqMapOfLists = null;
1915 Optional<RequirementDataDefinition> foundRequirement;
1916 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1917 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1918 if (containerVEither.isRight()) {
1919 JanusGraphOperationStatus error = containerVEither.right().value();
1920 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1921 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1923 if (result == null) {
1924 GraphVertex containerV = containerVEither.left().value();
1925 reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1926 if (reqFullResult.isRight()) {
1927 result = Either.right(reqFullResult.right().value());
1930 if (result == null) {
1931 Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1932 reqMapOfLists = fulfilledRequirement.get(instanceId);
1933 if (reqMapOfLists == null) {
1934 result = Either.right(StorageOperationStatus.NOT_FOUND);
1937 if (result == null && reqMapOfLists != null) {
1938 for (ListRequirementDataDefinition requirements : reqMapOfLists.getMapToscaDataDefinition().values()) {
1939 foundRequirement = requirements.getListToscaDataDefinition().stream().filter(req -> predicate.test(relationshipInfo, req))
1941 if (foundRequirement.isPresent()) {
1942 result = Either.left(foundRequirement.get());
1950 * Retrieves fulfilled capability according to relation and received predicate
1952 * @param componentId
1954 * @param foundRelation
1958 public Either<CapabilityDataDefinition, StorageOperationStatus> getFulfilledCapabilityByRelation(String componentId, String instanceId,
1959 RequirementCapabilityRelDef foundRelation,
1960 BiPredicate<RelationshipInfo, CapabilityDataDefinition> predicate) {
1961 Either<CapabilityDataDefinition, StorageOperationStatus> result = null;
1962 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = null;
1963 MapListCapabilityDataDefinition capMapOfLists = null;
1964 Optional<CapabilityDataDefinition> foundRequirement;
1965 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1966 Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1967 if (containerVEither.isRight()) {
1968 JanusGraphOperationStatus error = containerVEither.right().value();
1969 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1970 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1972 if (result == null) {
1973 GraphVertex containerV = containerVEither.left().value();
1974 capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1975 if (capFullResult.isRight()) {
1976 result = Either.right(capFullResult.right().value());
1979 if (result == null) {
1980 Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1981 capMapOfLists = fulfilledCapability.get(instanceId);
1982 if (capMapOfLists == null) {
1983 result = Either.right(StorageOperationStatus.NOT_FOUND);
1986 if (result == null && capMapOfLists != null) {
1987 for (ListCapabilityDataDefinition capabilities : capMapOfLists.getMapToscaDataDefinition().values()) {
1988 foundRequirement = capabilities.getListToscaDataDefinition().stream().filter(cap -> predicate.test(relationshipInfo, cap))
1990 if (foundRequirement.isPresent()) {
1991 result = Either.left(foundRequirement.get());
1998 private StorageOperationStatus updateCalculatedRequirementsAfterDeleteRelation(
1999 Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement,
2000 String fromResInstanceUid, RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
2001 StorageOperationStatus status;
2002 String hereIsTheKey = null;
2003 MapListRequirementDataDefinition reqByInstance = calculatedRequirement.get(fromResInstanceUid);
2004 if (reqByInstance == null || reqByInstance.findKeyByItemUidMatch(relation.getRequirementId()) == null) {
2005 // move from fulfilled
2006 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey,
2009 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
2010 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
2011 Optional<RequirementDataDefinition> requirementOptional = reqByType.getListToscaDataDefinition().stream().filter(
2012 req -> req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req
2013 .getUniqueId().equals(relation.getRequirementId())).findFirst();
2014 if (requirementOptional.isPresent()) {
2015 RequirementDataDefinition requirement = requirementOptional.get();
2016 String leftOccurrences = requirement.getLeftOccurrences();
2017 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
2018 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2020 requirement.setLeftOccurrences(String.valueOf(leftIntValue));
2022 if (relationship != null) {
2023 relationship.setRequirement(requirement);
2025 status = StorageOperationStatus.OK;
2027 // move from fulfilled
2028 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey,
2035 private StorageOperationStatus updateCalculatedCapabiltyAfterDeleteRelation(Map<String, MapListCapabilityDataDefinition> calculatedCapability,
2036 Map<String, MapListCapabilityDataDefinition> fullFilledCapability,
2037 String toResInstanceUid, RelationshipInstDataDefinition relation,
2038 CapabilityRequirementRelationship relationship) {
2039 StorageOperationStatus status;
2040 String hereIsTheKey = null;
2041 MapListCapabilityDataDefinition capByInstance = calculatedCapability.get(toResInstanceUid);
2042 if (capByInstance == null || capByInstance.findKeyByItemUidMatch(relation.getCapabilityId()) == null) {
2043 // move from fulfilled
2044 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
2046 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
2047 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
2048 Optional<CapabilityDataDefinition> capabilityOptional = capByType.getListToscaDataDefinition().stream()
2049 .filter(cap -> cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId()))
2051 if (capabilityOptional.isPresent()) {
2052 CapabilityDataDefinition capability = capabilityOptional.get();
2053 String leftOccurrences = capability.getLeftOccurrences();
2054 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
2055 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2057 capability.setLeftOccurrences(String.valueOf(leftIntValue));
2059 if (relationship != null) {
2060 relationship.setCapability(capability);
2062 status = StorageOperationStatus.OK;
2064 // move from fulfilled
2065 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey,
2072 private StorageOperationStatus moveFromFullFilledCapabilty(Map<String, MapListCapabilityDataDefinition> calculatedCapability,
2073 Map<String, MapListCapabilityDataDefinition> fullFilledCapability,
2074 String toResInstanceUid, RelationshipInstDataDefinition relation, String hereIsTheKey,
2075 CapabilityRequirementRelationship relationship) {
2076 MapListCapabilityDataDefinition capByInstance = fullFilledCapability.get(toResInstanceUid);
2077 if (capByInstance == null) {
2078 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability in fulfilled list for instance {} ", toResInstanceUid);
2079 return StorageOperationStatus.GENERAL_ERROR;
2081 if (null == hereIsTheKey) {
2082 hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
2084 if (null == hereIsTheKey) {
2086 .addRecordToLog(log, LogLevelEnum.DEBUG, "No capability with id {} in fulfilled list for instance {} ", relation.getCapabilityId(),
2088 return StorageOperationStatus.GENERAL_ERROR;
2090 ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
2091 Iterator<CapabilityDataDefinition> iterator = capByType.getListToscaDataDefinition().iterator();
2092 boolean found = false;
2093 while (iterator.hasNext()) {
2094 CapabilityDataDefinition cap = iterator.next();
2095 if (cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId())) {
2098 // return to calculated list
2099 String leftOccurrences = cap.getLeftOccurrences();
2100 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2102 cap.setLeftOccurrences(String.valueOf(leftIntValue));
2103 MapListCapabilityDataDefinition mapListCapaDataDef = calculatedCapability.get(toResInstanceUid);
2104 if (mapListCapaDataDef == null) {
2105 mapListCapaDataDef = new MapListCapabilityDataDefinition();
2107 ListCapabilityDataDefinition findByKey = mapListCapaDataDef.findByKey(hereIsTheKey);
2108 if (findByKey == null) {
2109 findByKey = new ListCapabilityDataDefinition();
2110 mapListCapaDataDef.put(hereIsTheKey, findByKey);
2113 if (relationship != null) {
2114 relationship.setCapability(cap);
2121 .addRecordToLog(log, LogLevelEnum.DEBUG, "No capability type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey,
2122 relation.getCapabilityOwnerId(), toResInstanceUid);
2123 return StorageOperationStatus.GENERAL_ERROR;
2125 return StorageOperationStatus.OK;
2128 private StorageOperationStatus moveFromFullFilledRequirement(Map<String, MapListRequirementDataDefinition> calculatedRequirement,
2129 Map<String, MapListRequirementDataDefinition> fullFilledRequirement,
2130 String fromResInstanceUid, RelationshipInstDataDefinition relation,
2131 String hereIsTheKey, CapabilityRequirementRelationship relationship) {
2132 MapListRequirementDataDefinition reqByInstance = fullFilledRequirement.get(fromResInstanceUid);
2133 if (reqByInstance == null) {
2134 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement in fullfilled list for instance {} ", fromResInstanceUid);
2135 return StorageOperationStatus.GENERAL_ERROR;
2137 if (null == hereIsTheKey) {
2138 hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
2140 if (null == hereIsTheKey) {
2142 .addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement with id {} in fulfilled list for instance {} ", relation.getRequirementId(),
2143 fromResInstanceUid);
2144 return StorageOperationStatus.GENERAL_ERROR;
2146 ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
2147 Iterator<RequirementDataDefinition> iterator = reqByType.getListToscaDataDefinition().iterator();
2148 boolean found = false;
2149 while (iterator.hasNext()) {
2150 RequirementDataDefinition req = iterator.next();
2151 if (req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId()
2152 .equals(relation.getRequirementId())) {
2155 // return to calculated list
2156 String leftOccurrences = req.getLeftOccurrences();
2157 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2159 req.setLeftOccurrences(String.valueOf(leftIntValue));
2160 MapListRequirementDataDefinition mapListReqDataDef = calculatedRequirement.get(fromResInstanceUid);
2161 if (mapListReqDataDef == null) {
2162 mapListReqDataDef = new MapListRequirementDataDefinition();
2164 ListRequirementDataDefinition findByKey = mapListReqDataDef.findByKey(hereIsTheKey);
2165 if (findByKey == null) {
2166 findByKey = new ListRequirementDataDefinition();
2167 mapListReqDataDef.put(hereIsTheKey, findByKey);
2170 if (relationship != null) {
2171 relationship.setRequirement(req);
2178 .addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey,
2179 relation.getRequirementOwnerId(), fromResInstanceUid);
2180 return StorageOperationStatus.GENERAL_ERROR;
2182 return StorageOperationStatus.OK;
2185 public StorageOperationStatus updateCustomizationUUID(String componentInstanceId, CompositionDataDefinition compositionDataDefinition) {
2186 ComponentInstanceDataDefinition componentInstance = compositionDataDefinition.getComponentInstances().get(componentInstanceId);
2187 if (componentInstance == null) {
2189 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch component instance by id {} from map of instances ", componentInstanceId);
2190 return StorageOperationStatus.NOT_FOUND;
2192 UUID uuid = UUID.randomUUID();
2193 componentInstance.setCustomizationUUID(uuid.toString());
2194 return StorageOperationStatus.OK;
2197 public <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectInstancesInContainer(
2198 String fromResInstanceUid, String toResInstanceUid, RelationshipInfo relationPair, boolean originUI,
2199 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement,
2200 Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty, Map<String, MapListRequirementDataDefinition> fullfilledRequirement,
2201 CompositionDataDefinition compositionDataDefinition, String containerId) {
2202 String requirement = relationPair.getRequirement();
2203 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
2204 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2205 "Going to associate resource instance {} to resource instance {} under component {}. Requirement is {}.", fromResInstanceUid,
2206 toResInstanceUid, containerId, requirement);
2207 ComponentInstanceDataDefinition fromResourceInstData = componentInstances.get(fromResInstanceUid);
2208 if (fromResourceInstData == null) {
2209 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find from resource instance {}.", fromResInstanceUid);
2210 return Either.right(StorageOperationStatus.NOT_FOUND);
2212 ComponentInstanceDataDefinition toResourceInstData = componentInstances.get(toResInstanceUid);
2213 if (toResourceInstData == null) {
2214 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find to resource instance {}.", toResInstanceUid);
2215 return Either.right(StorageOperationStatus.NOT_FOUND);
2217 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> reqVsCap = connectRequirementVsCapability(fromResourceInstData,
2218 toResourceInstData, relationPair, originUI, calculatedCapabilty, calculatedRequirement, fullfilledCapabilty, fullfilledRequirement,
2220 if (reqVsCap.isRight()) {
2221 StorageOperationStatus status = reqVsCap.right().value();
2222 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2223 "Failed to connect requirement {} between resource instance {} to resource instance {}. status is {}", requirement,
2224 fromResInstanceUid, toResInstanceUid, status);
2225 return Either.right(status);
2227 Map<JsonPresentationFields, T> relationship = reqVsCap.left().value();
2228 // add to json new relations
2229 compositionDataDefinition.addRelation(((RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP)).getUniqueId(),
2230 (RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP));
2231 return Either.left(relationship);
2234 private Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedCapability(
2235 GraphVertex containerV, EdgeLabelEnum capLabel) {
2236 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, JanusGraphOperationStatus> calculatedCapabiltyEither = getDataAndVertexFromGraph(
2237 containerV, capLabel);
2238 if (calculatedCapabiltyEither.isRight()) {
2239 JanusGraphOperationStatus error = calculatedCapabiltyEither.right().value();
2241 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilties for container {}.", containerV.getUniqueId(), error);
2242 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
2244 Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>> calculatedCapabilty = calculatedCapabiltyEither.left().value();
2245 return Either.left(calculatedCapabilty);
2248 private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedRequirement(
2249 GraphVertex containerV, EdgeLabelEnum reqLabel) {
2250 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, JanusGraphOperationStatus> calculatedRequirementEither = getDataAndVertexFromGraph(
2251 containerV, reqLabel);
2252 if (calculatedRequirementEither.isRight()) {
2253 JanusGraphOperationStatus error = calculatedRequirementEither.right().value();
2255 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for container {}.", containerV.getUniqueId(),
2257 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
2259 Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>> calculatedRequirement = calculatedRequirementEither.left().value();
2260 return Either.left(calculatedRequirement);
2263 @SuppressWarnings("unchecked")
2264 private <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectRequirementVsCapability(
2265 ComponentInstanceDataDefinition fromResInstance, ComponentInstanceDataDefinition toResInstance, RelationshipInfo relationPair,
2266 boolean originUI, Map<String, MapListCapabilityDataDefinition> calculatedCapabilty,
2267 Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty,
2268 Map<String, MapListRequirementDataDefinition> fullfilledRequirement, String containerId) {
2269 String type = relationPair.getRelationship().getType();
2271 String toInstId = toResInstance.getUniqueId();
2272 MapListCapabilityDataDefinition mapListCapabilityDataDefinition = calculatedCapabilty.get(toInstId);
2273 Map<JsonPresentationFields, T> capReqRelationship = new EnumMap<>(JsonPresentationFields.class);
2274 if (mapListCapabilityDataDefinition == null) {
2276 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for instance {} in container {}.", toInstId,
2278 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2280 ListCapabilityDataDefinition listCapabilityDataDefinition = mapListCapabilityDataDefinition.getMapToscaDataDefinition().get(type);
2281 if (listCapabilityDataDefinition == null) {
2283 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for type {} for instance {} in container {}.", type,
2284 toInstId, containerId);
2285 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2287 CapabilityDataDefinition capabilityForRelation = null;
2288 Iterator<CapabilityDataDefinition> iteratorCap = listCapabilityDataDefinition.getListToscaDataDefinition().iterator();
2289 while (iteratorCap.hasNext()) {
2290 CapabilityDataDefinition cap = iteratorCap.next();
2291 if (cap.getUniqueId().equals(relationPair.getCapabilityUid()) && cap.getOwnerId().equals(relationPair.getCapabilityOwnerId())) {
2292 capabilityForRelation = cap;
2293 capReqRelationship.put(JsonPresentationFields.CAPABILITY, (T) capabilityForRelation);
2294 String leftOccurrences = cap.getLeftOccurrences();
2295 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
2296 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2297 if (leftIntValue > 0) {
2299 capabilityForRelation.setLeftOccurrences(String.valueOf(leftIntValue));
2300 if (leftIntValue == 0) {
2301 // remove from calculated
2302 iteratorCap.remove();
2303 // move to fulfilled
2304 MapListCapabilityDataDefinition mapListCapabiltyFullFilledInst = fullfilledCapabilty.get(toInstId);
2305 if (mapListCapabiltyFullFilledInst == null) {
2306 mapListCapabiltyFullFilledInst = new MapListCapabilityDataDefinition();
2307 fullfilledCapabilty.put(toInstId, mapListCapabiltyFullFilledInst);
2309 ListCapabilityDataDefinition listCapabilityFull = mapListCapabiltyFullFilledInst.findByKey(type);
2310 if (listCapabilityFull == null) {
2311 listCapabilityFull = new ListCapabilityDataDefinition();
2312 mapListCapabiltyFullFilledInst.put(type, listCapabilityFull);
2314 listCapabilityFull.add(capabilityForRelation);
2318 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences capabilty {} to {} in container {}.",
2319 capabilityForRelation.getType(), toInstId, containerId);
2320 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2325 if (capabilityForRelation == null) {
2327 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch capabilty for type {} for instance {} in container {}.", type, toInstId,
2329 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2332 String fromInstId = fromResInstance.getUniqueId();
2333 MapListRequirementDataDefinition mapListRequirementDataDefinition = calculatedRequirement.get(fromInstId);
2334 if (mapListRequirementDataDefinition == null) {
2336 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for instance {} in container {}.", fromInstId,
2338 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2340 ListRequirementDataDefinition listRequirementDataDefinition = mapListRequirementDataDefinition.getMapToscaDataDefinition().get(type);
2341 if (listRequirementDataDefinition == null) {
2343 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for type {} for instance {} in container {}.", type,
2344 fromInstId, containerId);
2345 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2347 RequirementDataDefinition requirementForRelation = null;
2348 Iterator<RequirementDataDefinition> iteratorReq = listRequirementDataDefinition.getListToscaDataDefinition().iterator();
2349 while (iteratorReq.hasNext()) {
2350 RequirementDataDefinition req = iteratorReq.next();
2351 if (req.getUniqueId().equals(relationPair.getRequirementUid()) && req.getOwnerId().equals(relationPair.getRequirementOwnerId())) {
2352 requirementForRelation = req;
2353 capReqRelationship.put(JsonPresentationFields.REQUIREMENT, (T) requirementForRelation);
2354 String leftOccurrences = req.getLeftOccurrences();
2355 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
2356 Integer leftIntValue = Integer.parseInt(leftOccurrences);
2357 if (leftIntValue > 0) {
2359 req.setLeftOccurrences(String.valueOf(leftIntValue));
2360 if (leftIntValue == 0) {
2361 // remove from calculated
2362 iteratorReq.remove();
2363 // move to fulfilled
2364 MapListRequirementDataDefinition mapListRequirementFullFilledInst = fullfilledRequirement.get(fromInstId);
2365 if (mapListRequirementFullFilledInst == null) {
2366 mapListRequirementFullFilledInst = new MapListRequirementDataDefinition();
2367 fullfilledRequirement.put(fromInstId, mapListRequirementFullFilledInst);
2369 ListRequirementDataDefinition listRequirementFull = mapListRequirementFullFilledInst.findByKey(type);
2370 if (listRequirementFull == null) {
2371 listRequirementFull = new ListRequirementDataDefinition();
2372 mapListRequirementFullFilledInst.put(type, listRequirementFull);
2374 listRequirementFull.add(requirementForRelation);
2378 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences requirement {} from {} to {} in container {}.",
2379 requirementForRelation.getCapability(), fromInstId, toInstId, containerId);
2380 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2385 if (requirementForRelation == null) {
2387 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch requirement for type {} for instance {} in container {}.", type, toInstId,
2389 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2391 if (!capabilityForRelation.getType().equals(requirementForRelation.getCapability())) {
2393 .addRecordToLog(log, LogLevelEnum.DEBUG, "No macth for capability from type {} and requirement {} from {} to {} in container {}.",
2394 capabilityForRelation.getType(), requirementForRelation.getCapability(), fromInstId, toInstId, containerId);
2395 return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2397 RelationshipInstDataDefinition relationshipTypeData = buildRelationshipInstData(fromInstId, toInstId, relationPair, originUI);
2398 if (requirementForRelation.getRelationship() != null) {
2399 relationshipTypeData.setType(requirementForRelation.getRelationship());
2401 capReqRelationship.put(JsonPresentationFields.RELATIONSHIP, (T) relationshipTypeData);
2402 return Either.left(capReqRelationship);
2405 private RelationshipInstDataDefinition buildRelationshipInstData(String fromResInstanceUid, String toInstId, RelationshipInfo relationPair,
2407 RelationshipInstDataDefinition relationshipInstData = new RelationshipInstDataDefinition();
2408 relationshipInstData.setUniqueId(UniqueIdBuilder.buildRelationsipInstInstanceUid(fromResInstanceUid, toInstId));
2409 relationshipInstData.setType(relationPair.getRelationship().getType());
2410 Long creationDate = System.currentTimeMillis();
2411 relationshipInstData.setCreationTime(creationDate);
2412 relationshipInstData.setModificationTime(creationDate);
2413 relationshipInstData.setCapabilityOwnerId(relationPair.getCapabilityOwnerId());
2414 relationshipInstData.setRequirementOwnerId(relationPair.getRequirementOwnerId());
2415 relationshipInstData.setCapabilityId(relationPair.getCapabilityUid());
2416 relationshipInstData.setRequirementId(relationPair.getRequirementUid());
2417 relationshipInstData.setFromId(fromResInstanceUid);
2418 relationshipInstData.setToId(toInstId);
2419 relationshipInstData.setRequirement(relationPair.getRequirement());
2420 relationshipInstData.setCapability(relationPair.getCapability());
2421 relationshipInstData.setOriginUI(originUI);
2422 return relationshipInstData;
2425 public <T extends Component> Map<String, ComponentInstanceDataDefinition> associateComponentInstancesToComponent(Component containerComponent,
2426 Map<ComponentInstance, T> componentInstanceTMap,
2427 GraphVertex containerVertex,
2428 boolean allowDeleted,
2429 boolean isUpdateCsar) {
2430 String containerId = containerComponent.getUniqueId();
2431 Map<String, ComponentInstanceDataDefinition> instancesJsonData;
2432 Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
2433 if (!validateInstanceNames(componentInstanceTMap)) {
2434 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2436 if (!allowDeleted && !validateDeletedResources(componentInstanceTMap)) {
2437 throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2439 instancesJsonData = convertToComponentInstanceDataDefinition(componentInstanceTMap, containerId, isUpdateCsar);
2440 if (MapUtils.isNotEmpty(instancesJsonData)) {
2441 containerVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
2442 Map<String, CompositionDataDefinition> compositions = new HashMap<>();
2443 CompositionDataDefinition composition = new CompositionDataDefinition();
2444 composition.setComponentInstances(instancesJsonData);
2445 compositions.put(JsonConstantKeysEnum.COMPOSITION.getValue(), composition);
2446 containerVertex.setJson(compositions);
2447 updateElement = janusGraphDao.updateVertex(containerVertex);
2448 if (updateElement.isRight()) {
2449 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new component instances. ",
2450 containerComponent.getName());
2451 throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
2454 if (updateElement != null) {
2455 GraphVertex vertexC = updateElement.left().value();
2456 instancesJsonData.entrySet().forEach(i -> createInstanceEdge(vertexC, i.getValue()));
2458 return instancesJsonData;
2461 private <T extends Component> Map<String, ComponentInstanceDataDefinition> convertToComponentInstanceDataDefinition(
2462 Map<ComponentInstance, T> componentInstanceTMap, String containerId, boolean isUpdateCsar) {
2463 Map<String, ComponentInstanceDataDefinition> instances = new HashMap<>();
2464 for (Entry<ComponentInstance, T> entry : componentInstanceTMap.entrySet()) {
2465 ComponentInstanceDataDefinition instance = buildComponentInstanceDataDefinition(entry.getKey(), containerId, null,
2466 !isUpdateCsar || entry.getKey().isCreatedFromCsar(), ModelConverter.convertToToscaElement(entry.getValue()));
2467 instances.put(instance.getUniqueId(), instance);
2472 private <T extends Component> boolean validateDeletedResources(Map<ComponentInstance, T> resourcesInstancesMap) {
2473 boolean result = true;
2474 for (Component component : resourcesInstancesMap.values()) {
2475 if (component.getIsDeleted() != null && component.getIsDeleted()) {
2477 .addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance. ", component.getName());
2485 private <T extends Component> boolean validateInstanceNames(Map<ComponentInstance, T> resourcesInstancesMap) {
2486 boolean result = true;
2487 Set<String> names = new HashSet<>();
2488 for (ComponentInstance instance : resourcesInstancesMap.keySet()) {
2489 if (StringUtils.isEmpty(instance.getName())) {
2490 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component instance {} name is empty. Cannot add component instance. ",
2491 instance.getUniqueId());
2494 } else if (names.contains(instance.getName())) {
2496 .addRecordToLog(log, LogLevelEnum.DEBUG, "Component instance with the name {} already exsists. Cannot add component instance. ",
2497 instance.getName());
2501 names.add(instance.getName());
2507 public StorageOperationStatus addDeploymentArtifactsToInstance(String toscaElementId, String instanceId,
2508 Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2509 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS,
2510 VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS);
2513 public StorageOperationStatus addInformationalArtifactsToInstance(String toscaElementId, String instanceId,
2514 Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2515 return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INSTANCE_ARTIFACTS,
2516 VertexTypeEnum.INSTANCE_ARTIFACTS);
2519 public StorageOperationStatus addArtifactsToInstance(String toscaElementId, String instanceId,
2520 Map<String, ArtifactDataDefinition> instDeplArtifacts, EdgeLabelEnum edgeLabel,
2521 VertexTypeEnum vertexType) {
2522 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao.getVertexById(toscaElementId, JsonParseFlagEnum.NoParse);
2523 if (metadataVertex.isRight()) {
2524 JanusGraphOperationStatus status = metadataVertex.right().value();
2525 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2526 status = JanusGraphOperationStatus.INVALID_ID;
2528 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2530 MapArtifactDataDefinition instArtifacts = new MapArtifactDataDefinition(instDeplArtifacts);
2531 return addToscaDataDeepElementsBlockToToscaElement(metadataVertex.left().value(), edgeLabel, vertexType, instArtifacts, instanceId);
2534 @SuppressWarnings({"unchecked"})
2535 public StorageOperationStatus generateCustomizationUUIDOnInstance(String componentId, String instanceId) {
2536 Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.ParseAll);
2537 if (metadataVertex.isRight()) {
2538 JanusGraphOperationStatus status = metadataVertex.right().value();
2539 if (status == JanusGraphOperationStatus.NOT_FOUND) {
2540 status = JanusGraphOperationStatus.INVALID_ID;
2542 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2544 GraphVertex metaVertex = metadataVertex.left().value();
2545 Map<String, CompositionDataDefinition> json = (Map<String, CompositionDataDefinition>) metaVertex.getJson();
2546 CompositionDataDefinition compositionDataDefinition = json.get(JsonConstantKeysEnum.COMPOSITION.getValue());
2547 StorageOperationStatus status = updateCustomizationUUID(instanceId, compositionDataDefinition);
2548 if (status != StorageOperationStatus.OK) {
2549 log.debug("Failed to update customization UUID for instance {} in component {} error {}", instanceId, componentId, status);
2552 Either<GraphVertex, JanusGraphOperationStatus> updateVertex = janusGraphDao.updateVertex(metaVertex);
2553 if (updateVertex.isRight()) {
2554 log.debug("Failed to update vertex of component {} error {}", componentId, updateVertex.right().value());
2555 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateVertex.right().value());
2557 return StorageOperationStatus.OK;
2560 public StorageOperationStatus generateCustomizationUUIDOnInstanceGroup(String componentId, String instanceId, List<String> groupInstances) {
2561 if (groupInstances != null) {
2562 Either<Map<String, MapGroupsDataDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(componentId,
2563 EdgeLabelEnum.INST_GROUPS);
2564 if (dataFromGraph.isRight()) {
2565 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(dataFromGraph.right().value());
2567 MapGroupsDataDefinition grInstPerInstance = dataFromGraph.left().value().get(instanceId);
2568 if (grInstPerInstance == null) {
2569 log.debug("No instance groups for instance {} in component {}", instanceId, componentId);
2570 return StorageOperationStatus.NOT_FOUND;
2572 for (String instGroupForUpdate : groupInstances) {
2573 GroupInstanceDataDefinition groupInst = grInstPerInstance.findByKey(instGroupForUpdate);
2574 if (groupInst == null) {
2575 log.debug("No group instance {} in group list for instance {} in component {}", instGroupForUpdate, instanceId, componentId);
2578 UUID uuid = UUID.randomUUID();
2579 groupInst.setCustomizationUUID(uuid.toString());
2582 return StorageOperationStatus.OK;
2585 public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstance componentInstance,
2586 List<GroupInstance> groupInstances) {
2587 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS,
2588 new MapDataDefinition<>(groupInstances.stream().collect(Collectors.toMap(GroupInstanceDataDefinition::getName, gi -> gi))),
2589 componentInstance.getUniqueId());
2592 public StorageOperationStatus addDeploymentArtifactsToComponentInstance(Component containerComponent, ComponentInstance componentInstance,
2593 Map<String, ArtifactDefinition> deploymentArtifacts) {
2594 return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS,
2595 VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, new MapDataDefinition<>(deploymentArtifacts), componentInstance.getUniqueId());
2598 public StorageOperationStatus updateComponentInstanceProperty(Component containerComponent, String componentInstanceId,
2599 ComponentInstanceProperty property) {
2600 List<String> pathKeys = new ArrayList<>();
2601 pathKeys.add(componentInstanceId);
2602 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES,
2603 VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2606 public StorageOperationStatus updateComponentInstanceCapabilityProperty(Component containerComponent, String componentInstanceId,
2607 String capabilityPropertyKey, ComponentInstanceProperty property) {
2608 List<String> pathKeys = new ArrayList<>();
2609 pathKeys.add(componentInstanceId);
2610 pathKeys.add(capabilityPropertyKey);
2611 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
2612 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2615 public StorageOperationStatus overrideComponentCapabilitiesProperties(Component containerComponent,
2616 Map<String, MapCapabilityProperty> capabilityPropertyMap) {
2617 return overrideToscaDataOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilityPropertyMap);
2620 public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId,
2621 ComponentInstanceProperty property) {
2622 List<String> pathKeys = new ArrayList<>();
2623 pathKeys.add(componentInstanceId);
2624 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES,
2625 property, pathKeys, JsonPresentationFields.NAME);
2628 public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId,
2629 List<ComponentInstanceProperty> properties) {
2630 List<String> pathKeys = new ArrayList<>();
2631 pathKeys.add(componentInstanceId);
2632 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES,
2633 VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME);
2636 public StorageOperationStatus updateComponentInstanceAttributes(final Component containerComponent, final String componentInstanceId,
2637 final List<ComponentInstanceAttribute> attributes) {
2638 final List<String> pathKeys = Arrays.asList(componentInstanceId);
2639 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2640 VertexTypeEnum.INST_ATTRIBUTES, attributes, pathKeys, JsonPresentationFields.NAME);
2643 public StorageOperationStatus updateComponentInstanceAttribute(final Component containerComponent, final String componentInstanceId,
2644 final ComponentInstanceAttribute attribute) {
2645 final List<String> pathKeys = Arrays.asList(componentInstanceId);
2646 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2647 VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME);
2650 public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId,
2651 ComponentInstanceAttribute attribute) {
2652 List<String> pathKeys = new ArrayList<>();
2653 pathKeys.add(componentInstanceId);
2654 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES,
2655 attribute, pathKeys, JsonPresentationFields.NAME);
2658 public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId,
2659 ComponentInstanceInput property) {
2660 List<String> pathKeys = new ArrayList<>();
2661 pathKeys.add(componentInstanceId);
2662 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS,
2663 property, pathKeys, JsonPresentationFields.NAME);
2666 public StorageOperationStatus updateComponentInstanceOutput(Component containerComponent, String componentInstanceId,
2667 ComponentInstanceOutput property) {
2668 List<String> pathKeys = new ArrayList<>();
2669 pathKeys.add(componentInstanceId);
2670 return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS,
2671 property, pathKeys, JsonPresentationFields.NAME);
2674 public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId,
2675 List<ComponentInstanceInput> properties) {
2676 List<String> pathKeys = new ArrayList<>();
2677 pathKeys.add(componentInstanceId);
2678 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS,
2679 properties, pathKeys, JsonPresentationFields.NAME);
2682 public StorageOperationStatus updateComponentInstanceOutputs(Component containerComponent, String componentInstanceId,
2683 List<ComponentInstanceOutput> properties) {
2684 List<String> pathKeys = new ArrayList<>();
2685 pathKeys.add(componentInstanceId);
2686 return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS,
2687 properties, pathKeys, JsonPresentationFields.NAME);
2690 public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId,
2691 ComponentInstanceInput property) {
2692 List<String> pathKeys = new ArrayList<>();
2693 pathKeys.add(componentInstanceId);
2694 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS,
2695 property, pathKeys, JsonPresentationFields.NAME);
2698 public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId,
2699 ComponentInstanceOutput property) {
2700 List<String> pathKeys = new ArrayList<>() {
2702 pathKeys.add(componentInstanceId);
2703 return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS,
2704 property, pathKeys, JsonPresentationFields.NAME);
2707 public StorageOperationStatus createInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2708 String instUniqueId = componentInstance.getUniqueId();
2709 // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2710 StorageOperationStatus result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(),
2711 instUniqueId).either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2712 if (result == StorageOperationStatus.OK && componentInstance.getIsProxy()) {
2713 // create edge between container and service origin
2714 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2715 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2720 public StorageOperationStatus createAllottedOfEdge(String componentId, String instanceId, String serviceUUID) {
2721 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentId);
2722 if (vertexById.isRight()) {
2723 log.debug("Failed to fetch component metadata vertex for id {} error {}", componentId, vertexById.right().value());
2724 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(vertexById.right().value());
2726 GraphVertex metadataVertex = vertexById.left().value();
2727 EnumMap<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
2728 props.put(GraphPropertyEnum.UUID, serviceUUID);
2729 props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
2730 EnumMap<GraphPropertyEnum, Object> hasNot = new EnumMap<>(GraphPropertyEnum.class);
2731 hasNot.put(GraphPropertyEnum.IS_DELETED, true);
2732 Either<List<GraphVertex>, JanusGraphOperationStatus> byCriteria = janusGraphDao
2733 .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, props, hasNot, JsonParseFlagEnum.ParseMetadata);
2734 if (byCriteria.isRight()) {
2735 log.debug("Failed to fetch vertex by criteria {} error {}", props, byCriteria.right().value());
2736 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(byCriteria.right().value());
2738 List<GraphVertex> vertecies = byCriteria.left().value();
2739 StorageOperationStatus result = StorageOperationStatus.OK;
2740 if (vertecies != null) {
2741 GraphVertex serviceVertex = vertecies.get(0);
2742 //remove previous edges
2743 log.debug("Try to create or update edge between resource {} and service {} ", metadataVertex, serviceVertex.getUniqueId());
2744 // create edge between container and service reference
2745 result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.ALLOTTED_OF, serviceVertex.getUniqueId(), instanceId)
2746 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2751 public StorageOperationStatus removeInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2752 String instUniqueId = componentInstance.getUniqueId();
2753 // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2754 StorageOperationStatus result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(),
2755 instUniqueId).either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2756 if (componentInstance.getIsProxy()) {
2757 // create edge between container and service origin
2758 result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2759 .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2764 private Either<GraphVertex, JanusGraphOperationStatus> createOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel,
2765 String componentUid, String instUniqueId) {
2766 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2767 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2768 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties).left()
2769 .bind(v -> addInstanceToPropertyOnEdge(instUniqueId, v, metadataVertex)).right()
2770 .bind(s -> createInstanceEdge(metadataVertex, edgeLabel, componentUid, instUniqueId, s));
2773 private Either<GraphVertex, JanusGraphOperationStatus> removeOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel,
2774 String componentUid, String instUniqueId) {
2775 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2776 properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2777 return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties).left()
2778 .bind(v -> removeInstanceFromPropertyOnEdge(instUniqueId, v, metadataVertex)).right()
2779 .map(err -> removeInstanceEdgeLogError(metadataVertex, edgeLabel, componentUid, err));
2782 private Either<GraphVertex, JanusGraphOperationStatus> addInstanceToPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2783 // edge exist need to add instance id to list on edge's property
2784 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2785 if (property == null) {
2786 property = new ArrayList<>();
2788 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2789 if (!findFirst.isPresent()) {
2790 property.add(instUniqueId);
2793 String jsonArr = JsonParserUtils.toJson(property);
2794 log.debug("Update INSTANCES edge property with value {} ", jsonArr);
2795 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2796 } catch (IOException e) {
2797 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2798 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2800 return Either.left(metadataVertex);
2803 private Either<GraphVertex, JanusGraphOperationStatus> removeInstanceFromPropertyOnEdge(String instUniqueId, Edge edge,
2804 GraphVertex metadataVertex) {
2805 // edge exist need to add instance id to list on edge's property
2806 List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2807 if (property == null) {
2808 property = new ArrayList<>();
2810 Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2811 if (findFirst.isPresent()) {
2812 property.remove(instUniqueId);
2814 if (property.isEmpty()) {
2815 // For last instance need to remove edge
2819 String jsonArr = JsonParserUtils.toJson(property);
2820 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2821 } catch (IOException e) {
2822 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2823 return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2826 return Either.left(metadataVertex);
2829 private Either<GraphVertex, JanusGraphOperationStatus> createInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel,
2830 String componentUid, String instUniqueId,
2831 JanusGraphOperationStatus retrieveEdgeStatus) {
2832 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2834 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentUid);
2835 if (vertexById.isRight()) {
2838 GraphVertex originVertex = vertexById.left().value();
2839 Map<EdgePropertyEnum, Object> edgeProps = new EnumMap<>(EdgePropertyEnum.class);
2840 List<String> instList = new ArrayList<>();
2841 instList.add(instUniqueId);
2842 edgeProps.put(EdgePropertyEnum.INSTANCES, instList);
2843 log.debug("Create new edge {} between {} and {} and properties {} ", edgeLabel, metadataVertex.getUniqueId(), originVertex.getUniqueId(),
2845 JanusGraphOperationStatus edgeResult = janusGraphDao.createEdge(metadataVertex, originVertex, edgeLabel, edgeProps);
2846 return edgeResult == JanusGraphOperationStatus.OK ? Either.left(metadataVertex) : Either.right(edgeResult);
2849 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2850 return Either.right(retrieveEdgeStatus);
2853 private JanusGraphOperationStatus removeInstanceEdgeLogError(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid,
2854 JanusGraphOperationStatus retrieveEdgeStatus) {
2855 if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2856 log.debug("No edge {} to remove between container {} and origin {}", edgeLabel, metadataVertex.getUniqueId(), componentUid);
2859 log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2861 return retrieveEdgeStatus;
2864 public void removeAllAllotedEdges(String uniqueId) {
2865 Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(uniqueId);
2866 if (vertexById.isLeft()) {
2867 GraphVertex originVertex = vertexById.left().value();
2868 JanusGraphVertex vertex = originVertex.getVertex();
2869 Iterator<Edge> edges = vertex.edges(Direction.OUT, EdgeLabelEnum.ALLOTTED_OF.name());
2870 while (edges != null && edges.hasNext()) {
2871 Edge edge = edges.next();