Implement Attributes/Outputs BE (part 2)
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / jsonjanusgraph / operations / NodeTemplateOperation.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
22
23 import fj.data.Either;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.EnumMap;
28 import java.util.HashMap;
29 import java.util.HashSet;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Map.Entry;
34 import java.util.Optional;
35 import java.util.Set;
36 import java.util.UUID;
37 import java.util.function.BiPredicate;
38 import java.util.stream.Collectors;
39 import org.apache.commons.collections.CollectionUtils;
40 import org.apache.commons.collections.MapUtils;
41 import org.apache.commons.lang.StringUtils;
42 import org.apache.commons.lang3.tuple.ImmutablePair;
43 import org.apache.commons.lang3.tuple.Pair;
44 import org.apache.tinkerpop.gremlin.structure.Direction;
45 import org.apache.tinkerpop.gremlin.structure.Edge;
46 import org.janusgraph.core.JanusGraphVertex;
47 import org.openecomp.sdc.be.config.BeEcompErrorManager;
48 import org.openecomp.sdc.be.config.ConfigurationManager;
49 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
50 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
51 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
52 import org.openecomp.sdc.be.dao.jsongraph.types.EdgePropertyEnum;
53 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
54 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
55 import org.openecomp.sdc.be.dao.jsongraph.utils.JsonParserUtils;
56 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
57 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
58 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
59 import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition;
60 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
61 import org.openecomp.sdc.be.datatypes.elements.GroupInstanceDataDefinition;
62 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
63 import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
64 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
65 import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
66 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
67 import org.openecomp.sdc.be.datatypes.elements.MapAttributesDataDefinition;
68 import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty;
69 import org.openecomp.sdc.be.datatypes.elements.MapDataDefinition;
70 import org.openecomp.sdc.be.datatypes.elements.MapGroupsDataDefinition;
71 import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
72 import org.openecomp.sdc.be.datatypes.elements.MapListCapabilityDataDefinition;
73 import org.openecomp.sdc.be.datatypes.elements.MapListRequirementDataDefinition;
74 import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
75 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
76 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
77 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
78 import org.openecomp.sdc.be.datatypes.elements.RelationshipInstDataDefinition;
79 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
80 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
81 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
82 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
83 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
84 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
85 import org.openecomp.sdc.be.model.ArtifactDefinition;
86 import org.openecomp.sdc.be.model.CapabilityDefinition;
87 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
88 import org.openecomp.sdc.be.model.Component;
89 import org.openecomp.sdc.be.model.ComponentInstance;
90 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
91 import org.openecomp.sdc.be.model.ComponentInstanceInput;
92 import org.openecomp.sdc.be.model.ComponentInstanceOutput;
93 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
94 import org.openecomp.sdc.be.model.ComponentParametersView;
95 import org.openecomp.sdc.be.model.GroupDefinition;
96 import org.openecomp.sdc.be.model.GroupInstance;
97 import org.openecomp.sdc.be.model.InputDefinition;
98 import org.openecomp.sdc.be.model.PropertyDefinition;
99 import org.openecomp.sdc.be.model.RelationshipImpl;
100 import org.openecomp.sdc.be.model.RelationshipInfo;
101 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
102 import org.openecomp.sdc.be.model.RequirementDefinition;
103 import org.openecomp.sdc.be.model.User;
104 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.NodeType;
105 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
106 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
107 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElementTypeEnum;
108 import org.openecomp.sdc.be.model.jsonjanusgraph.enums.JsonConstantKeysEnum;
109 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
110 import org.openecomp.sdc.be.model.operations.StorageException;
111 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
112 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
113 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
114 import org.openecomp.sdc.be.ui.model.OperationUi;
115 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
116 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
117 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
118 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
119 import org.openecomp.sdc.common.log.elements.LoggerSupportability;
120 import org.openecomp.sdc.common.log.enums.LogLevel;
121 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
122 import org.openecomp.sdc.common.log.enums.StatusCode;
123 import org.openecomp.sdc.common.log.wrappers.Logger;
124 import org.openecomp.sdc.common.util.ValidationUtils;
125
126 @org.springframework.stereotype.Component("node-template-operation")
127 public class NodeTemplateOperation extends BaseOperation {
128     private static final String FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR = "Failed to fetch container vertex {} error {}";
129     private static final String FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE = "Failed to update topology template {} with new component instance {}. ";
130     private static final String ARTIFACT_PLACEHOLDER_TYPE = "type";
131     private static final String ARTIFACT_PLACEHOLDER_DISPLAY_NAME = "displayName";
132     private static final Object ARTIFACT_PLACEHOLDER_DESCRIPTION = "description";
133     static final String HEAT_ENV_NAME = "heatEnv";
134     static final String HEAT_VF_ENV_NAME = "VfHeatEnv";
135     static final String HEAT_ENV_SUFFIX = "env";
136     private static Integer defaultHeatTimeout;
137     public static final Integer NON_HEAT_TIMEOUT = 0;
138
139     private static final Logger log = Logger.getLogger(NodeTemplateOperation.class.getName());
140     private static final LoggerSupportability loggerSupportability=LoggerSupportability.getLogger(NodeTemplateOperation.class.getName());
141     public NodeTemplateOperation() {
142         defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getDefaultMinutes();
143         if ((defaultHeatTimeout == null) || (defaultHeatTimeout < 1)) {
144             defaultHeatTimeout = 60;
145         }
146     }
147
148     public static Integer getDefaultHeatTimeout() {
149         return defaultHeatTimeout;
150     }
151
152     Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceToTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, String instanceNumberSuffix, ComponentInstance componentInstance,
153                                                                                                                           boolean allowDeleted, User user) {
154
155         Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
156         Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceRes = null;
157         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to create component instance {} in component {}", componentInstance, container.getUniqueId());
158         ComponentInstanceDataDefinition componentInstanceData = null;
159         Either<String, StorageOperationStatus> newInstanceNameRes = null;
160
161         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
162             .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseJson);
163         if (metadataVertex.isRight()) {
164             JanusGraphOperationStatus status = metadataVertex.right().value();
165             if (status == JanusGraphOperationStatus.NOT_FOUND) {
166                 status = JanusGraphOperationStatus.INVALID_ID;
167             }
168             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
169         }
170
171         if (result == null) {
172
173             newInstanceNameRes = buildValidateInstanceName(container, originToscaElement, componentInstance, instanceNumberSuffix);
174             if (newInstanceNameRes.isRight()) {
175                 result = Either.right(newInstanceNameRes.right().value());
176             }
177         }
178         if (result == null) {
179             componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), newInstanceNameRes.left().value(), true, originToscaElement);
180
181             addComponentInstanceRes = addComponentInstanceToTopologyTemplate(container, originToscaElement, componentInstanceData, metadataVertex.left().value(), allowDeleted, user);
182
183             if (addComponentInstanceRes.isRight()) {
184                 StorageOperationStatus status = addComponentInstanceRes.right().value();
185                 if (status == StorageOperationStatus.NOT_FOUND) {
186                     status = StorageOperationStatus.INVALID_ID;
187                 }
188                 result = Either.right(status);
189             }
190             final TopologyTemplate updatedContainer = addComponentInstanceRes.left().value();
191             if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
192                 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
193                 result = addCapAndReqToProxyServiceInstance(updatedContainer, componentInstance, componentInstanceData);
194                 if(result.isRight()) {
195                     return result;
196                 }
197
198                 result = addServiceInstancePropertiesToProxyServiceInstance(updatedContainer, componentInstance);
199                 if(result.isRight()) {
200                   return result;
201                 }
202
203                 result = addServiceInstanceInputsToProxyServiceInstance(updatedContainer, componentInstance);
204                 if(result.isRight()) {
205                     return result;
206                 }
207             }
208             if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
209                 || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution
210                 || componentInstance.getOriginType() == OriginTypeEnum.VF
211                 || componentInstance.getOriginType() == OriginTypeEnum.VFC) {
212                 result = addComponentInstanceInterfacesToTopologyTemplate(updatedContainer, componentInstance);
213                 if(result.isRight()) {
214                     return result;
215                 }
216             }
217         }
218         if (result == null) {
219             result = Either.left(new ImmutablePair<>(addComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
220         }
221         return result;
222     }
223
224     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addCapAndReqToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance,
225                                                                                                                        ComponentInstanceDataDefinition componentInstanceData) {
226         Map<String, MapListCapabilityDataDefinition> calcCap = updatedContainer.getCalculatedCapabilities();
227         Map<String, MapListRequirementDataDefinition> calcReg = updatedContainer.getCalculatedRequirements();
228         Map<String, MapCapabilityProperty> calcCapProp = updatedContainer.getCalculatedCapabilitiesProperties();
229
230         Map<String, List<CapabilityDefinition>> additionalCap = componentInstance.getCapabilities();
231         Map<String, List<RequirementDefinition>> additionalReq = componentInstance.getRequirements();
232
233         MapListCapabilityDataDefinition allCalculatedCap = calcCap == null || !calcCap.containsKey(componentInstanceData.getUniqueId()) ? new MapListCapabilityDataDefinition() : calcCap.get(componentInstanceData.getUniqueId());
234         /******** capability ****************************/
235         StorageOperationStatus status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceData.getUniqueId());
236         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
237             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty  for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
238             return Either.right(status);
239         }
240
241         if (additionalCap != null && !additionalCap.isEmpty()) {
242
243             Map<String, ListCapabilityDataDefinition> serverCap = additionalCap.entrySet().stream()
244                     .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListCapabilityDataDefinition(en.getValue().stream().map(CapabilityDataDefinition::new).collect(Collectors.toList()))));
245
246             serverCap.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
247                 cap.addToPath(componentInstance.getUniqueId());
248                 allCalculatedCap.add(entryPerType.getKey(), cap);
249             }));
250
251             addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
252
253             /******** capability property ****************************/
254             status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
255                 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId());
256             if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
257                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
258                     "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ",
259                     componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
260                 return Either.right(status);
261             }
262
263             MapCapabilityProperty allCalculatedCapProp =
264                 calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty()
265                     : calcCapProp.get(componentInstanceData.getUniqueId());
266
267             additionalCap.forEach((s, caps) -> {
268                 if (caps != null && !caps.isEmpty()) {
269                     MapPropertiesDataDefinition dataToCreate;
270                     for (CapabilityDefinition cap : caps) {
271                         dataToCreate = new MapPropertiesDataDefinition();
272                         List<ComponentInstanceProperty> capPrps = cap.getProperties();
273                         if (capPrps != null) {
274                             for (ComponentInstanceProperty cip : capPrps) {
275                                 dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip));
276                             }
277                             StringBuilder sb = new StringBuilder(componentInstance.getUniqueId());
278                             sb.append(ModelConverter.CAP_PROP_DELIM);
279                             sb.append(cap.getOwnerId());
280                             sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName());
281                             allCalculatedCapProp.put(sb.toString(), dataToCreate);
282                         }
283                     }
284                 }
285             });
286             addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
287                 VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId());
288         }
289
290         /******** Requirements property ****************************/
291         if (additionalReq != null && !additionalReq.isEmpty()) {
292
293             MapListRequirementDataDefinition allCalculatedReq = calcReg == null || !calcReg.containsKey(componentInstanceData.getUniqueId()) ? new MapListRequirementDataDefinition() : calcReg.get(componentInstanceData.getUniqueId());
294             status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceData.getUniqueId());
295             if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
296                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated Requirements for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status);
297                 return Either.right(status);
298             }
299
300             Map<String, ListRequirementDataDefinition> serverReq = additionalReq.entrySet().stream()
301                     .collect(Collectors.toMap(Map.Entry::getKey, en -> new ListRequirementDataDefinition(en.getValue().stream().map(RequirementDataDefinition::new).collect(Collectors.toList()))));
302
303             serverReq.entrySet().forEach(entryPerType -> entryPerType.getValue().getListToscaDataDefinition().forEach(cap -> {
304                 cap.addToPath(componentInstance.getUniqueId());
305                 allCalculatedReq.add(entryPerType.getKey(), cap);
306             }));
307
308             addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
309
310         }
311
312         Either<ToscaElement, StorageOperationStatus> updatedComponentInstanceRes = topologyTemplateOperation.getToscaElement(updatedContainer.getUniqueId());
313         if (updatedComponentInstanceRes.isRight()) {
314             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", updatedContainer.getName(), componentInstance.getName());
315             Either.right(updatedComponentInstanceRes.right().value());
316         }
317         return Either.left(new ImmutablePair<>((TopologyTemplate) updatedComponentInstanceRes.left().value(), componentInstanceData.getUniqueId()));
318     }
319
320     private Either<String, StorageOperationStatus> buildValidateInstanceName(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance, String instanceNumberSuffix) {
321
322         Either<String, StorageOperationStatus> result = null;
323         String instanceName = componentInstance.getName();
324         if (StringUtils.isEmpty(instanceName) || instanceName.equalsIgnoreCase(originToscaElement.getName()) || componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
325             instanceName = buildComponentInstanceName(instanceNumberSuffix, instanceName);
326         } else if (!isUniqueInstanceName(container, componentInstance.getName())) {
327             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create component instance with name {} on component container {}. The instance with the same name already exists. ", componentInstance.getName(), container.getName());
328             result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
329         }
330         if (result == null) {
331             result = Either.left(instanceName);
332         }
333         return result;
334     }
335
336     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstancePropertiesToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
337
338         List<PropertyDefinition> propertiesList = componentInstance.getProperties();
339
340         if (propertiesList != null && !propertiesList.isEmpty()) {
341             Map<String, PropertyDataDefinition> propertiesMap = propertiesList.stream().map(PropertyDataDefinition::new)
342                                                                               .collect(Collectors.toMap(
343                                                                                       PropertyDataDefinition::getName, i -> i));
344             MapPropertiesDataDefinition instProperties = new MapPropertiesDataDefinition(propertiesMap);
345             Map<String, MapPropertiesDataDefinition> instPropertiesMap = new HashMap<>();
346             instPropertiesMap.put(componentInstance.getUniqueId(), instProperties);
347             updatedContainer.setInstProperties(instPropertiesMap);
348             Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
349                 .getVertexById(updatedContainer.getUniqueId(), JsonParseFlagEnum.NoParse);
350            if(getToscaElementRes.isLeft()){
351                deleteToscaDataDeepElementsBlockToToscaElement(getToscaElementRes.left().value(),  EdgeLabelEnum.INST_PROPERTIES,
352                        VertexTypeEnum.INST_PROPERTIES,  componentInstance.getUniqueId());
353            }
354             StorageOperationStatus status = addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
355                     EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, instProperties,
356                     componentInstance.getUniqueId());
357             if (status != StorageOperationStatus.OK) {
358                 return Either.right(status);
359             }
360
361
362         }
363         return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
364     }
365
366     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInputsToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
367
368         List<InputDefinition> inputsList = componentInstance.getInputs();
369
370         if (CollectionUtils.isNotEmpty(inputsList)) {
371             Map<String, PropertyDataDefinition> inputsMap = inputsList.stream().map(
372                     PropertyDataDefinition::new).collect(Collectors.toMap(PropertyDataDefinition::getName, i -> i));
373             MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(inputsMap);
374             Map<String, MapPropertiesDataDefinition> instInputsMap = new HashMap<>();
375             instInputsMap.put(componentInstance.getUniqueId(), instInputs);
376             updatedContainer.setInstInputs(instInputsMap);
377
378             StorageOperationStatus status =
379                     addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
380                             EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputs,
381                             componentInstance.getUniqueId());
382             if(status != StorageOperationStatus.OK) {
383                 return Either.right(status);
384             }
385         }
386
387         return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
388     }
389
390     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addComponentInstanceInterfacesToTopologyTemplate(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
391         Map<String, Object> interfaces = componentInstance.getInterfaces();
392
393         if(MapUtils.isNotEmpty(interfaces)){
394             Map<String, InterfaceDataDefinition> interfacesMap = interfaces.entrySet().stream().collect(Collectors.toMap(e -> ((InterfaceDataDefinition) e.getValue()).getUniqueId(), e -> (InterfaceDataDefinition) e.getValue()));
395             MapInterfaceDataDefinition instInterfaces = new MapInterfaceDataDefinition(interfacesMap);
396
397             Map<String, MapInterfaceDataDefinition> instInterfacesMap = new HashMap<>();
398             instInterfacesMap.put(componentInstance.getUniqueId(), instInterfaces);
399             updatedContainer.setComponentInstInterfaces(instInterfacesMap);
400
401             StorageOperationStatus status =
402                     addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
403                             EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instInterfaces,
404                             componentInstance.getUniqueId());
405
406             if(status != StorageOperationStatus.OK) {
407                 return Either.right(status);
408             }
409         }
410
411         return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
412     }
413
414     public Either<TopologyTemplate, StorageOperationStatus> addComponentInstanceToTopologyTemplate(
415             TopologyTemplate container, ToscaElement originToscaElement,
416             ComponentInstanceDataDefinition componentInstance, GraphVertex metadataVertex, boolean allowDeleted,
417             User user) {
418
419         Either<TopologyTemplate, StorageOperationStatus> result = null;
420         Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
421         String containerComponentId = container.getUniqueId();
422         CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to create component instance {} in component {}", componentInstance, containerComponentId);
423         String instOriginComponentId = componentInstance.getComponentUid();
424         Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
425
426         Boolean isDeleted = (Boolean) originToscaElement.getMetadataValue(JsonPresentationFields.IS_DELETED);
427
428         if (!allowDeleted && (isDeleted != null) && isDeleted) {
429             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance", instOriginComponentId);
430             result = Either.right(StorageOperationStatus.INVALID_ID);
431         }
432         Boolean isArchived = originToscaElement.isArchived();
433         if (isArchived != null && isArchived) {
434             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to create instance {}. Origin {} component is archived . ", componentInstance.getName(), originToscaElement.getName());
435             result = Either.right(StorageOperationStatus.COMPONENT_IS_ARCHIVED);
436         }
437
438         if (result == null) {
439             container.addComponentInstance(componentInstance);
440             metadataVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
441             topologyTemplateOperation.fillToscaElementVertexData(metadataVertex, container, JsonParseFlagEnum.ParseAll);
442             updateElement = janusGraphDao.updateVertex(metadataVertex);
443             if (updateElement.isRight()) {
444                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
445                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
446             }
447         }
448         if (result == null) {
449             Either<GraphVertex, StorageOperationStatus> addToscaDataRes = addComponentInstanceToscaDataToContainerComponent(originToscaElement, componentInstance, updateElement.left().value());
450             if (addToscaDataRes.isRight()) {
451                 result = Either.right(addToscaDataRes.right().value());
452             }
453         }
454         if (result == null) {
455             StorageOperationStatus createInstanceEdge = createInstanceEdge(metadataVertex, componentInstance);
456             result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
457         }
458
459         if (result == null) {
460             updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
461             if (updateContainerComponentRes.isRight()) {
462                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with new component instance {}. ", container.getName(), componentInstance.getName());
463                 result = Either.right(updateContainerComponentRes.right().value());
464             }
465         }
466         if (result == null) {
467             result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
468         }
469         return result;
470     }
471
472     public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ToscaElement originToscaElement, ComponentInstance componentInstance) {
473
474         Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
475         Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
476
477         String containerComponentId = container.getUniqueId();
478         CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstance, containerComponentId);
479         ComponentInstanceDataDefinition componentInstanceData = null;
480
481         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
482             .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
483         if (metadataVertex.isRight()) {
484             JanusGraphOperationStatus status = metadataVertex.right().value();
485             if (status == JanusGraphOperationStatus.NOT_FOUND) {
486                 status = JanusGraphOperationStatus.INVALID_ID;
487             }
488             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
489         }
490         if (result == null) {
491             componentInstanceData = buildComponentInstanceDataDefinition(componentInstance, container.getUniqueId(), componentInstance.getName(), false, originToscaElement);
492             container.addComponentInstance(componentInstanceData);
493             metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
494             topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
495             Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
496                 .updateVertex(metadataVertex.left().value());
497             if (updateElement.isRight()) {
498                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstance.getName());
499                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
500             }
501         }
502         if (result == null) {
503             updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
504             if (updateContainerComponentRes.isRight()) {
505                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} with updated component instance {}. ", container.getName(), componentInstance.getName());
506                 result = Either.right(updateContainerComponentRes.right().value());
507             }
508         }
509         if (result == null) {
510             result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceData.getUniqueId()));
511         }
512         return result;
513     }
514
515     public Either<TopologyTemplate, StorageOperationStatus> updateComponentInstanceMetadataOfTopologyTemplate(TopologyTemplate container, ComponentParametersView filter) {
516
517         Either<TopologyTemplate, StorageOperationStatus> result = null;
518         Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
519
520         String containerComponentId = container.getUniqueId();
521         CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata  of container component {}", containerComponentId);
522
523         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
524             .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
525         if (metadataVertex.isRight()) {
526             JanusGraphOperationStatus status = metadataVertex.right().value();
527             if (status == JanusGraphOperationStatus.NOT_FOUND) {
528                 status = JanusGraphOperationStatus.INVALID_ID;
529             }
530             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
531         }
532         if (result == null) {
533             metadataVertex.left().value().setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
534             topologyTemplateOperation.fillToscaElementVertexData(metadataVertex.left().value(), container, JsonParseFlagEnum.ParseAll);
535             Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao
536                 .updateVertex(metadataVertex.left().value());
537             if (updateElement.isRight()) {
538                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {}. ", container.getName());
539                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
540             }
541         }
542         if (result == null) {
543             updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId, filter);
544             if (updateContainerComponentRes.isRight()) {
545                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {}. ", container.getName());
546                 result = Either.right(updateContainerComponentRes.right().value());
547             }
548         }
549         if (result == null) {
550             result = Either.left((TopologyTemplate) updateContainerComponentRes.left().value());
551         }
552         return result;
553     }
554
555     public Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> deleteComponentInstanceFromTopologyTemplate(TopologyTemplate container, String componentInstanceId) {
556
557         Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> result = null;
558         Either<ToscaElement, StorageOperationStatus> updateContainerComponentRes = null;
559
560         String containerComponentId = container.getUniqueId();
561         CommonUtility.addRecordToLog(log, LogLevelEnum.TRACE, "Going to update component instance metadata {} of container component {}", componentInstanceId, containerComponentId);
562
563         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
564             .getVertexById(container.getUniqueId(), JsonParseFlagEnum.ParseMetadata);
565         if (metadataVertex.isRight()) {
566             JanusGraphOperationStatus status = metadataVertex.right().value();
567             if (status == JanusGraphOperationStatus.NOT_FOUND) {
568                 status = JanusGraphOperationStatus.INVALID_ID;
569             }
570             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
571         }
572         GraphVertex containerV = null;
573         ComponentInstanceDataDefinition removedComponentInstance = null;
574         if (result == null) {
575             removedComponentInstance = container.getComponentInstances().remove(componentInstanceId);
576             containerV = metadataVertex.left().value();
577             StorageOperationStatus status = removeRelationsOfInstance(container, componentInstanceId, containerV);
578             if (status != StorageOperationStatus.OK) {
579                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete relation for component instance {} in container. error {}", componentInstanceId, container.getUniqueId(), status);
580                 result = Either.right(status);
581             }
582
583             containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
584             topologyTemplateOperation.fillToscaElementVertexData(containerV, container, JsonParseFlagEnum.ParseAll);
585             Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
586             if (updateElement.isRight()) {
587                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_UPDATE_TOPOLOGY_TEMPLATE_WITH_NEW_COMPONENT_INSTANCE, container.getName(), componentInstanceId);
588                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
589             }
590         }
591         if (result == null) {
592             StorageOperationStatus status = deleteComponentInstanceToscaDataFromContainerComponent(containerV, componentInstanceId);
593             if (status != StorageOperationStatus.OK) {
594                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to delete data  for instance {} in container {}. error {] ", componentInstanceId, container.getUniqueId(), status);
595                 return Either.right(status);
596             }
597             ComponentInstance componentInstance = new ComponentInstance(removedComponentInstance);
598             StorageOperationStatus createInstanceEdge = removeInstanceEdge(containerV, componentInstance);
599             result = createInstanceEdge == StorageOperationStatus.OK ? null : Either.right(createInstanceEdge);
600         }
601         if (result == null) {
602             updateContainerComponentRes = topologyTemplateOperation.getToscaElement(containerComponentId);
603             if (updateContainerComponentRes.isRight()) {
604                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch updated topology template {} after deleting the component instance {}. ", container.getName(), componentInstanceId);
605                 result = Either.right(updateContainerComponentRes.right().value());
606             }
607         }
608         if (result == null) {
609             result = Either.left(new ImmutablePair<>((TopologyTemplate) updateContainerComponentRes.left().value(), componentInstanceId));
610         }
611         return result;
612     }
613
614     private StorageOperationStatus removeRelationsOfInstance(TopologyTemplate container, String ciToRemove, GraphVertex containerV) {
615         CompositionDataDefinition composition = container.getCompositions().get(JsonConstantKeysEnum.COMPOSITION.getValue());
616         if (composition != null) {
617             Map<String, RelationshipInstDataDefinition> relations = composition.getRelations();
618             if (MapUtils.isNotEmpty(relations)) {
619                 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
620                 if (capResult.isRight()) {
621                     return capResult.right().value();
622
623                 }
624                 Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
625
626                 Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
627                 if (capFullResult.isRight()) {
628                     return capFullResult.right().value();
629
630                 }
631                 Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
632
633                 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
634                 if (reqResult.isRight()) {
635                     return reqResult.right().value();
636                 }
637                 Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
638
639                 Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
640                 if (reqResult.isRight()) {
641                     return reqResult.right().value();
642                 }
643                 Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
644
645                 Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
646                 while (iterator.hasNext()) {
647                     Entry<String, RelationshipInstDataDefinition> relation = iterator.next();
648                     RelationshipInstDataDefinition relationToDelete = relation.getValue();
649                     if (relationToDelete.getFromId().equals(ciToRemove) || relationToDelete.getToId().equals(ciToRemove)) {
650                         iterator.remove();
651                         if (relationToDelete.getFromId().equals(ciToRemove)) {
652                             updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, ciToRemove, relationToDelete, null);
653                             updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, relationToDelete.getToId(), relationToDelete, null);
654                         }
655                         if (relationToDelete.getToId().equals(ciToRemove)) {
656                             updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fullfilledRequirement, relationToDelete.getFromId(), relationToDelete, null);
657                             updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapabilty, fullFilledCapabilty, ciToRemove, relationToDelete, null);
658                         }
659                     }
660                 }
661                 return updateAllAndCalculatedCapReqOnGraph(container.getUniqueId(), containerV, capResult, capFullResult, reqResult, reqFullResult);
662             }
663         }
664         return StorageOperationStatus.OK;
665     }
666
667     private StorageOperationStatus deleteComponentInstanceToscaDataFromContainerComponent(GraphVertex containerV, String componentInstanceId) {
668         StorageOperationStatus status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, componentInstanceId);
669         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
670             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
671             return status;
672         }
673         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceId);
674         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
675             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
676             return status;
677         }
678         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, componentInstanceId);
679         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
680             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated requirement  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
681             return status;
682         }
683         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, componentInstanceId);
684         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
685             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled capabilities  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
686             return status;
687         }
688         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, componentInstanceId);
689         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
690             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
691             return status;
692         }
693         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, componentInstanceId);
694         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
695             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove attributes for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
696             return status;
697         }
698         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, componentInstanceId);
699         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
700             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove properties for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
701             return status;
702         }
703         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, componentInstanceId);
704         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
705             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance inputs  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
706             return status;
707         }
708         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, componentInstanceId);
709         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
710             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove fullfilled requirement  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
711             return status;
712         }
713         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, componentInstanceId);
714         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
715             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance deployment artifacts  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
716             return status;
717         }
718         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS, componentInstanceId);
719         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
720             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance artifacts  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
721             return status;
722         }
723         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, componentInstanceId);
724         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
725             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove instance external refs  for instance {} in container {}. error {] ", componentInstanceId, containerV.getUniqueId(), status);
726             return status;
727         }
728         status = deleteToscaDataDeepElementsBlockToToscaElement(containerV, EdgeLabelEnum.INST_INTERFACES,
729                 VertexTypeEnum.INST_INTERFACES, componentInstanceId);
730         if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
731             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
732                     "Failed to remove service instance interfaces  for instance {} in container {}. " +
733                             "error {] ", componentInstanceId, containerV.getUniqueId(), status);
734             return status;
735         }
736         return StorageOperationStatus.OK;
737     }
738
739     protected Either<GraphVertex, StorageOperationStatus> addComponentInstanceToscaDataToContainerComponent(ToscaElement originToscaElement, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
740
741         Either<GraphVertex, StorageOperationStatus> result;
742         StorageOperationStatus status;
743         if (originToscaElement.getToscaType() == ToscaElementTypeEnum.NODE_TYPE) {
744             status = addComponentInstanceToscaDataToNodeTypeContainer((NodeType) originToscaElement, componentInstance, updatedContainerVertex);
745         } else {
746             status = addComponentInstanceToscaDataToTopologyTemplateContainer((TopologyTemplate) originToscaElement, componentInstance, updatedContainerVertex);
747         }
748         if (status == StorageOperationStatus.OK) {
749             result = Either.left(updatedContainerVertex);
750         } else {
751             result = Either.right(status);
752         }
753         return result;
754     }
755
756     private StorageOperationStatus addComponentInstanceToscaDataToTopologyTemplateContainer(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
757
758         StorageOperationStatus status;
759
760         status = addCalculatedCapReqFromTopologyTemplate(originTopologyTemplate, componentInstance, updatedContainerVertex);
761
762         if (status != StorageOperationStatus.OK) {
763
764             return status;
765         }
766
767         MapPropertiesDataDefinition instInputs = new MapPropertiesDataDefinition(originTopologyTemplate.getInputs());
768         MapPropertiesDataDefinition instInputsAsProperties = turnInputsIntoProperties(instInputs);
769
770         status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, instInputsAsProperties, componentInstance.getUniqueId());
771         if (status != StorageOperationStatus.OK) {
772             return status;
773         }
774
775         return status;
776     }
777
778     private MapPropertiesDataDefinition turnInputsIntoProperties(MapPropertiesDataDefinition instInput) {
779         if (instInput.getMapToscaDataDefinition() != null) {
780             for (PropertyDataDefinition currProp : instInput.getMapToscaDataDefinition().values()) {
781                 String temp = currProp.getValue();
782                 currProp.setValue(currProp.getDefaultValue());
783                 currProp.setDefaultValue(temp);
784             }
785         }
786         return instInput;
787     }
788
789     private MapListCapabilityDataDefinition prepareCalculatedCapabiltyForTopologyTemplate(
790             Map<String, ListCapabilityDataDefinition> capabilities,
791             ComponentInstanceDataDefinition componentInstance,
792             MapListCapabilityDataDefinition calculatedCap) {
793             MapListCapabilityDataDefinition allCalculatedCap =
794                     new MapListCapabilityDataDefinition(calculatedCap);
795             populateCapability(capabilities, componentInstance, allCalculatedCap);
796             return allCalculatedCap;
797     }
798
799     private void populateCapability(Map<String, ListCapabilityDataDefinition> capabilities,
800                                     ComponentInstanceDataDefinition componentInstance,
801                                     MapListCapabilityDataDefinition allCalculatedCap) {
802         capabilities.forEach((key, value) -> {
803             List<CapabilityDataDefinition> listCapabilities = value.getListToscaDataDefinition()
804                     .stream().map(CapabilityDataDefinition::new).collect(Collectors.toList());
805             listCapabilities.forEach(cap -> {
806                 cap.setSource(componentInstance.getComponentUid());
807                 cap.addToPath(componentInstance.getUniqueId());
808                 log.debug("enter populateCapability,get Capability OwnerId:{},get componentInstance UniqueId:{}",
809                         cap.getOwnerId(), componentInstance.getUniqueId());
810                 cap.setOwnerId(componentInstance.getUniqueId());
811                 log.debug("enter populateCapability,get Capability OwnerName:{},get componentInstance Name:{}",
812                         cap.getOwnerName(), componentInstance.getName());
813                 if (cap.getOwnerName() == null || cap.getOwnerName().isEmpty()) {
814                     cap.setOwnerName(componentInstance.getName());
815                 }
816                 cap.setLeftOccurrences(cap.getMaxOccurrences());
817                 allCalculatedCap.add(key, cap);
818             });
819         });
820     }
821
822     private MapListRequirementDataDefinition prepareCalculatedRequirementForTopologyTemplate(
823             Map<String, ListRequirementDataDefinition> requirements,
824             ComponentInstanceDataDefinition componentInstance,
825             MapListRequirementDataDefinition calculatedReqs) {
826             MapListRequirementDataDefinition allCalculatedReq =
827                     new MapListRequirementDataDefinition(calculatedReqs);
828
829             populateRequirement(requirements, componentInstance, allCalculatedReq);
830             return allCalculatedReq;
831     }
832     private void populateRequirement(Map<String, ListRequirementDataDefinition> requirements,
833                                      ComponentInstanceDataDefinition componentInstance,
834                                      MapListRequirementDataDefinition allCalculatedReq) {
835         requirements.forEach((key, value) -> {
836             List<RequirementDataDefinition> listRequirements = value.getListToscaDataDefinition()
837                     .stream().map(RequirementDataDefinition::new).collect(Collectors.toList());
838             listRequirements.forEach(req -> {
839                 req.setSource(componentInstance.getComponentUid());
840                 req.addToPath(componentInstance.getUniqueId());
841                 log.debug("enter populateRequirement,get init Requirements OwnerId:{},get componentInstance UniqueId:{}",
842                         req.getOwnerId(), componentInstance.getUniqueId());
843                 if (req.getOwnerId() == null || req.getOwnerId().isEmpty()) {
844                     req.setOwnerId(componentInstance.getUniqueId());
845                 }
846                 log.debug("enter populateRequirement,get init Requirements OwnerName:{}", req.getOwnerName());
847                 if (req.getOwnerName() == null || req.getOwnerName().isEmpty()) {
848                     req.setOwnerName(componentInstance.getName());
849                 }
850                 req.setLeftOccurrences(req.getMaxOccurrences());
851                 allCalculatedReq.add(key, req);
852             });
853         });
854     }
855
856
857
858     private StorageOperationStatus addCalculatedCapReqFromTopologyTemplate(TopologyTemplate originTopologyTemplate, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
859         Map<String, MapListCapabilityDataDefinition> calculatedCapabilities = originTopologyTemplate.getCalculatedCapabilities();
860
861         MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
862         if (calculatedCapabilities != null) {
863             calculatedCapabilities.forEach((key1, value1) -> {
864                 Map<String, ListCapabilityDataDefinition> mapByType = value1.getMapToscaDataDefinition();
865                 mapByType.forEach((key, value) -> value.getListToscaDataDefinition().forEach(cap -> {
866                     cap.addToPath(componentInstance.getUniqueId());
867                     allCalculatedCap.add(key, cap);
868                 }));
869             });
870         }
871         MapListCapabilityDataDefinition allCaps;
872         Map<String, ListCapabilityDataDefinition> capabilities = originTopologyTemplate.getCapabilities();
873         if (MapUtils.isNotEmpty(capabilities)) {
874             allCaps = prepareCalculatedCapabiltyForTopologyTemplate(capabilities, componentInstance,
875                     allCalculatedCap);
876         } else {
877             allCaps = new MapListCapabilityDataDefinition(allCalculatedCap);
878         }
879         if(!allCaps.isEmpty()) {
880             StorageOperationStatus calculatedCapabilitiesResult =
881                     addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
882                             EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES,
883                             allCaps, componentInstance.getUniqueId());
884             if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
885                 return calculatedCapabilitiesResult;
886             }
887             MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
888             calculatedCapabilitiesResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
889                     EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES,
890                     fullCalculatedCap, componentInstance.getUniqueId());
891             if (calculatedCapabilitiesResult != StorageOperationStatus.OK) {
892                 return calculatedCapabilitiesResult;
893             }
894         }
895         Map<String, MapListRequirementDataDefinition> calculatedRequirements =
896                 originTopologyTemplate.getCalculatedRequirements();
897         MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
898         if (calculatedRequirements != null) {
899             calculatedRequirements.forEach((key, value) -> {
900                 Map<String, ListRequirementDataDefinition> mapByType =
901                         value.getMapToscaDataDefinition();
902                 mapByType.forEach((key1, value1) -> value1.getListToscaDataDefinition().stream()
903                         .filter(RequirementDataDefinition::isExternal).forEach(req -> {
904                     req.addToPath(componentInstance.getUniqueId());
905                     req.setExternal(false);
906                     allCalculatedReq.add(key1, req);
907                 }));
908             });
909
910         }
911
912         MapListRequirementDataDefinition allReqs;
913         Map<String, ListRequirementDataDefinition> requirements = originTopologyTemplate.getRequirements();
914         if (MapUtils.isNotEmpty(requirements)) {
915             allReqs = prepareCalculatedRequirementForTopologyTemplate(requirements,
916                     componentInstance, allCalculatedReq);
917         } else
918             allReqs = new MapListRequirementDataDefinition(allCalculatedReq);
919
920         if(!allReqs.isEmpty()) {
921             StorageOperationStatus calculatedRequirementResult =
922                     addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
923                             EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS,
924                             allReqs, componentInstance.getUniqueId());
925             if (calculatedRequirementResult != StorageOperationStatus.OK) {
926                 return calculatedRequirementResult;
927             }
928             MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
929             calculatedRequirementResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
930                     EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS,
931                     fullCalculatedReq,
932                     componentInstance.getUniqueId());
933             if (calculatedRequirementResult != StorageOperationStatus.OK) {
934                 return calculatedRequirementResult;
935             }
936         }
937         Map<String, MapCapabilityProperty> calculatedCapabilitiesProperties = originTopologyTemplate.getCalculatedCapabilitiesProperties();
938         Map<String, MapPropertiesDataDefinition> updateKeyMap = new HashMap<>();
939
940         if (calculatedCapabilitiesProperties != null && !calculatedCapabilitiesProperties.isEmpty()) {
941             for (MapCapabilityProperty map : calculatedCapabilitiesProperties.values()) {
942                 for (Entry<String, MapPropertiesDataDefinition> entry : map.getMapToscaDataDefinition().entrySet()) {
943                     String newKey = (componentInstance.getUniqueId() + ModelConverter.CAP_PROP_DELIM + entry.getKey());
944                     updateKeyMap.put(newKey, entry.getValue());
945                 }
946             }
947         }
948         Map<String, MapPropertiesDataDefinition> capabilitiesProperties =
949                 originTopologyTemplate.getCapabilitiesProperties();
950         Map<String, MapPropertiesDataDefinition> updateKeyMapCapabilitiesProperties;
951         if (MapUtils.isNotEmpty(capabilitiesProperties)) {
952             updateKeyMapCapabilitiesProperties = capabilitiesProperties.entrySet().stream()
953                     .collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(),
954                             componentInstance.getUniqueId()), Entry::getValue));
955         }
956         else {
957             updateKeyMapCapabilitiesProperties = new HashMap<>();
958         }
959         updateKeyMap.putAll(updateKeyMapCapabilitiesProperties);
960         MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
961
962         if(MapUtils.isNotEmpty(capabilitiesProperties) || MapUtils.isNotEmpty(calculatedCapabilitiesProperties )) {
963             StorageOperationStatus calculatedResult =
964                     addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex,
965                             EdgeLabelEnum.CALCULATED_CAP_PROPERTIES,
966                             VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty,
967                             componentInstance.getUniqueId());
968             if (calculatedResult != StorageOperationStatus.OK) {
969                 return calculatedResult;
970             }
971         }
972         return StorageOperationStatus.OK;
973     }
974     
975     public StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition) {
976         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
977                 .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
978         if (containerVEither.isRight()) {
979             JanusGraphOperationStatus error = containerVEither.right().value();
980             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
981             return StorageOperationStatus.GENERAL_ERROR;
982         }
983         GraphVertex containerV = containerVEither.left().value();
984         return updateComponentInstanceRequirement(componentId, componentInstanceUniqueId, requirementDataDefinition, containerV);
985     }
986
987     private StorageOperationStatus updateComponentInstanceRequirement(String componentId, String componentInstanceUniqueId, RequirementDataDefinition requirementDataDefinition, GraphVertex containerV) {
988         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> existingReqs = getCalculatedRequirements(componentId);
989         if (existingReqs.isRight()) {
990             return existingReqs.right().value();
991         }
992         MapListRequirementDataDefinition componentInstanceRequirementsMap = existingReqs.left().value().getRight().get(componentInstanceUniqueId);
993         if (componentInstanceRequirementsMap == null) {
994             return StorageOperationStatus.NOT_FOUND;
995         }
996         ListRequirementDataDefinition listRequirementDataDefinition = componentInstanceRequirementsMap.getMapToscaDataDefinition().get(requirementDataDefinition.getCapability());
997             
998         listRequirementDataDefinition.getListToscaDataDefinition().stream()
999                 .filter(e -> requirementDataDefinition.getOwnerId().equals(e.getOwnerId()) && requirementDataDefinition.getName().equals(e.getName()))
1000                 .forEach(r -> r.setExternal(requirementDataDefinition.isExternal()));
1001
1002         return updateCalculatedReqOnGraph(componentId, containerV, existingReqs);
1003     }
1004     
1005     private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> getCalculatedRequirements(String componentId) {
1006         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> result = null;
1007         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1008             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1009         if (containerVEither.isRight()) {
1010             JanusGraphOperationStatus error = containerVEither.right().value();
1011             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1012             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1013         }
1014         if (result == null) {
1015             GraphVertex containerV = containerVEither.left().value();
1016             result = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1017         }
1018         return result;
1019     }
1020     
1021     private StorageOperationStatus updateCalculatedReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult
1022             ) {
1023         containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1024         Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1025         if (updateElement.isRight()) {
1026             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1027             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1028         }
1029
1030         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1031         Either<GraphVertex, JanusGraphOperationStatus> status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1032         if (status.isRight()) {
1033             JanusGraphOperationStatus error = status.right().value();
1034             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1035             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1036         }
1037         return StorageOperationStatus.OK;
1038     }
1039     
1040     private StorageOperationStatus addComponentInstanceToscaDataToNodeTypeContainer(NodeType originNodeType,
1041             ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1042
1043         StorageOperationStatus status;
1044
1045         if(MapUtils.isNotEmpty(originNodeType.getProperties())){
1046             MapPropertiesDataDefinition instProperties =
1047                     new MapPropertiesDataDefinition(originNodeType.getProperties());
1048             status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_PROPERTIES,
1049                     VertexTypeEnum.INST_PROPERTIES, instProperties, componentInstance.getUniqueId());
1050             if (status != StorageOperationStatus.OK) {
1051                 return status;
1052             }
1053         }
1054
1055         if(MapUtils.isNotEmpty(originNodeType.getAttributes())){
1056             MapAttributesDataDefinition instAttributes =
1057                     new MapAttributesDataDefinition(originNodeType.getAttributes());
1058             status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.INST_ATTRIBUTES,
1059                     VertexTypeEnum.INST_ATTRIBUTES, instAttributes, componentInstance.getUniqueId());
1060             if (status != StorageOperationStatus.OK) {
1061                 return status;
1062             }
1063         }
1064
1065         return addCalculatedCapReqFromNodeType(originNodeType, componentInstance, updatedContainerVertex);
1066     }
1067
1068     public MapArtifactDataDefinition prepareInstDeploymentArtifactPerInstance(Map<String, ArtifactDataDefinition> deploymentArtifacts, String componentInstanceId, User user, String envType) {
1069         if (deploymentArtifacts != null && envType.equals(HEAT_VF_ENV_NAME)) {
1070             Map<String, ArtifactDataDefinition> instDeploymentArtifacts = new HashMap<>();
1071
1072             deploymentArtifacts.entrySet().forEach(e -> {
1073                 ArtifactDataDefinition artifact = e.getValue();
1074                 String type = artifact.getArtifactType();
1075                 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
1076                     ArtifactDataDefinition artifactEnv = createArtifactPlaceHolderInfo(artifact, componentInstanceId, user, envType);
1077                     instDeploymentArtifacts.put(artifactEnv.getArtifactLabel(), artifactEnv);
1078                 }
1079             });
1080
1081             deploymentArtifacts.putAll(instDeploymentArtifacts);
1082
1083             return new MapArtifactDataDefinition(deploymentArtifacts);
1084
1085         }
1086         return null;
1087     }
1088
1089     @SuppressWarnings({"unchecked"})
1090     private ArtifactDataDefinition createArtifactPlaceHolderInfo(ArtifactDataDefinition artifactHeat, String componentId, User user, String heatEnvType) {
1091         Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getDeploymentResourceInstanceArtifacts();
1092         if (deploymentResourceArtifacts == null) {
1093             log.debug("no deployment artifacts are configured for generated artifacts");
1094             return null;
1095         }
1096         Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(heatEnvType);
1097         if (placeHolderData == null) {
1098             log.debug("no env type {} are configured for generated artifacts", heatEnvType);
1099             return null;
1100         }
1101
1102         String envLabel = (artifactHeat.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
1103
1104         ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition();
1105
1106         String artifactName = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DISPLAY_NAME);
1107         String artifactType = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_TYPE);
1108         String artifactDescription = (String) placeHolderData.get(ARTIFACT_PLACEHOLDER_DESCRIPTION);
1109
1110         artifactInfo.setArtifactDisplayName(artifactName);
1111         artifactInfo.setArtifactLabel(envLabel);
1112         artifactInfo.setArtifactType(artifactType);
1113         artifactInfo.setDescription(artifactDescription);
1114         artifactInfo.setArtifactGroupType(artifactHeat.getArtifactGroupType());
1115         setDefaultArtifactTimeout(artifactHeat.getArtifactGroupType(), artifactInfo);
1116         artifactInfo.setGeneratedFromId(artifactHeat.getUniqueId());
1117         // clone heat parameters in case of heat env only not VF heat env
1118         if (heatEnvType.equals(HEAT_ENV_NAME)) {
1119             artifactInfo.setHeatParameters(artifactHeat.getHeatParameters());
1120         }
1121         setArtifactPlaceholderCommonFields(componentId, user, artifactInfo);
1122
1123         return artifactInfo;
1124     }
1125
1126     public void setDefaultArtifactTimeout(ArtifactGroupTypeEnum groupType, ArtifactDataDefinition artifactInfo) {
1127         if (groupType.equals(ArtifactGroupTypeEnum.DEPLOYMENT)) {
1128             artifactInfo.setTimeout(defaultHeatTimeout);
1129         } else {
1130             artifactInfo.setTimeout(NON_HEAT_TIMEOUT);
1131         }
1132     }
1133
1134     private void setArtifactPlaceholderCommonFields(String resourceId, User user, ArtifactDataDefinition artifactInfo) {
1135         if (resourceId != null) {
1136             String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(resourceId.toLowerCase(), artifactInfo.getArtifactLabel().toLowerCase());
1137             artifactInfo.setUniqueId(uniqueId);
1138         }
1139         artifactInfo.setUserIdCreator(user.getUserId());
1140         String fullName = user.getFullName();
1141         artifactInfo.setUpdaterFullName(fullName);
1142
1143         long time = System.currentTimeMillis();
1144
1145         artifactInfo.setCreatorFullName(fullName);
1146         artifactInfo.setCreationDate(time);
1147
1148         artifactInfo.setLastUpdateDate(time);
1149         artifactInfo.setUserIdLastUpdater(user.getUserId());
1150
1151         artifactInfo.setMandatory(true);
1152     }
1153
1154     /**
1155      * @param originNodeType
1156      * @param componentInstance
1157      * @param updatedContainerVertex
1158      * @return
1159      */
1160     private StorageOperationStatus addCalculatedCapReqFromNodeType(NodeType originNodeType, ComponentInstanceDataDefinition componentInstance, GraphVertex updatedContainerVertex) {
1161
1162         Map<String, ListCapabilityDataDefinition> capabilities = originNodeType.getCapabilities();
1163         MapListCapabilityDataDefinition allCalculatedCap = prepareCalculatedCapabiltyForNodeType(capabilities, componentInstance);
1164         StorageOperationStatus calculatedResult;
1165         if (allCalculatedCap != null) {
1166             calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId());
1167
1168             if (calculatedResult != StorageOperationStatus.OK) {
1169                 return calculatedResult;
1170             }
1171         }
1172         Map<String, MapPropertiesDataDefinition> capabiltiesProperties = originNodeType.getCapabilitiesProperties();
1173         if (capabiltiesProperties != null) {
1174             Map<String, MapPropertiesDataDefinition> updateKeyMap = capabiltiesProperties.entrySet().stream().collect(Collectors.toMap(e -> createCapPropertyKey(e.getKey(), componentInstance.getUniqueId()), Entry::getValue));
1175             MapCapabilityProperty mapCapabilityProperty = new MapCapabilityProperty(updateKeyMap);
1176             calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, mapCapabilityProperty, componentInstance.getUniqueId());
1177             if (calculatedResult != StorageOperationStatus.OK) {
1178                 return calculatedResult;
1179             }
1180         }
1181
1182         MapListCapabilityDataDefinition fullCalculatedCap = new MapListCapabilityDataDefinition();
1183         calculatedResult = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_CAPABILITIES, VertexTypeEnum.FULLFILLED_CAPABILITIES, fullCalculatedCap, componentInstance.getUniqueId());
1184
1185         if (calculatedResult != StorageOperationStatus.OK) {
1186             return calculatedResult;
1187         }
1188
1189         Map<String, ListRequirementDataDefinition> requirements = originNodeType.getRequirements();
1190
1191         MapListRequirementDataDefinition allCalculatedReq = prepareCalculatedRequirementForNodeType(requirements, componentInstance);
1192
1193         StorageOperationStatus status;
1194         if (allCalculatedReq != null) {
1195             status = addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.CALCULATED_REQUIREMENTS, VertexTypeEnum.CALCULATED_REQUIREMENTS, allCalculatedReq, componentInstance.getUniqueId());
1196             if (status != StorageOperationStatus.OK) {
1197                 return status;
1198             }
1199         }
1200         MapListRequirementDataDefinition fullCalculatedReq = new MapListRequirementDataDefinition();
1201         return addToscaDataDeepElementsBlockToToscaElement(updatedContainerVertex, EdgeLabelEnum.FULLFILLED_REQUIREMENTS, VertexTypeEnum.FULLFILLED_REQUIREMENTS, fullCalculatedReq, componentInstance.getUniqueId());
1202     }
1203
1204     public static String createCapPropertyKey(String key, String instanceId) {
1205         StringBuffer sb = new StringBuffer(instanceId);
1206         sb.append(ModelConverter.CAP_PROP_DELIM).append(instanceId).append(ModelConverter.CAP_PROP_DELIM).append(key);
1207         return sb.toString();
1208     }
1209
1210     /**
1211      * Prepares a map of capabilities lists Produces a deep copy of the received map of capabilities Sets values to the specific fields according to received component instance
1212      *
1213      * @param capabilities
1214      * @param componentInstance
1215      * @return
1216      */
1217     public MapListCapabilityDataDefinition prepareCalculatedCapabiltyForNodeType(Map<String, ListCapabilityDataDefinition> capabilities, ComponentInstanceDataDefinition componentInstance) {
1218         if (capabilities != null) {
1219             MapListCapabilityDataDefinition allCalculatedCap = new MapListCapabilityDataDefinition();
1220
1221             populateCapability(capabilities, componentInstance, allCalculatedCap);
1222             return allCalculatedCap;
1223         }
1224         return null;
1225     }
1226
1227     /**
1228      * Prepares a map of requirements lists Produces a deep copy of the received map of requirements Sets values to the specific fields according to received component instance
1229      *
1230      * @param requirements
1231      * @param componentInstance
1232      * @return
1233      */
1234     public MapListRequirementDataDefinition prepareCalculatedRequirementForNodeType(Map<String, ListRequirementDataDefinition> requirements, ComponentInstanceDataDefinition componentInstance) {
1235         if (requirements != null) {
1236             MapListRequirementDataDefinition allCalculatedReq = new MapListRequirementDataDefinition();
1237
1238             populateRequirement(requirements, componentInstance, allCalculatedReq);
1239             return allCalculatedReq;
1240         }
1241         return null;
1242     }
1243
1244     public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstanceDataDefinition componentInstance, List<GroupDefinition> groups, Map<String, List<ArtifactDefinition>> groupInstancesArtifacts) {
1245
1246         StorageOperationStatus result = null;
1247         Map<String, GroupInstanceDataDefinition> groupInstanceToCreate = new HashMap<>();
1248         if (groupInstancesArtifacts != null && CollectionUtils.isNotEmpty(groups)) {
1249             for (Map.Entry<String, List<ArtifactDefinition>> groupArtifacts : groupInstancesArtifacts.entrySet()) {
1250                 Optional<GroupDefinition> groupOptional = groups.stream().filter(g -> g.getUniqueId().equals(groupArtifacts.getKey())).findFirst();
1251                 if (groupOptional.isPresent()) {
1252                     GroupInstanceDataDefinition groupInstance = buildGroupInstanceDataDefinition((GroupDataDefinition) groupOptional.get(), (ComponentInstanceDataDefinition) componentInstance, null);
1253                     groupInstance.setGroupInstanceArtifacts(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getUniqueId).collect(Collectors.toList()));
1254                     groupInstance.setGroupInstanceArtifactsUuid(groupArtifacts.getValue().stream().map(ArtifactDataDefinition::getArtifactUUID).collect(Collectors.toList()));
1255                     groupInstanceToCreate.put(groupInstance.getName(), groupInstance);
1256                 }
1257             }
1258         }
1259         if (MapUtils.isNotEmpty(groupInstanceToCreate)) {
1260             result = addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS, new MapDataDefinition<>(groupInstanceToCreate), componentInstance.getUniqueId());
1261         }
1262         if (result == null) {
1263             result = StorageOperationStatus.OK;
1264         }
1265         return result;
1266     }
1267
1268     private ComponentInstanceDataDefinition buildComponentInstanceDataDefinition(ComponentInstance resourceInstance, String containerComponentId, String instanceNewName, boolean generateUid, ToscaElement originToscaElement) {
1269         String ciOriginComponentUid = resourceInstance.getComponentUid();
1270
1271         if (!ValidationUtils.validateStringNotEmpty(resourceInstance.getCustomizationUUID())) {
1272             resourceInstance.setCustomizationUUID(generateCustomizationUUID());
1273         }
1274         ComponentInstanceDataDefinition dataDefinition = new ComponentInstanceDataDefinition(resourceInstance);
1275
1276         Long creationDate = resourceInstance.getCreationTime();
1277         Long modificationTime;
1278         if (creationDate == null) {
1279             creationDate = System.currentTimeMillis();
1280             modificationTime = creationDate;
1281         } else {
1282             modificationTime = System.currentTimeMillis();
1283         }
1284         dataDefinition.setComponentUid(ciOriginComponentUid);
1285         dataDefinition.setCreationTime(creationDate);
1286         dataDefinition.setModificationTime(modificationTime);
1287         if (StringUtils.isNotEmpty(instanceNewName)) {
1288             dataDefinition.setName(instanceNewName);
1289             resourceInstance.setName(instanceNewName);
1290         }
1291         if (StringUtils.isNotEmpty(dataDefinition.getName()))
1292             dataDefinition.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(dataDefinition.getName()));
1293         dataDefinition.setIcon(resourceInstance.getIcon());
1294         if (generateUid) {
1295             dataDefinition.setUniqueId(UniqueIdBuilder.buildResourceInstanceUniuqeId(containerComponentId, ciOriginComponentUid, dataDefinition.getNormalizedName()));
1296             resourceInstance.setUniqueId(dataDefinition.getUniqueId());
1297         }
1298         if (StringUtils.isEmpty(dataDefinition.getComponentVersion()) && originToscaElement != null)
1299             dataDefinition.setComponentVersion((String) originToscaElement.getMetadataValue(JsonPresentationFields.VERSION));
1300         if (StringUtils.isEmpty(dataDefinition.getComponentName()) && originToscaElement != null)
1301             dataDefinition.setComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.NAME));
1302         if (originToscaElement != null && dataDefinition.getToscaComponentName() == null)
1303             dataDefinition.setToscaComponentName((String) originToscaElement.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
1304         if (dataDefinition.getOriginType() == null && originToscaElement != null) {
1305             ResourceTypeEnum resourceType = originToscaElement.getResourceType();
1306             OriginTypeEnum originType = OriginTypeEnum.findByValue(resourceType.name());
1307             dataDefinition.setOriginType(originType);
1308         }
1309         if (dataDefinition.getOriginType() == OriginTypeEnum.ServiceProxy)
1310             dataDefinition.setIsProxy(true);
1311
1312         return dataDefinition;
1313     }
1314
1315     private Boolean isUniqueInstanceName(TopologyTemplate container, String instanceName) {
1316         Boolean isUniqueName = true;
1317         try {
1318             isUniqueName = container.getComponentInstances().values().stream().noneMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName));
1319         } catch (Exception e) {
1320             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Exception occured during fetching component instance with name {} from component container {}. {} ", instanceName, container.getName(), e.getMessage());
1321         }
1322         return isUniqueName;
1323     }
1324
1325     private String buildComponentInstanceName(String instanceSuffixNumber, String instanceName) {
1326         return instanceName + " " + (instanceSuffixNumber == null ? 0 : instanceSuffixNumber);
1327     }
1328
1329     public Either<RequirementCapabilityRelDef, StorageOperationStatus> associateResourceInstances(Component component, String componentId, RequirementCapabilityRelDef relation) {
1330         List<RequirementCapabilityRelDef> relations = new ArrayList<>();
1331         relations.add(relation);
1332         Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances = associateResourceInstances(component, componentId, relations);
1333         if (associateResourceInstances.isRight()) {
1334             return Either.right(associateResourceInstances.right().value());
1335         }
1336         return Either.left(associateResourceInstances.left().value().get(0));
1337     }
1338
1339     @SuppressWarnings({"unchecked"})
1340     public <T extends ToscaDataDefinition> Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> associateResourceInstances(Component component, String componentId, List<RequirementCapabilityRelDef> relations) {
1341
1342         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1343             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1344         if (containerVEither.isRight()) {
1345             JanusGraphOperationStatus error = containerVEither.right().value();
1346             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1347             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1348         }
1349         GraphVertex containerV = containerVEither.left().value();
1350         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1351         if (capResult.isRight()) {
1352             return Either.right(capResult.right().value());
1353
1354         }
1355         Map<String, MapListCapabilityDataDefinition> calculatedCapabilty = capResult.left().value().getRight();
1356
1357         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1358         if (capResult.isRight()) {
1359             return Either.right(capResult.right().value());
1360
1361         }
1362         Map<String, MapListCapabilityDataDefinition> fullFilledCapabilty = capFullResult.left().value().getRight();
1363
1364         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1365         if (reqResult.isRight()) {
1366             return Either.right(reqResult.right().value());
1367         }
1368         Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1369
1370         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1371         if (reqResult.isRight()) {
1372             return Either.right(reqResult.right().value());
1373         }
1374         Map<String, MapListRequirementDataDefinition> fullfilledRequirement = reqFullResult.left().value().getRight();
1375
1376         Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1377         CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1378
1379         StorageOperationStatus status;
1380         List<RequirementCapabilityRelDef> relationsList = new ArrayList<>();
1381         for (RequirementCapabilityRelDef relation : relations) {
1382             List<CapabilityRequirementRelationship> relationshipsResult = new ArrayList<>();
1383             String fromNode = relation.getFromNode();
1384             String toNode = relation.getToNode();
1385             List<CapabilityRequirementRelationship> relationships = relation.getRelationships();
1386             if (relationships == null || relationships.isEmpty()) {
1387                 BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1388                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement definition sent in order to set the relation between {} to {}", fromNode, toNode);
1389                 loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATION.getName(),"componentId: "+componentId+" No requirement definition sent in order to set the relation between: "+fromNode+" to: "+toNode);
1390                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
1391             }
1392
1393             for (final CapabilityRequirementRelationship relationship : relationships) {
1394                 final String requirement = relationship.getRelation().getRequirement();
1395
1396                 Either<Map<JsonPresentationFields, T>, StorageOperationStatus> associateRes = connectInstancesInContainer(fromNode, toNode, relationship.getRelation(), relation.isOriginUI(), calculatedCapabilty, calculatedRequirement,
1397                         fullFilledCapabilty, fullfilledRequirement, compositionDataDefinition, containerV.getUniqueId());
1398
1399
1400                 if (associateRes.isRight()) {
1401                     status = associateRes.right().value();
1402                     BeEcompErrorManager.getInstance().logBeFailedAddingResourceInstanceError("AssociateResourceInstances - missing relationship", fromNode, componentId);
1403                     loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),
1404                         StatusCode.ERROR,"missing relationship: "+fromNode,"ComopnentId: "+componentId);
1405                     CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to associate resource instance {} to resource instance {}. status is {}", fromNode, toNode, status);
1406                     return Either.right(status);
1407                 }
1408
1409                 final Map<JsonPresentationFields, T> relationshipFieldsMap = associateRes.left().value();
1410                 final RelationshipInstDataDefinition relationshipInstData =
1411                     (RelationshipInstDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.RELATIONSHIP);
1412                 createRelationshipInterfaces(relationship.getOperations()).ifPresent(relationshipInstData::setInterfaces);
1413                 RelationshipImpl relationshipImplResult = new RelationshipImpl();
1414                 relationshipImplResult.setType(relationshipInstData.getType());
1415                 RelationshipInfo requirementAndRelationshipPair = new RelationshipInfo(requirement, relationshipImplResult);
1416                 requirementAndRelationshipPair.setCapability(relationship.getRelation().getCapability());
1417                 requirementAndRelationshipPair.setRequirement(relationship.getRelation().getRequirement());
1418                 requirementAndRelationshipPair.setCapabilityOwnerId(relationshipInstData.getCapabilityOwnerId());
1419                 requirementAndRelationshipPair.setRequirementOwnerId(relationshipInstData.getRequirementOwnerId());
1420                 requirementAndRelationshipPair.setCapabilityUid(relationship.getRelation().getCapabilityUid());
1421                 requirementAndRelationshipPair.setRequirementUid(relationship.getRelation().getRequirementUid());
1422                 requirementAndRelationshipPair.setId(relationshipInstData.getUniqueId());
1423                 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
1424                 capReqRel.setRelation(requirementAndRelationshipPair);
1425                 capReqRel.setCapability((CapabilityDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.CAPABILITY));
1426                 capReqRel.setRequirement((RequirementDataDefinition) relationshipFieldsMap.get(JsonPresentationFields.REQUIREMENT));
1427                 capReqRel.setOperations(relationship.getOperations());
1428                 relationshipsResult.add(capReqRel);
1429                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "update customization UUID for from CI {} and to CI {}", relation.getFromNode(), relation.getToNode());
1430                 status = updateCustomizationUUID(relation.getFromNode(), compositionDataDefinition);
1431                 if (status != StorageOperationStatus.OK) {
1432                     loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),StatusCode.ERROR,"ERROR while update customization UUID for from CI "+relation.getFromNode()+" and to CI: "+relation.getToNode());
1433                     return Either.right(status);
1434                 }
1435                 status = updateCustomizationUUID(relation.getToNode(), compositionDataDefinition);
1436                 if (status != StorageOperationStatus.OK) {
1437                     loggerSupportability.log(LogLevel.INFO,LoggerSupportabilityActions.CREATE_RELATIONS.name(),StatusCode.ERROR,"ERROR while update customization UUID for from CI "+relation.getFromNode()+" and to CI: "+relation.getToNode());
1438                     return Either.right(status);
1439                 }
1440             }
1441             RequirementCapabilityRelDef reqCapRelDef = new RequirementCapabilityRelDef(relation);
1442             reqCapRelDef.setRelationships(relationshipsResult);
1443             relationsList.add(reqCapRelDef);
1444         }
1445         status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1446         if (status != StorageOperationStatus.OK) {
1447             return Either.right(status);
1448         }
1449         return Either.left(relationsList);
1450     }
1451
1452     private Optional<ListDataDefinition<InterfaceDataDefinition>> createRelationshipInterfaces(
1453         final List<OperationUi> operationList) {
1454
1455         if (CollectionUtils.isEmpty(operationList)) {
1456             return Optional.empty();
1457         }
1458         final ListDataDefinition<InterfaceDataDefinition> interfaceList = new ListDataDefinition<>();
1459         final Map<String, List<OperationUi>> operationByInterfaceType = operationList.stream()
1460             .collect(Collectors.groupingBy(OperationUi::getInterfaceType));
1461         for (final Entry<String, List<OperationUi>> interfaceEntry : operationByInterfaceType.entrySet()) {
1462             interfaceList.add(createInterface(interfaceEntry.getKey(), interfaceEntry.getValue()));
1463         }
1464         return Optional.of(interfaceList);
1465     }
1466
1467     private InterfaceDataDefinition createInterface(final String interfaceType, final List<OperationUi> operationList) {
1468         final InterfaceDataDefinition interfaceDataDefinition = new InterfaceDataDefinition();
1469         interfaceDataDefinition.setType(interfaceType);
1470         if (CollectionUtils.isNotEmpty(operationList)) {
1471             final Map<String, OperationDataDefinition> operationMap =
1472                 operationList.stream().collect(Collectors.toMap(OperationUi::getOperationType, this::createOperation));
1473             interfaceDataDefinition.setOperations(operationMap);
1474         }
1475         return interfaceDataDefinition;
1476     }
1477
1478     private OperationDataDefinition createOperation(final OperationUi operation) {
1479         final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
1480         operationDataDefinition.setName(operation.getOperationType());
1481         operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
1482         final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
1483         implementation.setArtifactName(operation.getImplementation());
1484         operationDataDefinition.setImplementation(implementation);
1485         if (CollectionUtils.isNotEmpty(operation.getInputs())) {
1486             final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
1487             operation.getInputs().forEach(input -> {
1488                 final OperationInputDefinition operationInputDefinition = new OperationInputDefinition();
1489                 operationInputDefinition.setLabel(input.getName());
1490                 operationInputDefinition.setType(input.getType());
1491                 operationInputDefinition.setValue(input.getValue());
1492                 inputs.add(operationInputDefinition);
1493             });
1494             operationDataDefinition.setInputs(inputs);
1495         }
1496
1497         return operationDataDefinition;
1498     }
1499
1500     private StorageOperationStatus updateAllAndCalculatedCapReqOnGraph(String componentId, GraphVertex containerV, Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult,
1501                                                                        Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult, Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult,
1502                                                                        Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult) {
1503         containerV.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
1504         Either<GraphVertex, JanusGraphOperationStatus> updateElement = janusGraphDao.updateVertex(containerV);
1505         if (updateElement.isRight()) {
1506             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new relations error {}. ", componentId, updateElement.right().value());
1507             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value());
1508         }
1509         // update cap/req jsons, fulfilled cap/req jsons!!!!!
1510         Either<GraphVertex, JanusGraphOperationStatus> status;
1511         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated capabilty for container {}", containerV.getUniqueId());
1512         status = updateOrCopyOnUpdate(capResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1513         if (status.isRight()) {
1514             JanusGraphOperationStatus error = status.right().value();
1515             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated capabilty for container {} error {}", containerV.getUniqueId(), error);
1516             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1517         }
1518
1519         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update calculated requirement for container {}", containerV.getUniqueId());
1520         status = updateOrCopyOnUpdate(reqResult.left().value().getLeft(), containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1521         if (status.isRight()) {
1522             JanusGraphOperationStatus error = status.right().value();
1523             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update calculated requiremnt for container {} error {}", containerV.getUniqueId(), error);
1524             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1525         }
1526
1527         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled capabilty for container {}", containerV.getUniqueId());
1528         status = updateOrCopyOnUpdate(capFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1529         if (status.isRight()) {
1530             JanusGraphOperationStatus error = status.right().value();
1531             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled capabilty for container {} error {}", containerV.getUniqueId(), error);
1532             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1533         }
1534
1535         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Update fullfilled requirement for container {}", containerV.getUniqueId());
1536         status = updateOrCopyOnUpdate(reqFullResult.left().value().getLeft(), containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1537         if (status.isRight()) {
1538             JanusGraphOperationStatus error = status.right().value();
1539             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update fullfilled requirement for container {} error {}", containerV.getUniqueId(), error);
1540             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
1541         }
1542         return StorageOperationStatus.OK;
1543     }
1544
1545     @SuppressWarnings({"unchecked"})
1546     public Either<RequirementCapabilityRelDef, StorageOperationStatus> dissociateResourceInstances(String componentId, RequirementCapabilityRelDef requirementDef) {
1547         if (requirementDef.getRelationships() == null) {
1548             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation pair in request [ {} ]", requirementDef);
1549             return Either.right(StorageOperationStatus.BAD_REQUEST);
1550         }
1551
1552         String fromResInstanceUid = requirementDef.getFromNode();
1553         String toResInstanceUid = requirementDef.getToNode();
1554
1555         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1556             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1557         if (containerVEither.isRight()) {
1558             JanusGraphOperationStatus error = containerVEither.right().value();
1559             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1560             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1561         }
1562         GraphVertex containerV = containerVEither.left().value();
1563
1564         // DE191707 - validations
1565         Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
1566         CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
1567         Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1568         ComponentInstanceDataDefinition ciFrom = componentInstances.get(fromResInstanceUid);
1569         if (ciFrom == null) {
1570             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "FROM instance {} isn't under container {}", fromResInstanceUid, componentId);
1571             return Either.right(StorageOperationStatus.NOT_FOUND);
1572
1573         }
1574         ComponentInstanceDataDefinition ciTo = componentInstances.get(toResInstanceUid);
1575         if (ciFrom == ciTo) {
1576             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "TO instance {} isn't under container {}", toResInstanceUid, componentId);
1577             return Either.right(StorageOperationStatus.NOT_FOUND);
1578
1579         }
1580         Map<String, RelationshipInstDataDefinition> relations = compositionDataDefinition.getRelations();
1581
1582         List<CapabilityRequirementRelationship> relationPairList = requirementDef.getRelationships();
1583         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.CALCULATED_CAPABILITIES);
1584         if (capResult.isRight()) {
1585             return Either.right(capResult.right().value());
1586         }
1587         Map<String, MapListCapabilityDataDefinition> calculatedCapability = capResult.left().value().getRight();
1588
1589         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1590         if (capResult.isRight()) {
1591             return Either.right(capResult.right().value());
1592
1593         }
1594         Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1595
1596         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.CALCULATED_REQUIREMENTS);
1597         if (reqResult.isRight()) {
1598             return Either.right(reqResult.right().value());
1599         }
1600         Map<String, MapListRequirementDataDefinition> calculatedRequirement = reqResult.left().value().getRight();
1601
1602         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1603         if (reqResult.isRight()) {
1604             return Either.right(reqResult.right().value());
1605         }
1606         Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1607
1608         for (CapabilityRequirementRelationship relationPair : relationPairList) {
1609             Iterator<Entry<String, RelationshipInstDataDefinition>> iterator = relations.entrySet().iterator();
1610             boolean isDeleted = false;
1611             while (iterator.hasNext()) {
1612                 Entry<String, RelationshipInstDataDefinition> entryInJson = iterator.next();
1613                 RelationshipInstDataDefinition relationInJson = entryInJson.getValue();
1614                 if (relationInJson.getFromId().equals(fromResInstanceUid) && relationInJson.getToId().equals(toResInstanceUid) && relationInJson.getUniqueId().equals(relationPair.getRelation().getId())) {
1615                     if (relationPair.getRelation().equalsTo(relationInJson)) {
1616                         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Remove relation from {} to {} capability {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationInJson.getType(), relationInJson.getCapabilityOwnerId(),
1617                                 relationInJson.getRequirementOwnerId());
1618                         iterator.remove();
1619
1620                         // update calculated cap/req
1621                         StorageOperationStatus status = updateCalculatedCapabiltyAfterDeleteRelation(calculatedCapability, fulfilledCapability, toResInstanceUid, relationInJson, relationPair);
1622                         if (status != StorageOperationStatus.OK) {
1623                             return Either.right(status);
1624                         }
1625                         status = updateCalculatedRequirementsAfterDeleteRelation(calculatedRequirement, fulfilledRequirement, fromResInstanceUid, relationInJson, relationPair);
1626                         if (status != StorageOperationStatus.OK) {
1627                             return Either.right(status);
1628                         }
1629                         isDeleted = true;
1630                     }
1631                 }
1632             }
1633             if (!isDeleted) {
1634                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No relation to delete from {} to {} capabilty {} capOwnerId {} reqOwnerId {} ", toResInstanceUid, componentId, relationPair.getCapability(),
1635                         relationPair.getRelation().getCapabilityOwnerId(), relationPair.getRelation().getRequirementOwnerId());
1636                 return Either.right(StorageOperationStatus.NOT_FOUND);
1637             }
1638         }
1639         StorageOperationStatus status = updateCustomizationUUID(fromResInstanceUid, compositionDataDefinition);
1640         if (status != StorageOperationStatus.OK) {
1641             return Either.right(status);
1642         }
1643         status = updateCustomizationUUID(toResInstanceUid, compositionDataDefinition);
1644         if (status != StorageOperationStatus.OK) {
1645             return Either.right(status);
1646         }
1647
1648         // update jsons
1649         // update metadata of container and composition json
1650         status = updateAllAndCalculatedCapReqOnGraph(componentId, containerV, capResult, capFullResult, reqResult, reqFullResult);
1651         if (status != StorageOperationStatus.OK) {
1652             return Either.right(status);
1653         }
1654
1655         return Either.left(requirementDef);
1656     }
1657
1658     /**
1659      * Retrieves fulfilled requirement according to relation and received predicate
1660      *
1661      * @param componentId
1662      * @param instanceId
1663      * @param foundRelation
1664      * @param predicate
1665      * @return
1666      */
1667     public Either<RequirementDataDefinition, StorageOperationStatus> getFulfilledRequirementByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1668                                                                                                        BiPredicate<RelationshipInfo, RequirementDataDefinition> predicate) {
1669
1670         Either<RequirementDataDefinition, StorageOperationStatus> result = null;
1671         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> reqFullResult = null;
1672         MapListRequirementDataDefinition reqMapOfLists = null;
1673         Optional<RequirementDataDefinition> foundRequirement;
1674         RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1675         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1676             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1677         if (containerVEither.isRight()) {
1678             JanusGraphOperationStatus error = containerVEither.right().value();
1679             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1680             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1681         }
1682         if (result == null) {
1683             GraphVertex containerV = containerVEither.left().value();
1684             reqFullResult = fetchContainerCalculatedRequirement(containerV, EdgeLabelEnum.FULLFILLED_REQUIREMENTS);
1685             if (reqFullResult.isRight()) {
1686                 result = Either.right(reqFullResult.right().value());
1687             }
1688         }
1689         if (result == null) {
1690             Map<String, MapListRequirementDataDefinition> fulfilledRequirement = reqFullResult.left().value().getRight();
1691             reqMapOfLists = fulfilledRequirement.get(instanceId);
1692             if (reqMapOfLists == null) {
1693                 result = Either.right(StorageOperationStatus.NOT_FOUND);
1694             }
1695         }
1696         if (result == null && reqMapOfLists != null) {
1697             for (ListRequirementDataDefinition requirements : reqMapOfLists.getMapToscaDataDefinition().values()) {
1698                 foundRequirement = requirements.getListToscaDataDefinition().stream().filter(req -> predicate.test(relationshipInfo, req)).findFirst();
1699                 if (foundRequirement.isPresent()) {
1700                     result = Either.left(foundRequirement.get());
1701                 }
1702             }
1703         }
1704         return result;
1705     }
1706
1707     /**
1708      * Retrieves fulfilled capability according to relation and received predicate
1709      *
1710      * @param componentId
1711      * @param instanceId
1712      * @param foundRelation
1713      * @param predicate
1714      * @return
1715      */
1716     public Either<CapabilityDataDefinition, StorageOperationStatus> getFulfilledCapabilityByRelation(String componentId, String instanceId, RequirementCapabilityRelDef foundRelation,
1717                                                                                                      BiPredicate<RelationshipInfo, CapabilityDataDefinition> predicate) {
1718
1719         Either<CapabilityDataDefinition, StorageOperationStatus> result = null;
1720         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> capFullResult = null;
1721         MapListCapabilityDataDefinition capMapOfLists = null;
1722         Optional<CapabilityDataDefinition> foundRequirement;
1723
1724         RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1725         Either<GraphVertex, JanusGraphOperationStatus> containerVEither = janusGraphDao
1726             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
1727         if (containerVEither.isRight()) {
1728             JanusGraphOperationStatus error = containerVEither.right().value();
1729             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FETCH_CONTAINER_VERTEX_ERROR, componentId, error);
1730             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1731         }
1732         if (result == null) {
1733             GraphVertex containerV = containerVEither.left().value();
1734             capFullResult = fetchContainerCalculatedCapability(containerV, EdgeLabelEnum.FULLFILLED_CAPABILITIES);
1735             if (capFullResult.isRight()) {
1736                 result = Either.right(capFullResult.right().value());
1737             }
1738         }
1739         if (result == null) {
1740             Map<String, MapListCapabilityDataDefinition> fulfilledCapability = capFullResult.left().value().getRight();
1741             capMapOfLists = fulfilledCapability.get(instanceId);
1742             if (capMapOfLists == null) {
1743                 result = Either.right(StorageOperationStatus.NOT_FOUND);
1744             }
1745         }
1746         if (result == null && capMapOfLists != null) {
1747             for (ListCapabilityDataDefinition capabilities : capMapOfLists.getMapToscaDataDefinition().values()) {
1748                 foundRequirement = capabilities.getListToscaDataDefinition().stream().filter(cap -> predicate.test(relationshipInfo, cap)).findFirst();
1749                 if (foundRequirement.isPresent()) {
1750                     result = Either.left(foundRequirement.get());
1751                 }
1752             }
1753         }
1754         return result;
1755     }
1756
1757     private StorageOperationStatus updateCalculatedRequirementsAfterDeleteRelation(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1758                                                                                    RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1759         StorageOperationStatus status;
1760         String hereIsTheKey = null;
1761         MapListRequirementDataDefinition reqByInstance = calculatedRequirement.get(fromResInstanceUid);
1762         if (reqByInstance == null || reqByInstance.findKeyByItemUidMatch(relation.getRequirementId()) == null) {
1763             // move from fulfilled
1764             status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1765         } else {
1766             hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1767             ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1768             Optional<RequirementDataDefinition> requirementOptional = reqByType.getListToscaDataDefinition().stream()
1769                     .filter(req -> req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())).findFirst();
1770
1771             if (requirementOptional.isPresent()) {
1772
1773                 RequirementDataDefinition requirement = requirementOptional.get();
1774                 String leftOccurrences = requirement.getLeftOccurrences();
1775                 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
1776                     Integer leftIntValue = Integer.parseInt(leftOccurrences);
1777                     ++leftIntValue;
1778                     requirement.setLeftOccurrences(String.valueOf(leftIntValue));
1779                 }
1780                 if (relationship != null) {
1781                     relationship.setRequirement(requirement);
1782                 }
1783                 status = StorageOperationStatus.OK;
1784             } else {
1785                 // move from fulfilled
1786                 status = moveFromFullFilledRequirement(calculatedRequirement, fullFilledRequirement, fromResInstanceUid, relation, hereIsTheKey, relationship);
1787             }
1788         }
1789         return status;
1790     }
1791
1792     private StorageOperationStatus updateCalculatedCapabiltyAfterDeleteRelation(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1793                                                                                 RelationshipInstDataDefinition relation, CapabilityRequirementRelationship relationship) {
1794         StorageOperationStatus status;
1795         String hereIsTheKey = null;
1796         MapListCapabilityDataDefinition capByInstance = calculatedCapability.get(toResInstanceUid);
1797         if (capByInstance == null || capByInstance.findKeyByItemUidMatch(relation.getCapabilityId()) == null) {
1798             // move from fulfilled
1799             status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1800         } else {
1801             hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1802             ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1803             Optional<CapabilityDataDefinition> capabilityOptional = capByType.getListToscaDataDefinition().stream().filter(cap -> cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId()))
1804                     .findFirst();
1805
1806             if (capabilityOptional.isPresent()) {
1807
1808                 CapabilityDataDefinition capability = capabilityOptional.get();
1809                 String leftOccurrences = capability.getLeftOccurrences();
1810                 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
1811                     Integer leftIntValue = Integer.parseInt(leftOccurrences);
1812                     ++leftIntValue;
1813                     capability.setLeftOccurrences(String.valueOf(leftIntValue));
1814                 }
1815                 if (relationship != null) {
1816                     relationship.setCapability(capability);
1817                 }
1818                 status = StorageOperationStatus.OK;
1819             } else {
1820                 // move from fulfilled
1821                 status = moveFromFullFilledCapabilty(calculatedCapability, fullFilledCapability, toResInstanceUid, relation, hereIsTheKey, relationship);
1822             }
1823         }
1824         return status;
1825     }
1826
1827     private StorageOperationStatus moveFromFullFilledCapabilty(Map<String, MapListCapabilityDataDefinition> calculatedCapability, Map<String, MapListCapabilityDataDefinition> fullFilledCapability, String toResInstanceUid,
1828                                                                RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1829         MapListCapabilityDataDefinition capByInstance = fullFilledCapability.get(toResInstanceUid);
1830         if (capByInstance == null) {
1831             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability in fulfilled list for instance {} ", toResInstanceUid);
1832             return StorageOperationStatus.GENERAL_ERROR;
1833         }
1834         if (null == hereIsTheKey)
1835             hereIsTheKey = capByInstance.findKeyByItemUidMatch(relation.getCapabilityId());
1836         if (null == hereIsTheKey) {
1837             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability with id {} in fulfilled list for instance {} ", relation.getCapabilityId(), toResInstanceUid);
1838             return StorageOperationStatus.GENERAL_ERROR;
1839         }
1840         ListCapabilityDataDefinition capByType = capByInstance.findByKey(hereIsTheKey);
1841         Iterator<CapabilityDataDefinition> iterator = capByType.getListToscaDataDefinition().iterator();
1842         boolean found = false;
1843         while (iterator.hasNext()) {
1844             CapabilityDataDefinition cap = iterator.next();
1845             if (cap.getOwnerId().equals(relation.getCapabilityOwnerId()) && cap.getUniqueId().equals(relation.getCapabilityId())) {
1846                 found = true;
1847                 iterator.remove();
1848                 // return to calculated list
1849                 String leftOccurrences = cap.getLeftOccurrences();
1850                 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1851                 ++leftIntValue;
1852                 cap.setLeftOccurrences(String.valueOf(leftIntValue));
1853
1854                 MapListCapabilityDataDefinition mapListCapaDataDef = calculatedCapability.get(toResInstanceUid);
1855                 if (mapListCapaDataDef == null) {
1856                     mapListCapaDataDef = new MapListCapabilityDataDefinition();
1857                 }
1858                 ListCapabilityDataDefinition findByKey = mapListCapaDataDef.findByKey(hereIsTheKey);
1859                 if (findByKey == null) {
1860                     findByKey = new ListCapabilityDataDefinition();
1861                     mapListCapaDataDef.put(hereIsTheKey, findByKey);
1862                 }
1863                 findByKey.add(cap);
1864                 if (relationship != null)
1865                     relationship.setCapability(cap);
1866                 break;
1867             }
1868         }
1869         if (!found) {
1870             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No capability type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getCapabilityOwnerId(), toResInstanceUid);
1871             return StorageOperationStatus.GENERAL_ERROR;
1872         }
1873         return StorageOperationStatus.OK;
1874     }
1875
1876     private StorageOperationStatus moveFromFullFilledRequirement(Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListRequirementDataDefinition> fullFilledRequirement, String fromResInstanceUid,
1877                                                                  RelationshipInstDataDefinition relation, String hereIsTheKey, CapabilityRequirementRelationship relationship) {
1878         MapListRequirementDataDefinition reqByInstance = fullFilledRequirement.get(fromResInstanceUid);
1879         if (reqByInstance == null) {
1880             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement in fullfilled list for instance {} ", fromResInstanceUid);
1881             return StorageOperationStatus.GENERAL_ERROR;
1882         }
1883         if (null == hereIsTheKey)
1884             hereIsTheKey = reqByInstance.findKeyByItemUidMatch(relation.getRequirementId());
1885         if (null == hereIsTheKey) {
1886             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement with id {} in fulfilled list for instance {} ", relation.getRequirementId(), fromResInstanceUid);
1887             return StorageOperationStatus.GENERAL_ERROR;
1888         }
1889         ListRequirementDataDefinition reqByType = reqByInstance.findByKey(hereIsTheKey);
1890         Iterator<RequirementDataDefinition> iterator = reqByType.getListToscaDataDefinition().iterator();
1891         boolean found = false;
1892         while (iterator.hasNext()) {
1893             RequirementDataDefinition req = iterator.next();
1894             if (req.getOwnerId().equals(relation.getRequirementOwnerId()) && req.getName().equals(relation.getRequirement()) && req.getUniqueId().equals(relation.getRequirementId())) {
1895                 found = true;
1896                 iterator.remove();
1897                 // return to calculated list
1898                 String leftOccurrences = req.getLeftOccurrences();
1899                 Integer leftIntValue = Integer.parseInt(leftOccurrences);
1900                 ++leftIntValue;
1901                 req.setLeftOccurrences(String.valueOf(leftIntValue));
1902
1903                 MapListRequirementDataDefinition mapListReqDataDef = calculatedRequirement.get(fromResInstanceUid);
1904                 if (mapListReqDataDef == null) {
1905                     mapListReqDataDef = new MapListRequirementDataDefinition();
1906                 }
1907                 ListRequirementDataDefinition findByKey = mapListReqDataDef.findByKey(hereIsTheKey);
1908                 if (findByKey == null) {
1909                     findByKey = new ListRequirementDataDefinition();
1910                     mapListReqDataDef.put(hereIsTheKey, findByKey);
1911                 }
1912                 findByKey.add(req);
1913                 if (relationship != null)
1914                     relationship.setRequirement(req);
1915                 break;
1916             }
1917         }
1918         if (!found) {
1919             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No requirement type {} with ownerId {} in fulfilled list for instance {} ", hereIsTheKey, relation.getRequirementOwnerId(), fromResInstanceUid);
1920             return StorageOperationStatus.GENERAL_ERROR;
1921         }
1922         return StorageOperationStatus.OK;
1923
1924     }
1925
1926     public StorageOperationStatus updateCustomizationUUID(String componentInstanceId, CompositionDataDefinition compositionDataDefinition) {
1927         ComponentInstanceDataDefinition componentInstance = compositionDataDefinition.getComponentInstances().get(componentInstanceId);
1928
1929         if (componentInstance == null) {
1930             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch component instance by id {} from map of instances ", componentInstanceId);
1931             return StorageOperationStatus.NOT_FOUND;
1932         }
1933         UUID uuid = UUID.randomUUID();
1934         componentInstance.setCustomizationUUID(uuid.toString());
1935
1936         return StorageOperationStatus.OK;
1937     }
1938
1939     public <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectInstancesInContainer(String fromResInstanceUid, String toResInstanceUid, RelationshipInfo relationPair, boolean originUI,
1940                                                                                                                                       Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement, Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty,
1941                                                                                                                                       Map<String, MapListRequirementDataDefinition> fullfilledRequirement, CompositionDataDefinition compositionDataDefinition, String containerId) {
1942         String requirement = relationPair.getRequirement();
1943         Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
1944
1945         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Going to associate resource instance {} to resource instance {} under component {}. Requirement is {}.", fromResInstanceUid, toResInstanceUid, containerId, requirement);
1946
1947         ComponentInstanceDataDefinition fromResourceInstData = componentInstances.get(fromResInstanceUid);
1948         if (fromResourceInstData == null) {
1949             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find from resource instance {}.", fromResInstanceUid);
1950             return Either.right(StorageOperationStatus.NOT_FOUND);
1951         }
1952         ComponentInstanceDataDefinition toResourceInstData = componentInstances.get(toResInstanceUid);
1953         if (toResourceInstData == null) {
1954             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find to resource instance {}.", toResInstanceUid);
1955             return Either.right(StorageOperationStatus.NOT_FOUND);
1956         }
1957
1958         Either<Map<JsonPresentationFields, T>, StorageOperationStatus> reqVsCap = connectRequirementVsCapability(fromResourceInstData, toResourceInstData, relationPair, originUI, calculatedCapabilty, calculatedRequirement, fullfilledCapabilty,
1959                 fullfilledRequirement, containerId);
1960         if (reqVsCap.isRight()) {
1961             StorageOperationStatus status = reqVsCap.right().value();
1962             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to connect requirement {} between resource instance {} to resource instance {}. status is {}", requirement, fromResInstanceUid, toResInstanceUid, status);
1963             return Either.right(status);
1964         }
1965         Map<JsonPresentationFields, T> relationship = reqVsCap.left().value();
1966
1967         // add to json new relations
1968         compositionDataDefinition.addRelation(((RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP)).getUniqueId(), (RelationshipInstDataDefinition) relationship.get(JsonPresentationFields.RELATIONSHIP));
1969
1970         return Either.left(relationship);
1971     }
1972
1973     private Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedCapability(GraphVertex containerV, EdgeLabelEnum capLabel) {
1974
1975         Either<Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>>, JanusGraphOperationStatus> calculatedCapabiltyEither = getDataAndVertexFromGraph(containerV, capLabel);
1976         if (calculatedCapabiltyEither.isRight()) {
1977             JanusGraphOperationStatus error = calculatedCapabiltyEither.right().value();
1978             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilties for container {}.", containerV.getUniqueId(), error);
1979             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1980         }
1981         Pair<GraphVertex, Map<String, MapListCapabilityDataDefinition>> calculatedCapabilty = calculatedCapabiltyEither.left().value();
1982         return Either.left(calculatedCapabilty);
1983     }
1984
1985     private Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, StorageOperationStatus> fetchContainerCalculatedRequirement(GraphVertex containerV, EdgeLabelEnum reqLabel) {
1986         Either<Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>>, JanusGraphOperationStatus> calculatedRequirementEither = getDataAndVertexFromGraph(containerV, reqLabel);
1987         if (calculatedRequirementEither.isRight()) {
1988             JanusGraphOperationStatus error = calculatedRequirementEither.right().value();
1989             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for container {}.", containerV.getUniqueId(), error);
1990             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error));
1991         }
1992         Pair<GraphVertex, Map<String, MapListRequirementDataDefinition>> calculatedRequirement = calculatedRequirementEither.left().value();
1993         return Either.left(calculatedRequirement);
1994     }
1995
1996     @SuppressWarnings("unchecked")
1997     private <T extends ToscaDataDefinition> Either<Map<JsonPresentationFields, T>, StorageOperationStatus> connectRequirementVsCapability(ComponentInstanceDataDefinition fromResInstance, ComponentInstanceDataDefinition toResInstance,
1998                                                                                                                                           RelationshipInfo relationPair, boolean originUI, Map<String, MapListCapabilityDataDefinition> calculatedCapabilty, Map<String, MapListRequirementDataDefinition> calculatedRequirement,
1999                                                                                                                                           Map<String, MapListCapabilityDataDefinition> fullfilledCapabilty, Map<String, MapListRequirementDataDefinition> fullfilledRequirement, String containerId) {
2000         String type = relationPair.getRelationship().getType();
2001         // capability
2002
2003         String toInstId = toResInstance.getUniqueId();
2004         MapListCapabilityDataDefinition mapListCapabilityDataDefinition = calculatedCapabilty.get(toInstId);
2005         Map<JsonPresentationFields, T> capReqRelationship = new EnumMap<>(JsonPresentationFields.class);
2006
2007         if (mapListCapabilityDataDefinition == null) {
2008             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for instance {} in container {}.", toInstId, containerId);
2009             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2010         }
2011         ListCapabilityDataDefinition listCapabilityDataDefinition = mapListCapabilityDataDefinition.getMapToscaDataDefinition().get(type);
2012         if (listCapabilityDataDefinition == null) {
2013             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated capabilities for type {} for instance {} in container {}.", type, toInstId, containerId);
2014             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2015         }
2016         CapabilityDataDefinition capabilityForRelation = null;
2017         Iterator<CapabilityDataDefinition> iteratorCap = listCapabilityDataDefinition.getListToscaDataDefinition().iterator();
2018         while (iteratorCap.hasNext()) {
2019             CapabilityDataDefinition cap = iteratorCap.next();
2020             if (cap.getUniqueId().equals(relationPair.getCapabilityUid()) && cap.getOwnerId().equals(relationPair.getCapabilityOwnerId())) {
2021                 capabilityForRelation = cap;
2022                 capReqRelationship.put(JsonPresentationFields.CAPABILITY, (T) capabilityForRelation);
2023                 String leftOccurrences = cap.getLeftOccurrences();
2024                 if (leftOccurrences != null && !leftOccurrences.equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
2025                     Integer leftIntValue = Integer.parseInt(leftOccurrences);
2026                     if (leftIntValue > 0) {
2027                         --leftIntValue;
2028                         capabilityForRelation.setLeftOccurrences(String.valueOf(leftIntValue));
2029                         if (leftIntValue == 0) {
2030                             // remove from calculated
2031                             iteratorCap.remove();
2032                             // move to fulfilled
2033                             MapListCapabilityDataDefinition mapListCapabiltyFullFilledInst = fullfilledCapabilty.get(toInstId);
2034                             if (mapListCapabiltyFullFilledInst == null) {
2035                                 mapListCapabiltyFullFilledInst = new MapListCapabilityDataDefinition();
2036                                 fullfilledCapabilty.put(toInstId, mapListCapabiltyFullFilledInst);
2037                             }
2038
2039                             ListCapabilityDataDefinition listCapabilityFull = mapListCapabiltyFullFilledInst.findByKey(type);
2040                             if (listCapabilityFull == null) {
2041                                 listCapabilityFull = new ListCapabilityDataDefinition();
2042                                 mapListCapabiltyFullFilledInst.put(type, listCapabilityFull);
2043                             }
2044                             listCapabilityFull.add(capabilityForRelation);
2045                         }
2046                         break;
2047                     } else {
2048                         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences capabilty {} to {} in container {}.", capabilityForRelation.getType(), toInstId, containerId);
2049                         return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2050                     }
2051                 }
2052             }
2053         }
2054         if (capabilityForRelation == null) {
2055             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch capabilty for type {} for instance {} in container {}.", type, toInstId, containerId);
2056             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2057         }
2058
2059         // requirements
2060         String fromInstId = fromResInstance.getUniqueId();
2061         MapListRequirementDataDefinition mapListRequirementDataDefinition = calculatedRequirement.get(fromInstId);
2062         if (mapListRequirementDataDefinition == null) {
2063             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for instance {} in container {}.", fromInstId, containerId);
2064             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2065         }
2066         ListRequirementDataDefinition listRequirementDataDefinition = mapListRequirementDataDefinition.getMapToscaDataDefinition().get(type);
2067         if (listRequirementDataDefinition == null) {
2068             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch calculated requirements for type {} for instance {} in container {}.", type, fromInstId, containerId);
2069             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2070         }
2071
2072         RequirementDataDefinition requirementForRelation = null;
2073         Iterator<RequirementDataDefinition> iteratorReq = listRequirementDataDefinition.getListToscaDataDefinition().iterator();
2074         while (iteratorReq.hasNext()) {
2075             RequirementDataDefinition req = iteratorReq.next();
2076             if (req.getUniqueId().equals(relationPair.getRequirementUid()) && req.getOwnerId().equals(relationPair.getRequirementOwnerId())) {
2077                 requirementForRelation = req;
2078                 capReqRelationship.put(JsonPresentationFields.REQUIREMENT, (T) requirementForRelation);
2079                 String leftOccurrences = req.getLeftOccurrences();
2080                 if (leftOccurrences != null && !leftOccurrences.equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
2081                     Integer leftIntValue = Integer.parseInt(leftOccurrences);
2082                     if (leftIntValue > 0) {
2083                         --leftIntValue;
2084                         req.setLeftOccurrences(String.valueOf(leftIntValue));
2085                         if (leftIntValue == 0) {
2086                             // remove from calculated
2087                             iteratorReq.remove();
2088                             // move to fulfilled
2089                             MapListRequirementDataDefinition mapListRequirementFullFilledInst = fullfilledRequirement.get(fromInstId);
2090                             if (mapListRequirementFullFilledInst == null) {
2091                                 mapListRequirementFullFilledInst = new MapListRequirementDataDefinition();
2092                                 fullfilledRequirement.put(fromInstId, mapListRequirementFullFilledInst);
2093                             }
2094
2095                             ListRequirementDataDefinition listRequirementFull = mapListRequirementFullFilledInst.findByKey(type);
2096                             if (listRequirementFull == null) {
2097                                 listRequirementFull = new ListRequirementDataDefinition();
2098                                 mapListRequirementFullFilledInst.put(type, listRequirementFull);
2099                             }
2100                             listRequirementFull.add(requirementForRelation);
2101                         }
2102                         break;
2103                     } else {
2104                         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No left occurrences requirement {} from {} to {} in container {}.", requirementForRelation.getCapability(), fromInstId, toInstId, containerId);
2105                         return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2106                     }
2107                 }
2108             }
2109         }
2110         if (requirementForRelation == null) {
2111             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch requirement for type {} for instance {} in container {}.", type, toInstId, containerId);
2112             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2113         }
2114         if (!capabilityForRelation.getType().equals(requirementForRelation.getCapability())) {
2115             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "No macth for capability from type {} and requirement {} from {} to {} in container {}.", capabilityForRelation.getType(), requirementForRelation.getCapability(), fromInstId, toInstId,
2116                     containerId);
2117             return Either.right(StorageOperationStatus.MATCH_NOT_FOUND);
2118         }
2119
2120         RelationshipInstDataDefinition relationshipTypeData = buildRelationshipInstData(fromInstId, toInstId, relationPair, originUI);
2121         if (requirementForRelation.getRelationship() != null)
2122             relationshipTypeData.setType(requirementForRelation.getRelationship());
2123         capReqRelationship.put(JsonPresentationFields.RELATIONSHIP, (T) relationshipTypeData);
2124         return Either.left(capReqRelationship);
2125     }
2126
2127     private RelationshipInstDataDefinition buildRelationshipInstData(String fromResInstanceUid, String toInstId, RelationshipInfo relationPair, boolean originUI) {
2128
2129         RelationshipInstDataDefinition relationshipInstData = new RelationshipInstDataDefinition();
2130         relationshipInstData.setUniqueId(UniqueIdBuilder.buildRelationsipInstInstanceUid(fromResInstanceUid, toInstId));
2131
2132         relationshipInstData.setType(relationPair.getRelationship().getType());
2133         Long creationDate = System.currentTimeMillis();
2134         relationshipInstData.setCreationTime(creationDate);
2135         relationshipInstData.setModificationTime(creationDate);
2136         relationshipInstData.setCapabilityOwnerId(relationPair.getCapabilityOwnerId());
2137         relationshipInstData.setRequirementOwnerId(relationPair.getRequirementOwnerId());
2138         relationshipInstData.setCapabilityId(relationPair.getCapabilityUid());
2139         relationshipInstData.setRequirementId(relationPair.getRequirementUid());
2140         relationshipInstData.setFromId(fromResInstanceUid);
2141         relationshipInstData.setToId(toInstId);
2142         relationshipInstData.setRequirement(relationPair.getRequirement());
2143         relationshipInstData.setCapability(relationPair.getCapability());
2144         relationshipInstData.setOriginUI(originUI);
2145
2146         return relationshipInstData;
2147     }
2148
2149     public <T extends Component> Map<String, ComponentInstanceDataDefinition> associateComponentInstancesToComponent(Component containerComponent, Map<ComponentInstance, T> componentInstanceTMap, GraphVertex containerVertex, boolean allowDeleted, boolean isUpdateCsar) {
2150
2151         String containerId = containerComponent.getUniqueId();
2152         Map<String, ComponentInstanceDataDefinition> instancesJsonData;
2153         Either<GraphVertex, JanusGraphOperationStatus> updateElement = null;
2154         if (!validateInstanceNames(componentInstanceTMap)) {
2155             throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2156         }
2157         if (!allowDeleted && !validateDeletedResources(componentInstanceTMap)) {
2158             throw new StorageException(StorageOperationStatus.INCONSISTENCY);
2159         }
2160         instancesJsonData = convertToComponentInstanceDataDefinition(componentInstanceTMap, containerId, isUpdateCsar);
2161
2162         if (MapUtils.isNotEmpty(instancesJsonData)) {
2163             containerVertex.setJsonMetadataField(JsonPresentationFields.LAST_UPDATE_DATE, System.currentTimeMillis());
2164             Map<String, CompositionDataDefinition> compositions = new HashMap<>();
2165             CompositionDataDefinition composition = new CompositionDataDefinition();
2166             composition.setComponentInstances(instancesJsonData);
2167             compositions.put(JsonConstantKeysEnum.COMPOSITION.getValue(), composition);
2168             containerVertex.setJson(compositions);
2169             updateElement = janusGraphDao.updateVertex(containerVertex);
2170             if (updateElement.isRight()) {
2171                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update topology template {} with new component instances. ", containerComponent.getName());
2172                 throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateElement.right().value()));
2173             }
2174         }
2175         if (updateElement != null) {
2176             GraphVertex vertexC = updateElement.left().value();
2177             instancesJsonData.entrySet().forEach(i -> createInstanceEdge(vertexC, i.getValue()));
2178         }
2179         return instancesJsonData;
2180     }
2181
2182     private <T extends Component> Map<String, ComponentInstanceDataDefinition> convertToComponentInstanceDataDefinition(Map<ComponentInstance, T> componentInstanceTMap, String containerId, boolean isUpdateCsar) {
2183
2184         Map<String, ComponentInstanceDataDefinition> instances = new HashMap<>();
2185         for (Entry<ComponentInstance, T> entry : componentInstanceTMap.entrySet()) {
2186             ComponentInstanceDataDefinition instance = buildComponentInstanceDataDefinition(entry.getKey(), containerId, null, !isUpdateCsar || entry.getKey().isCreatedFromCsar(), ModelConverter.convertToToscaElement(entry.getValue()));
2187             instances.put(instance.getUniqueId(), instance);
2188         }
2189         return instances;
2190     }
2191
2192     private <T extends Component> boolean validateDeletedResources(Map<ComponentInstance, T> resourcesInstancesMap) {
2193         boolean result = true;
2194         for (Component component : resourcesInstancesMap.values()) {
2195             if (component.getIsDeleted() != null && component.getIsDeleted()) {
2196                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Component {} is already deleted. Cannot add component instance. ", component.getName());
2197                 result = false;
2198                 break;
2199             }
2200         }
2201         return result;
2202     }
2203
2204     private <T extends Component> boolean validateInstanceNames(Map<ComponentInstance, T> resourcesInstancesMap) {
2205         boolean result = true;
2206         Set<String> names = new HashSet<>();
2207         for (ComponentInstance instance : resourcesInstancesMap.keySet()) {
2208             if (StringUtils.isEmpty(instance.getName())) {
2209                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2210                     "Component instance {} name is empty. Cannot add component instance. ", instance.getUniqueId());
2211                 result = false;
2212                 break;
2213             } else if (names.contains(instance.getName())) {
2214                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
2215                     "Component instance with the name {} already exsists. Cannot add component instance. ",
2216                     instance.getName());
2217                 result = false;
2218                 break;
2219             } else {
2220                 names.add(instance.getName());
2221             }
2222         }
2223         return result;
2224     }
2225
2226     public StorageOperationStatus addDeploymentArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2227         return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS);
2228     }
2229
2230     public StorageOperationStatus addInformationalArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts) {
2231         return addArtifactsToInstance(toscaElementId, instanceId, instDeplArtifacts, EdgeLabelEnum.INSTANCE_ARTIFACTS, VertexTypeEnum.INSTANCE_ARTIFACTS);
2232     }
2233
2234     public StorageOperationStatus addArtifactsToInstance(String toscaElementId, String instanceId, Map<String, ArtifactDataDefinition> instDeplArtifacts, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexType) {
2235         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2236             .getVertexById(toscaElementId, JsonParseFlagEnum.NoParse);
2237         if (metadataVertex.isRight()) {
2238             JanusGraphOperationStatus status = metadataVertex.right().value();
2239             if (status == JanusGraphOperationStatus.NOT_FOUND) {
2240                 status = JanusGraphOperationStatus.INVALID_ID;
2241             }
2242             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2243         }
2244         MapArtifactDataDefinition instArtifacts = new MapArtifactDataDefinition(instDeplArtifacts);
2245         return addToscaDataDeepElementsBlockToToscaElement(metadataVertex.left().value(), edgeLabel, vertexType, instArtifacts, instanceId);
2246
2247     }
2248
2249     @SuppressWarnings({"unchecked"})
2250     public StorageOperationStatus generateCustomizationUUIDOnInstance(String componentId, String instanceId) {
2251         Either<GraphVertex, JanusGraphOperationStatus> metadataVertex = janusGraphDao
2252             .getVertexById(componentId, JsonParseFlagEnum.ParseAll);
2253         if (metadataVertex.isRight()) {
2254             JanusGraphOperationStatus status = metadataVertex.right().value();
2255             if (status == JanusGraphOperationStatus.NOT_FOUND) {
2256                 status = JanusGraphOperationStatus.INVALID_ID;
2257             }
2258             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
2259         }
2260         GraphVertex metaVertex = metadataVertex.left().value();
2261         Map<String, CompositionDataDefinition> json = (Map<String, CompositionDataDefinition>) metaVertex.getJson();
2262         CompositionDataDefinition compositionDataDefinition = json.get(JsonConstantKeysEnum.COMPOSITION.getValue());
2263         StorageOperationStatus status = updateCustomizationUUID(instanceId, compositionDataDefinition);
2264         if (status != StorageOperationStatus.OK) {
2265             log.debug("Failed to update customization UUID for instance {} in component {} error {}", instanceId, componentId, status);
2266             return status;
2267         }
2268         Either<GraphVertex, JanusGraphOperationStatus> updateVertex = janusGraphDao.updateVertex(metaVertex);
2269         if (updateVertex.isRight()) {
2270             log.debug("Failed to update vertex of component {} error {}", componentId, updateVertex.right().value());
2271             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateVertex.right().value());
2272         }
2273         return StorageOperationStatus.OK;
2274     }
2275
2276     public StorageOperationStatus generateCustomizationUUIDOnInstanceGroup(String componentId, String instanceId, List<String> groupInstances) {
2277         if (groupInstances != null) {
2278             Either<Map<String, MapGroupsDataDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(componentId, EdgeLabelEnum.INST_GROUPS);
2279             if (dataFromGraph.isRight()) {
2280                 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(dataFromGraph.right().value());
2281             }
2282             MapGroupsDataDefinition grInstPerInstance = dataFromGraph.left().value().get(instanceId);
2283             if (grInstPerInstance == null) {
2284                 log.debug("No  instance groups for instance {} in component {}", instanceId, componentId);
2285                 return StorageOperationStatus.NOT_FOUND;
2286             }
2287             for (String instGroupForUpdate : groupInstances) {
2288                 GroupInstanceDataDefinition groupInst = grInstPerInstance.findByKey(instGroupForUpdate);
2289                 if (groupInst == null) {
2290                     log.debug("No group instance {} in group list  for instance {} in component {}", instGroupForUpdate, instanceId, componentId);
2291                     continue;
2292                 }
2293                 UUID uuid = UUID.randomUUID();
2294                 groupInst.setCustomizationUUID(uuid.toString());
2295             }
2296
2297         }
2298         return StorageOperationStatus.OK;
2299     }
2300
2301     public StorageOperationStatus addGroupInstancesToComponentInstance(Component containerComponent, ComponentInstance componentInstance, List<GroupInstance> groupInstances) {
2302
2303         return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_GROUPS, VertexTypeEnum.INST_GROUPS,
2304                 new MapDataDefinition<>(groupInstances.stream().collect(Collectors.toMap(GroupInstanceDataDefinition::getName, gi -> gi))), componentInstance.getUniqueId());
2305     }
2306
2307     public StorageOperationStatus addDeploymentArtifactsToComponentInstance(Component containerComponent, ComponentInstance componentInstance, Map<String, ArtifactDefinition> deploymentArtifacts) {
2308
2309         return addToscaDataDeepElementsBlockToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS, VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS, new MapDataDefinition<>(deploymentArtifacts),
2310                 componentInstance.getUniqueId());
2311     }
2312
2313     public StorageOperationStatus updateComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2314
2315         List<String> pathKeys = new ArrayList<>();
2316         pathKeys.add(componentInstanceId);
2317         return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2318     }
2319
2320     public StorageOperationStatus updateComponentInstanceCapabilityProperty(Component containerComponent, String componentInstanceId, String capabilityPropertyKey, ComponentInstanceProperty property) {
2321         List<String> pathKeys = new ArrayList<>();
2322         pathKeys.add(componentInstanceId);
2323         pathKeys.add(capabilityPropertyKey);
2324         return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME);
2325     }
2326
2327     public StorageOperationStatus overrideComponentCapabilitiesProperties(Component containerComponent, Map<String, MapCapabilityProperty> capabilityPropertyMap) {
2328         return overrideToscaDataOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilityPropertyMap);
2329     }
2330
2331     public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) {
2332         List<String> pathKeys = new ArrayList<>();
2333         pathKeys.add(componentInstanceId);
2334         return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES,
2335             property, pathKeys, JsonPresentationFields.NAME);
2336     }
2337
2338     public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId,
2339                                                                     List<ComponentInstanceProperty> properties) {
2340         List<String> pathKeys = new ArrayList<>();
2341         pathKeys.add(componentInstanceId);
2342         return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES,
2343             VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME);
2344     }
2345
2346     public StorageOperationStatus updateComponentInstanceAttributes(final Component containerComponent,
2347                                                                     final String componentInstanceId,
2348                                                                     final List<ComponentInstanceAttribute> attributes) {
2349         final List<String> pathKeys = Arrays.asList(componentInstanceId);
2350         return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2351             VertexTypeEnum.INST_ATTRIBUTES, attributes, pathKeys, JsonPresentationFields.NAME);
2352     }
2353
2354     public StorageOperationStatus updateComponentInstanceAttribute(final Component containerComponent,
2355                                                                    final String componentInstanceId,
2356                                                                    final ComponentInstanceAttribute attribute) {
2357         final List<String> pathKeys = Arrays.asList(componentInstanceId);
2358         return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES,
2359             VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME);
2360     }
2361
2362     public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId,
2363                                                                 ComponentInstanceAttribute attribute) {
2364         List<String> pathKeys = new ArrayList<>();
2365         pathKeys.add(componentInstanceId);
2366         return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES,
2367             attribute, pathKeys, JsonPresentationFields.NAME);
2368     }
2369
2370     public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId,
2371                                                                ComponentInstanceInput property) {
2372         List<String> pathKeys = new ArrayList<>();
2373         pathKeys.add(componentInstanceId);
2374         return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2375     }
2376
2377     public StorageOperationStatus updateComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) {
2378         List<String> pathKeys = new ArrayList<>();
2379         pathKeys.add(componentInstanceId);
2380         return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME);
2381     }
2382
2383     public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, List<ComponentInstanceInput> properties) {
2384         List<String> pathKeys = new ArrayList<>();
2385         pathKeys.add(componentInstanceId);
2386         return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, properties, pathKeys, JsonPresentationFields.NAME);
2387     }
2388
2389     public StorageOperationStatus updateComponentInstanceOutputs(Component containerComponent, String componentInstanceId, List<ComponentInstanceOutput> properties) {
2390         List<String> pathKeys = new ArrayList<>();
2391         pathKeys.add(componentInstanceId);
2392         return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, properties, pathKeys, JsonPresentationFields.NAME);
2393     }
2394
2395     public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
2396         List<String> pathKeys = new ArrayList<>();
2397         pathKeys.add(componentInstanceId);
2398         return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
2399     }
2400
2401     public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) {
2402         List<String> pathKeys = new ArrayList<>(){};
2403         pathKeys.add(componentInstanceId);
2404         return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME);
2405     }
2406
2407     public StorageOperationStatus createInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2408         String instUniqueId = componentInstance.getUniqueId();
2409
2410         // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2411         StorageOperationStatus result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId).either(v -> StorageOperationStatus.OK,
2412                  DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2413
2414         if (result == StorageOperationStatus.OK && componentInstance.getIsProxy()) {
2415             // create edge between container and service origin
2416             result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2417                         .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2418         }
2419         return result;
2420     }
2421
2422     public StorageOperationStatus createAllottedOfEdge(String componentId, String instanceId, String serviceUUID) {
2423         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentId);
2424         if (vertexById.isRight()) {
2425             log.debug("Failed to fetch component metadata vertex for id {} error {}", componentId, vertexById.right().value());
2426             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(vertexById.right().value());
2427         }
2428         GraphVertex metadataVertex = vertexById.left().value();
2429
2430         EnumMap<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
2431         props.put(GraphPropertyEnum.UUID, serviceUUID);
2432         props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
2433
2434         EnumMap<GraphPropertyEnum, Object> hasNot = new EnumMap<>(GraphPropertyEnum.class);
2435         hasNot.put(GraphPropertyEnum.IS_DELETED, true);
2436
2437         Either<List<GraphVertex>, JanusGraphOperationStatus> byCriteria = janusGraphDao
2438             .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, props,hasNot, JsonParseFlagEnum.ParseMetadata );
2439         if (byCriteria.isRight()) {
2440             log.debug("Failed to fetch vertex by criteria {} error {}", props, byCriteria.right().value());
2441             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(byCriteria.right().value());
2442         }
2443         List<GraphVertex> vertecies = byCriteria.left().value();
2444         StorageOperationStatus result = StorageOperationStatus.OK;
2445         if (vertecies != null) {
2446             GraphVertex serviceVertex = vertecies.get(0);
2447             //remove previous edges
2448
2449             log.debug("Try to create or update edge between resource {} and service {} ", metadataVertex, serviceVertex.getUniqueId());
2450             // create edge between container and service reference
2451             result = createOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.ALLOTTED_OF, serviceVertex.getUniqueId(), instanceId).either(v -> StorageOperationStatus.OK,
2452                     DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2453         }
2454         return result;
2455     }
2456
2457
2458     public StorageOperationStatus removeInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
2459         String instUniqueId = componentInstance.getUniqueId();
2460
2461         // create edge between container and origin ( in case of proxy this edge will be to ProxyService node type)
2462         StorageOperationStatus result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.INSTANCE_OF, componentInstance.getComponentUid(), instUniqueId)
2463                 .either(v -> StorageOperationStatus.OK,
2464                 DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2465
2466         if (componentInstance.getIsProxy()) {
2467             // create edge between container and service origin
2468             result = removeOrUpdateInstanceEdge(metadataVertex, EdgeLabelEnum.PROXY_OF, componentInstance.getSourceModelUid(), instUniqueId)
2469                     .either(v -> StorageOperationStatus.OK, DaoStatusConverter::convertJanusGraphStatusToStorageStatus);
2470         }
2471         return result;
2472     }
2473
2474     private Either<GraphVertex, JanusGraphOperationStatus> createOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2475         Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2476         properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2477
2478         return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties)
2479                 .left()
2480                 .bind(v -> addInstanceToPropertyOnEdge(instUniqueId, v, metadataVertex))
2481                 .right()
2482                 .bind(s -> createInstanceEdge(metadataVertex, edgeLabel, componentUid, instUniqueId, s));
2483     }
2484
2485     private Either<GraphVertex, JanusGraphOperationStatus> removeOrUpdateInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId) {
2486         Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
2487         properties.put(GraphPropertyEnum.UNIQUE_ID, componentUid);
2488
2489         return janusGraphDao.getEdgeByChildrenVertexProperties(metadataVertex, edgeLabel, properties).left().bind(v -> removeInstanceFromPropertyOnEdge(instUniqueId, v, metadataVertex)).right()
2490                 .map(err -> removeInstanceEdgeLogError(metadataVertex, edgeLabel, componentUid, err));
2491     }
2492
2493     private Either<GraphVertex, JanusGraphOperationStatus> addInstanceToPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2494         // edge exist need to add instance id to list on edge's property
2495         List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2496         if (property == null) {
2497             property = new ArrayList<>();
2498         }
2499         Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2500         if (!findFirst.isPresent()) {
2501             property.add(instUniqueId);
2502         }
2503         try {
2504             String jsonArr = JsonParserUtils.toJson(property);
2505             log.debug("Update INSTANCES edge property with value {} ", jsonArr);
2506             edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2507         } catch (IOException e) {
2508             log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2509            return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2510         }
2511         return Either.left(metadataVertex);
2512     }
2513
2514     private Either<GraphVertex, JanusGraphOperationStatus> removeInstanceFromPropertyOnEdge(String instUniqueId, Edge edge, GraphVertex metadataVertex) {
2515         // edge exist need to add instance id to list on edge's property
2516         List<String> property = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
2517         if (property == null) {
2518             property = new ArrayList<>();
2519         }
2520         Optional<String> findFirst = property.stream().filter(a -> a.equals(instUniqueId)).findFirst();
2521         if (findFirst.isPresent()) {
2522             property.remove(instUniqueId);
2523         }
2524         if (property.isEmpty()) {
2525             // For last instance need to remove edge
2526             edge.remove();
2527         } else {
2528             try {
2529                 String jsonArr = JsonParserUtils.toJson(property);
2530                 edge.property(EdgePropertyEnum.INSTANCES.getProperty(), jsonArr);
2531             } catch (IOException e) {
2532                 log.debug("Failed to convert INSTANCES edge property to json for container {}", metadataVertex.getUniqueId(), e);
2533                return Either.right(JanusGraphOperationStatus.GENERAL_ERROR);
2534             }
2535         }
2536         return Either.left(metadataVertex);
2537     }
2538
2539     private Either<GraphVertex, JanusGraphOperationStatus> createInstanceEdge(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, String instUniqueId, JanusGraphOperationStatus retrieveEdgeStatus) {
2540         if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2541             // create new edge
2542             Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(componentUid);
2543             if (vertexById.isRight()) {
2544                 return vertexById;
2545             }
2546             GraphVertex originVertex = vertexById.left().value();
2547             Map<EdgePropertyEnum, Object> edgeProps = new EnumMap<>(EdgePropertyEnum.class);
2548             List<String> instList = new ArrayList<>();
2549             instList.add(instUniqueId);
2550             edgeProps.put(EdgePropertyEnum.INSTANCES, instList);
2551
2552             log.debug("Create new edge {} between {} and {} and properties {} ", edgeLabel, metadataVertex.getUniqueId(), originVertex.getUniqueId(), edgeProps);
2553             JanusGraphOperationStatus
2554                 edgeResult = janusGraphDao
2555                 .createEdge(metadataVertex, originVertex, edgeLabel, edgeProps);
2556             return edgeResult == JanusGraphOperationStatus.OK ? Either.left(metadataVertex) : Either.right(edgeResult);
2557         }
2558         // error
2559         log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2560         return Either.right(retrieveEdgeStatus);
2561     }
2562
2563     private JanusGraphOperationStatus removeInstanceEdgeLogError(GraphVertex metadataVertex, EdgeLabelEnum edgeLabel, String componentUid, JanusGraphOperationStatus retrieveEdgeStatus) {
2564         if (retrieveEdgeStatus == JanusGraphOperationStatus.NOT_FOUND) {
2565             log.debug("No edge {} to remove between container {} and origin {}", edgeLabel, metadataVertex.getUniqueId(), componentUid);
2566         } else {
2567             // error
2568             log.debug("Failed to fetch edge with label {} and to vertex with id {} error {} ", edgeLabel, componentUid, retrieveEdgeStatus);
2569         }
2570         return retrieveEdgeStatus;
2571     }
2572
2573     public void removeAllAllotedEdges(String uniqueId) {
2574         Either<GraphVertex, JanusGraphOperationStatus> vertexById = janusGraphDao.getVertexById(uniqueId);
2575         if (vertexById.isLeft()) {
2576             GraphVertex originVertex = vertexById.left().value();
2577             JanusGraphVertex vertex = originVertex.getVertex();
2578             Iterator<Edge> edges = vertex.edges(Direction.OUT, EdgeLabelEnum.ALLOTTED_OF.name());
2579             while (edges != null && edges.hasNext()) {
2580                 Edge edge = edges.next();
2581                 edge.remove();
2582             }
2583         }
2584     }
2585 }