2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.components.impl;
22 import static org.openecomp.sdc.be.components.attribute.GetOutputUtils.isGetOutputValueForOutput;
23 import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
24 import static org.openecomp.sdc.be.components.utils.PropertiesUtils.getPropertyCapabilityOfChildInstance;
26 import com.google.common.collect.Sets;
27 import fj.data.Either;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.Collection;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.Iterator;
34 import java.util.List;
36 import java.util.Map.Entry;
37 import java.util.Objects;
38 import java.util.Optional;
40 import java.util.UUID;
41 import java.util.stream.Collectors;
42 import org.apache.commons.collections.CollectionUtils;
43 import org.apache.commons.collections.MapUtils;
44 import org.apache.commons.lang3.StringUtils;
45 import org.apache.commons.lang3.tuple.ImmutablePair;
46 import org.onap.sdc.tosca.datatypes.model.PropertyType;
47 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
48 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
49 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
50 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
51 import org.openecomp.sdc.be.components.impl.exceptions.ToscaFunctionExceptionSupplier;
52 import org.openecomp.sdc.be.components.impl.exceptions.ToscaGetFunctionExceptionSupplier;
53 import org.openecomp.sdc.be.components.impl.instance.ComponentInstanceChangeOperationOrchestrator;
54 import org.openecomp.sdc.be.components.impl.utils.DirectivesUtil;
55 import org.openecomp.sdc.be.components.merge.instance.ComponentInstanceMergeDataBusinessLogic;
56 import org.openecomp.sdc.be.components.merge.instance.DataForMergeHolder;
57 import org.openecomp.sdc.be.components.utils.PropertiesUtils;
58 import org.openecomp.sdc.be.components.validation.ComponentValidations;
59 import org.openecomp.sdc.be.config.BeEcompErrorManager;
60 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
61 import org.openecomp.sdc.be.config.ConfigurationManager;
62 import org.openecomp.sdc.be.dao.api.ActionStatus;
63 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
64 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
65 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
66 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
67 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
68 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
69 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
70 import org.openecomp.sdc.be.datatypes.elements.GetOutputValueDataDefinition;
71 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
72 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
73 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
74 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
75 import org.openecomp.sdc.be.datatypes.elements.ToscaGetFunctionDataDefinition;
76 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
77 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
78 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
79 import org.openecomp.sdc.be.datatypes.enums.PropertySource;
80 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
81 import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType;
82 import org.openecomp.sdc.be.exception.BusinessException;
83 import org.openecomp.sdc.be.impl.ComponentsUtils;
84 import org.openecomp.sdc.be.impl.ForwardingPathUtils;
85 import org.openecomp.sdc.be.impl.ServiceFilterUtils;
86 import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
87 import org.openecomp.sdc.be.model.ArtifactDefinition;
88 import org.openecomp.sdc.be.model.AttributeDefinition;
89 import org.openecomp.sdc.be.model.CapabilityDefinition;
90 import org.openecomp.sdc.be.model.Component;
91 import org.openecomp.sdc.be.model.ComponentInstance;
92 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
93 import org.openecomp.sdc.be.model.ComponentInstanceInput;
94 import org.openecomp.sdc.be.model.ComponentInstanceOutput;
95 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
96 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
97 import org.openecomp.sdc.be.model.ComponentParametersView;
98 import org.openecomp.sdc.be.model.DataTypeDefinition;
99 import org.openecomp.sdc.be.model.GroupDefinition;
100 import org.openecomp.sdc.be.model.InputDefinition;
101 import org.openecomp.sdc.be.model.InterfaceDefinition;
102 import org.openecomp.sdc.be.model.LifecycleStateEnum;
103 import org.openecomp.sdc.be.model.OutputDefinition;
104 import org.openecomp.sdc.be.model.PolicyDefinition;
105 import org.openecomp.sdc.be.model.PropertyDefinition;
106 import org.openecomp.sdc.be.model.RelationshipInfo;
107 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
108 import org.openecomp.sdc.be.model.RequirementDefinition;
109 import org.openecomp.sdc.be.model.Resource;
110 import org.openecomp.sdc.be.model.Service;
111 import org.openecomp.sdc.be.model.ToscaPropertyData;
112 import org.openecomp.sdc.be.model.User;
113 import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
114 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
115 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
116 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
117 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
118 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeTemplateOperation;
119 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
120 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
121 import org.openecomp.sdc.be.model.operations.StorageException;
122 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
123 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
124 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
125 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
126 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
127 import org.openecomp.sdc.be.model.operations.impl.ComponentInstanceOperation;
128 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
129 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
130 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
131 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
132 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
133 import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
134 import org.openecomp.sdc.be.user.Role;
135 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
136 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
137 import org.openecomp.sdc.common.api.Constants;
138 import org.openecomp.sdc.common.datastructure.Wrapper;
139 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
140 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
141 import org.openecomp.sdc.common.log.elements.ErrorLogOptionalData;
142 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
143 import org.openecomp.sdc.common.log.wrappers.Logger;
144 import org.openecomp.sdc.common.util.ValidationUtils;
145 import org.openecomp.sdc.exception.ResponseFormat;
146 import org.springframework.beans.factory.annotation.Autowired;
148 @org.springframework.stereotype.Component
149 public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
151 private static final Logger log = Logger.getLogger(ComponentInstanceBusinessLogic.class);
152 private static final String VF_MODULE = "org.openecomp.groups.VfModule";
153 private static final String TRY_TO_CREATE_ENTRY_ON_GRAPH = "Try to create entry on graph";
154 private static final String CLOUD_SPECIFIC_FIXED_KEY_WORD = "cloudtech";
155 private static final String[][] CLOUD_SPECIFIC_KEY_WORDS = {{"k8s", "azure", "aws"}, /* cloud specific technology */
156 {"charts", "day0", "configtemplate"} /*cloud specific sub type*/};
157 private static final String FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE = "Failed to create entry on graph for component instance {}";
158 private static final String ENTITY_ON_GRAPH_IS_CREATED = "Entity on graph is created.";
159 private static final String INVALID_COMPONENT_TYPE = "invalid component type";
160 private static final String FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID = "Failed to retrieve component, component id {}";
161 private static final String FAILED_TO_LOCK_SERVICE = "Failed to lock service {}";
162 private static final String CREATE_OR_UPDATE_PROPERTY_VALUE = "CreateOrUpdatePropertyValue";
163 private static final String FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS = "Failed to copy the component instance to the canvas";
164 private static final String COPY_COMPONENT_INSTANCE_OK = "Copy component instance OK";
165 private static final String CANNOT_ATTACH_RESOURCE_INSTANCES_TO_CONTAINER_RESOURCE_OF_TYPE = "Cannot attach resource instances to container resource of type {}";
166 private static final String FAILED_TO_UPDATE_COMPONENT_INSTANCE_CAPABILITY = "Failed to update component instance capability on instance {} in "
168 private static final String SERVICE_PROXY = "serviceProxy";
169 private static final String ASSOCIATE_RI_TO_RI = "associateRIToRI";
170 private static final String COMPONENT_ARCHIVED = "Component is archived. Component id: {}";
171 private static final String RESTRICTED_OPERATION_ON_SERVIVE = "Restricted operation for user: {} on service {}";
172 private static final String FAILED_TO_LOCK_COMPONENT = "Failed to lock component {}";
173 private static final String RESTRICTED_OPERATION_ON_COMPONENT = "Restricted operation for user: {} on component {}";
174 private static final String RESOURCE_INSTANCE = "resource instance";
175 private static final String SERVICE = "service";
177 private final ComponentInstanceOperation componentInstanceOperation;
178 private final ArtifactsBusinessLogic artifactBusinessLogic;
179 private final ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
180 private final ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
181 private final ForwardingPathOperation forwardingPathOperation;
182 private final NodeFilterOperation nodeFilterOperation;
184 private CompositionBusinessLogic compositionBusinessLogic;
186 private ContainerInstanceTypesData containerInstanceTypesData;
189 public ComponentInstanceBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation,
190 IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation,
191 InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
192 ComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
193 ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL,
194 ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator,
195 ForwardingPathOperation forwardingPathOperation, NodeFilterOperation nodeFilterOperation,
196 ArtifactsOperations artifactToscaOperation) {
197 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
198 artifactToscaOperation);
199 this.componentInstanceOperation = componentInstanceOperation;
200 this.artifactBusinessLogic = artifactBusinessLogic;
201 this.compInstMergeDataBL = compInstMergeDataBL;
202 this.onChangeInstanceOperationOrchestrator = onChangeInstanceOperationOrchestrator;
203 this.forwardingPathOperation = forwardingPathOperation;
204 this.nodeFilterOperation = nodeFilterOperation;
207 public ComponentInstance createComponentInstance(String containerComponentParam, String containerComponentId, String userId,
208 ComponentInstance resourceInstance) {
209 return createComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, true);
212 public List<ComponentInstanceProperty> getComponentInstancePropertiesByInputId(org.openecomp.sdc.be.model.Component component, String inputId) {
213 List<ComponentInstanceProperty> resList = new ArrayList<>();
214 Map<String, List<ComponentInstanceProperty>> ciPropertiesMap = component.getComponentInstancesProperties();
215 if (ciPropertiesMap != null && !ciPropertiesMap.isEmpty()) {
216 ciPropertiesMap.forEach((s, ciPropList) -> {
218 Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(s)).findAny();
219 if (ciOp.isPresent()) {
220 ciName = ciOp.get().getName();
222 if (ciPropList != null && !ciPropList.isEmpty()) {
223 for (ComponentInstanceProperty prop : ciPropList) {
224 List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
225 addCompInstanceProperty(s, ciName, prop, inputsValues, inputId, resList);
233 public List<ComponentInstanceAttribute> getComponentInstanceAttributesByOutputId(final org.openecomp.sdc.be.model.Component component,
234 final String outputId) {
235 final List<ComponentInstanceAttribute> resList = new ArrayList<>();
236 final Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = component.getComponentInstancesAttributes();
237 if (org.apache.commons.collections4.MapUtils.isNotEmpty(componentInstancesAttributes)) {
238 componentInstancesAttributes.forEach((s, componentInstanceAttributeList) -> {
240 final Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(s))
242 if (ciOp.isPresent()) {
243 ciName = ciOp.get().getName();
245 if (componentInstanceAttributeList != null && !componentInstanceAttributeList.isEmpty()) {
246 for (final ComponentInstanceAttribute compInstanceAttribute : componentInstanceAttributeList) {
247 List<GetOutputValueDataDefinition> outputValues = compInstanceAttribute.getGetOutputValues();
248 addCompInstanceAttribute(s, ciName, compInstanceAttribute, outputValues, outputId, resList);
256 private void addCompInstanceProperty(String s, String ciName, ComponentInstanceProperty prop, List<GetInputValueDataDefinition> inputsValues,
257 String inputId, List<ComponentInstanceProperty> resList) {
258 if (inputsValues != null && !inputsValues.isEmpty()) {
259 for (GetInputValueDataDefinition inputData : inputsValues) {
260 if (isGetInputValueForInput(inputData, inputId)) {
261 prop.setComponentInstanceId(s);
262 prop.setComponentInstanceName(ciName);
270 private void addCompInstanceAttribute(final String s, final String ciName, final ComponentInstanceAttribute attribute,
271 final List<GetOutputValueDataDefinition> outputsValues, final String outputId,
272 final List<ComponentInstanceAttribute> resList) {
273 if (outputsValues != null && !outputsValues.isEmpty()) {
274 for (final GetOutputValueDataDefinition outputData : outputsValues) {
275 if (isGetOutputValueForOutput(outputData, outputId)) {
276 attribute.setComponentInstanceId(s);
277 attribute.setComponentInstanceName(ciName);
278 resList.add(attribute);
285 public Optional<ComponentInstanceProperty> getComponentInstancePropertyByPolicyId(Component component, PolicyDefinition policy) {
286 Optional<ComponentInstanceProperty> propertyCandidate = getComponentInstancePropertyByPolicy(component, policy);
287 if (propertyCandidate.isPresent()) {
288 ComponentInstanceProperty componentInstanceProperty = propertyCandidate.get();
289 Optional<GetPolicyValueDataDefinition> getPolicyCandidate = getGetPolicyValueDataDefinition(policy, componentInstanceProperty);
291 .ifPresent(getPolicyValue -> updateComponentInstancePropertyAfterUndeclaration(componentInstanceProperty, getPolicyValue, policy));
292 return Optional.of(componentInstanceProperty);
294 return Optional.empty();
297 private void updateComponentInstancePropertyAfterUndeclaration(ComponentInstanceProperty componentInstanceProperty,
298 GetPolicyValueDataDefinition getPolicyValue, PolicyDefinition policyDefinition) {
299 componentInstanceProperty.setValue(getPolicyValue.getOrigPropertyValue());
300 List<GetPolicyValueDataDefinition> getPolicyValues = componentInstanceProperty.getGetPolicyValues();
301 if (CollectionUtils.isNotEmpty(getPolicyValues)) {
302 getPolicyValues.remove(getPolicyValue);
303 componentInstanceProperty.setGetPolicyValues(getPolicyValues);
304 policyDefinition.setGetPolicyValues(getPolicyValues);
308 private Optional<GetPolicyValueDataDefinition> getGetPolicyValueDataDefinition(PolicyDefinition policy,
309 ComponentInstanceProperty componentInstanceProperty) {
310 List<GetPolicyValueDataDefinition> getPolicyValues = policy.getGetPolicyValues();
311 return getPolicyValues.stream().filter(getPolicyValue -> getPolicyValue.getPropertyName().equals(componentInstanceProperty.getName()))
315 private Optional<ComponentInstanceProperty> getComponentInstancePropertyByPolicy(Component component, PolicyDefinition policy) {
316 Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = component.getComponentInstancesProperties();
317 if (MapUtils.isEmpty(componentInstancesProperties)) {
318 return Optional.empty();
320 String instanceUniqueId = policy.getInstanceUniqueId();
321 List<ComponentInstanceProperty> componentInstanceProperties =
322 componentInstancesProperties.containsKey(instanceUniqueId) ? componentInstancesProperties.get(instanceUniqueId) : new ArrayList<>();
323 return componentInstanceProperties.stream().filter(property -> property.getName().equals(policy.getName())).findAny();
326 public List<ComponentInstanceInput> getComponentInstanceInputsByInputId(org.openecomp.sdc.be.model.Component component, String inputId) {
327 List<ComponentInstanceInput> resList = new ArrayList<>();
328 Map<String, List<ComponentInstanceInput>> ciInputsMap = component.getComponentInstancesInputs();
329 if (ciInputsMap != null && !ciInputsMap.isEmpty()) {
330 ciInputsMap.forEach((s, ciPropList) -> {
332 Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(s)).findAny();
333 if (ciOp.isPresent()) {
334 ciName = ciOp.get().getName();
336 if (ciPropList != null && !ciPropList.isEmpty()) {
337 for (ComponentInstanceInput prop : ciPropList) {
338 List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
339 addCompInstanceInput(s, ciName, prop, inputsValues, inputId, resList);
347 public List<ComponentInstanceOutput> getComponentInstanceOutputsByOutputId(final org.openecomp.sdc.be.model.Component component,
348 final String outputId) {
349 final List<ComponentInstanceOutput> resList = new ArrayList<>();
350 final Map<String, List<ComponentInstanceOutput>> ciInputsMap = component.getComponentInstancesOutputs();
351 if (ciInputsMap != null && !ciInputsMap.isEmpty()) {
352 ciInputsMap.forEach((s, ciPropList) -> {
354 final Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(s))
356 if (ciOp.isPresent()) {
357 ciName = ciOp.get().getName();
359 if (ciPropList != null && !ciPropList.isEmpty()) {
360 for (final ComponentInstanceOutput prop : ciPropList) {
361 final List<GetOutputValueDataDefinition> outputValues = prop.getGetOutputValues();
362 addCompInstanceOutput(s, ciName, prop, outputValues, outputId, resList);
370 private void addCompInstanceInput(String s, String ciName, ComponentInstanceInput prop, List<GetInputValueDataDefinition> inputsValues,
371 String inputId, List<ComponentInstanceInput> resList) {
372 if (inputsValues != null && !inputsValues.isEmpty()) {
373 for (GetInputValueDataDefinition inputData : inputsValues) {
374 if (isGetInputValueForInput(inputData, inputId)) {
375 prop.setComponentInstanceId(s);
376 prop.setComponentInstanceName(ciName);
384 private void addCompInstanceOutput(final String s, final String ciName, final ComponentInstanceOutput prop,
385 final List<GetOutputValueDataDefinition> outputsValues, final String outputId,
386 final List<ComponentInstanceOutput> resList) {
387 if (outputsValues != null && !outputsValues.isEmpty()) {
388 for (final GetOutputValueDataDefinition outputData : outputsValues) {
389 if (isGetOutputValueForOutput(outputData, outputId)) {
390 prop.setComponentInstanceId(s);
391 prop.setComponentInstanceName(ciName);
399 public ComponentInstance createComponentInstance(final String containerComponentParam, final String containerComponentId, final String userId,
400 final ComponentInstance resourceInstance, final boolean needLock) {
401 final User user = validateUserExists(userId);
402 validateUserNotEmpty(user, "Create component instance");
403 validateJsonBody(resourceInstance, ComponentInstance.class);
404 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
405 final org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
406 if (ModelConverter.isAtomicComponent(containerComponent)) {
407 if (log.isDebugEnabled()) {
408 log.debug(CANNOT_ATTACH_RESOURCE_INSTANCES_TO_CONTAINER_RESOURCE_OF_TYPE, containerComponent.assetType());
410 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
412 validateCanWorkOnComponent(containerComponent, userId);
413 Component origComponent = null;
414 if (resourceInstance != null && containerComponentType != null) {
415 final OriginTypeEnum originType = resourceInstance.getOriginType();
416 validateInstanceName(resourceInstance);
417 if (originType == OriginTypeEnum.ServiceProxy) {
418 origComponent = getOrigComponentForServiceProxy(containerComponent, resourceInstance);
419 } else if (originType == OriginTypeEnum.ServiceSubstitution) {
420 origComponent = getOrigComponentForServiceSubstitution(resourceInstance);
422 origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
423 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
425 validateResourceInstanceState(containerComponent, origComponent);
426 overrideFields(origComponent, resourceInstance);
427 compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
429 return createComponent(needLock, containerComponent, origComponent, resourceInstance, user);
432 private Component getOrigComponentForServiceProxy(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance resourceInstance) {
433 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName(SERVICE_PROXY, null);
434 if (isServiceProxyOrigin(serviceProxyOrigin)) {
435 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
437 Component origComponent = serviceProxyOrigin.left().value();
438 StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
439 if (isFillProxyRes(fillProxyRes)) {
440 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
442 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, OriginTypeEnum.ServiceProxy);
443 return origComponent;
446 private Component getOrigComponentForServiceSubstitution(ComponentInstance resourceInstance) {
447 final Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade
448 .getToscaFullElement(resourceInstance.getComponentUid());
449 if (getServiceResult.isRight()) {
450 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
452 final Component service = getServiceResult.left().value();
453 final Either<Component, StorageOperationStatus> getServiceDerivedFromTypeResult = toscaOperationFacade
454 .getLatestByToscaResourceName(service.getDerivedFromGenericType(), service.getModel());
455 if (getServiceDerivedFromTypeResult.isRight()) {
456 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
458 Component origComponent = getServiceDerivedFromTypeResult.left().value();
459 final StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
460 if (isFillProxyRes(fillProxyRes)) {
461 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
463 return origComponent;
466 private ComponentInstance createComponent(boolean needLock, Component containerComponent, Component origComponent,
467 ComponentInstance resourceInstance, User user) {
468 boolean failed = false;
470 lockIfNeed(needLock, containerComponent);
471 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
472 return createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
473 } catch (ComponentException e) {
478 unlockComponent(failed, containerComponent);
484 * Try using either to make a judgment
486 * @param containerComponentParam
487 * @param containerComponentId
489 * @param resourceInstance
492 public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId,
493 String userId, ComponentInstance resourceInstance) {
494 log.debug("enter createRealComponentInstance");
495 return createRealComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, true);
499 * Try using either to make a judgment
502 * @param containerComponentParam
503 * @param containerComponentId
505 * @param resourceInstance
508 public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId,
509 String userId, ComponentInstance resourceInstance,
511 log.debug("enter createRealComponentInstance");
512 Component origComponent = null;
514 org.openecomp.sdc.be.model.Component containerComponent = null;
515 ComponentTypeEnum containerComponentType;
517 user = validateUserExists(userId);
518 validateUserNotEmpty(user, "Create component instance");
519 validateJsonBody(resourceInstance, ComponentInstance.class);
520 containerComponentType = validateComponentType(containerComponentParam);
521 containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
522 log.debug("enter createRealComponentInstance,validate user json success");
523 if (ModelConverter.isAtomicComponent(containerComponent)) {
524 log.debug(CANNOT_ATTACH_RESOURCE_INSTANCES_TO_CONTAINER_RESOURCE_OF_TYPE, containerComponent.assetType());
525 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
527 validateCanWorkOnComponent(containerComponent, userId);
528 log.debug("enter createRealComponentInstance,validateCanWorkOnComponent success");
529 if (resourceInstance != null && containerComponentType != null) {
530 log.debug("enter createRealComponentInstance,start create ComponentInstance");
531 OriginTypeEnum originType = resourceInstance.getOriginType();
532 validateInstanceName(resourceInstance);
533 if (originType == OriginTypeEnum.ServiceProxy) {
534 log.debug("enter createRealComponentInstance,originType equals ServiceProxy");
535 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName(SERVICE_PROXY, null);
536 if (isServiceProxyOrigin(serviceProxyOrigin)) {
537 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
539 origComponent = serviceProxyOrigin.left().value();
540 StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
541 if (isFillProxyRes(fillProxyRes)) {
542 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
545 log.debug("enter createRealComponentInstance,originType is not ServiceProxy");
546 origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
548 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
549 validateResourceInstanceState(containerComponent, origComponent);
550 overrideFields(origComponent, resourceInstance);
551 compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
552 log.debug("enter createRealComponentInstance,final validate success");
554 return createRealComponent(needLock, containerComponent, origComponent, resourceInstance, user);
555 } catch (ComponentException e) {
556 log.debug("create Real Component Instance failed");
561 private Either<ComponentInstance, ResponseFormat> createRealComponent(boolean needLock, Component containerComponent, Component origComponent,
562 ComponentInstance resourceInstance, User user) {
563 log.debug("enter createRealComponent");
564 boolean failed = false;
566 lockIfNeed(needLock, containerComponent);
567 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
568 return createRealComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
569 } catch (ComponentException e) {
574 unlockComponent(failed, containerComponent);
579 private Either<ComponentInstance, ResponseFormat> createRealComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent,
580 Component originComponent,
581 ComponentInstance componentInstance, User user) {
582 log.debug("enter createRealComponentInstanceOnGraph");
583 Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade
584 .addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
585 if (result.isRight()) {
586 log.debug("enter createRealComponentInstanceOnGraph,result is right");
587 ActionStatus status = componentsUtils.convertFromStorageResponse(result.right().value());
588 log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
589 return Either.right(componentsUtils.getResponseFormat(status));
591 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
592 log.debug("enter createRealComponentInstanceOnGraph,Entity on graph is created.");
593 Component updatedComponent = result.left().value().getLeft();
594 Map<String, String> existingEnvVersions = new HashMap<>();
595 // TODO existingEnvVersions ??
596 addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
597 Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream()
598 .filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
599 if (!updatedInstanceOptional.isPresent()) {
600 log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
601 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
603 log.debug("enter createRealComponentInstanceOnGraph,and final success");
604 return Either.left(updatedInstanceOptional.get());
607 private void overrideFields(Component origComponent, ComponentInstance resourceInstance) {
608 resourceInstance.setComponentVersion(origComponent.getVersion());
609 resourceInstance.setIcon(origComponent.getIcon());
612 private void validateInstanceName(ComponentInstance resourceInstance) {
613 String resourceInstanceName = resourceInstance.getName();
614 if (StringUtils.isEmpty(resourceInstanceName)) {
615 log.debug("ComponentInstance name is empty");
616 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
618 if (!ValidationUtils.validateComponentNameLength(resourceInstanceName)) {
619 log.debug("ComponentInstance name exceeds max length {} ", ValidationUtils.COMPONENT_NAME_MAX_LENGTH);
620 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
622 if (!ValidationUtils.validateComponentNamePattern(resourceInstanceName)) {
623 log.debug("ComponentInstance name {} has invalid format", resourceInstanceName);
624 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
628 private void validateResourceInstanceState(Component containerComponent, Component origComponent) {
629 if (origComponent.getLifecycleState() == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
630 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
631 containerComponent.getComponentType().getValue(), origComponent.getLifecycleState().toString());
635 private void validateOriginAndResourceInstanceTypes(final Component containerComponent, final Component origComponent,
636 final OriginTypeEnum originType) {
637 final ResourceTypeEnum resourceType = getResourceTypeEnumFromOriginComponent(origComponent);
638 validateOriginType(originType, resourceType);
639 validateOriginComponentIsValidForContainer(containerComponent, resourceType);
642 private void validateOriginComponentIsValidForContainer(Component containerComponent, ResourceTypeEnum resourceType) {
643 switch (containerComponent.getComponentType()) {
645 if (!containerInstanceTypesData.isAllowedForServiceComponent(resourceType, containerComponent.getModel())) {
646 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
647 containerComponent.getComponentType().toString(), resourceType.name());
651 final ResourceTypeEnum componentResourceType = ((Resource) containerComponent).getResourceType();
652 if (!containerInstanceTypesData.isAllowedForResourceComponent(componentResourceType, resourceType)) {
653 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
654 containerComponent.getComponentType().toString(), resourceType.name());
658 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
662 private void validateOriginType(OriginTypeEnum originType, ResourceTypeEnum resourceType) {
663 ResourceTypeEnum convertedOriginType;
665 convertedOriginType = ResourceTypeEnum.getTypeIgnoreCase(originType.name());
666 } catch (Exception e) {
667 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
669 if (resourceType != convertedOriginType) {
670 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
674 private ResourceTypeEnum getResourceTypeEnumFromOriginComponent(final Component origComponent) {
675 switch (origComponent.getComponentType()) {
677 return ResourceTypeEnum.ServiceProxy;
679 return ((Resource) origComponent).getResourceType();
681 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
685 private void lockIfNeed(boolean needLock, Component containerComponent) {
687 lockComponent(containerComponent, "createComponentInstance");
691 private boolean isServiceProxyOrigin(Either<Component, StorageOperationStatus> serviceProxyOrigin) {
692 if (serviceProxyOrigin.isRight()) {
693 log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
699 private StorageOperationStatus fillInstanceData(ComponentInstance resourceInstance, Component origComponent) {
700 final ComponentParametersView filter = new ComponentParametersView(true);
701 filter.setIgnoreCapabilities(false);
702 filter.setIgnoreCapabiltyProperties(false);
703 filter.setIgnoreComponentInstances(false);
704 filter.setIgnoreRequirements(false);
705 filter.setIgnoreInterfaces(false);
706 filter.setIgnoreProperties(false);
707 filter.setIgnoreAttributes(false);
708 filter.setIgnoreInputs(false);
709 Either<Component, StorageOperationStatus> serviceRes = toscaOperationFacade.getToscaElement(resourceInstance.getComponentUid(), filter);
710 if (serviceRes.isRight()) {
711 return serviceRes.right().value();
713 final Component service = serviceRes.left().value();
714 final Map<String, List<CapabilityDefinition>> capabilities = service.getCapabilities();
715 resourceInstance.setCapabilities(capabilities);
716 final Map<String, List<RequirementDefinition>> req = service.getRequirements();
717 resourceInstance.setRequirements(req);
718 final Map<String, InterfaceDefinition> serviceInterfaces = service.getInterfaces();
719 if (MapUtils.isNotEmpty(serviceInterfaces)) {
720 serviceInterfaces.forEach(resourceInstance::addInterface);
722 resourceInstance.setProperties(PropertiesUtils.getProperties(service));
723 resourceInstance.setAttributes(service.getAttributes());
724 final List<InputDefinition> serviceInputs = service.getInputs();
725 resourceInstance.setInputs(serviceInputs);
726 resourceInstance.setSourceModelInvariant(service.getInvariantUUID());
727 resourceInstance.setSourceModelName(service.getName());
728 resourceInstance.setSourceModelUuid(service.getUUID());
729 resourceInstance.setSourceModelUid(service.getUniqueId());
730 resourceInstance.setComponentUid(origComponent.getUniqueId());
731 resourceInstance.setComponentVersion(service.getVersion());
732 switch (resourceInstance.getOriginType()) {
734 return fillProxyInstanceData(resourceInstance, origComponent, service);
735 case ServiceSubstitution:
736 return fillServiceSubstitutableNodeTypeData(resourceInstance, service);
738 return StorageOperationStatus.OK;
742 private StorageOperationStatus fillProxyInstanceData(final ComponentInstance resourceInstance, final Component origComponent,
743 final Component service) {
744 final String name = ValidationUtils.normalizeComponentInstanceName(service.getName()) + ToscaOperationFacade.PROXY_SUFFIX;
745 final String toscaResourceName = ((Resource) origComponent).getToscaResourceName();
746 final int lastIndexOf = toscaResourceName.lastIndexOf('.');
747 if (lastIndexOf != -1) {
748 final String proxyToscaName = toscaResourceName.substring(0, lastIndexOf + 1) + name;
749 resourceInstance.setToscaComponentName(proxyToscaName);
751 resourceInstance.setName(name);
752 resourceInstance.setIsProxy(true);
753 resourceInstance.setDescription("A Proxy for Service " + service.getName());
754 return StorageOperationStatus.OK;
757 private StorageOperationStatus fillServiceSubstitutableNodeTypeData(final ComponentInstance resourceInstance, final Component service) {
758 resourceInstance.setToscaComponentName("org.openecomp.service." + ValidationUtils.convertToSystemName(service.getName()));
759 resourceInstance.setName(ValidationUtils.normalizeComponentInstanceName(service.getName()));
760 resourceInstance.setIsProxy(false);
761 resourceInstance.setDescription("A substitutable node type for service " + service.getName());
762 return StorageOperationStatus.OK;
765 public Either<CreateAndAssotiateInfo, ResponseFormat> createAndAssociateRIToRI(String containerComponentParam, String containerComponentId,
766 String userId, CreateAndAssotiateInfo createAndAssotiateInfo) {
767 Either<CreateAndAssotiateInfo, ResponseFormat> resultOp = null;
768 ComponentInstance resourceInstance = createAndAssotiateInfo.getNode();
769 RequirementCapabilityRelDef associationInfo = createAndAssotiateInfo.getAssociate();
770 User user = validateUserExists(userId);
771 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
772 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
773 if (ModelConverter.isAtomicComponent(containerComponent)) {
774 log.debug(CANNOT_ATTACH_RESOURCE_INSTANCES_TO_CONTAINER_RESOURCE_OF_TYPE, containerComponent.assetType());
776 .right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType()));
778 validateCanWorkOnComponent(containerComponent, userId);
779 boolean failed = false;
781 lockComponent(containerComponent, "createAndAssociateRIToRI");
782 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
783 Component origComponent = getOriginComponentFromComponentInstance(resourceInstance);
784 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
785 ComponentInstance resResourceInfo = createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
786 if (associationInfo.getFromNode() == null || associationInfo.getFromNode().isEmpty()) {
787 associationInfo.setFromNode(resResourceInfo.getUniqueId());
789 associationInfo.setToNode(resResourceInfo.getUniqueId());
791 Either<RequirementCapabilityRelDef, StorageOperationStatus> resultReqCapDef = toscaOperationFacade
792 .associateResourceInstances(containerComponent, containerComponentId, associationInfo);
793 if (resultReqCapDef.isLeft()) {
794 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
795 RequirementCapabilityRelDef resReqCapabilityRelDef = resultReqCapDef.left().value();
796 CreateAndAssotiateInfo resInfo = new CreateAndAssotiateInfo(resResourceInfo, resReqCapabilityRelDef);
797 resultOp = Either.left(resInfo);
800 log.info("Failed to associate node {} with node {}", associationInfo.getFromNode(), associationInfo.getToNode());
801 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(
802 componentsUtils.convertFromStorageResponseForResourceInstance(resultReqCapDef.right().value(), true), "", null));
805 } catch (ComponentException e) {
809 unlockComponent(failed, containerComponent);
813 private Component getOriginComponentFromComponentInstance(ComponentInstance componentInstance) {
814 return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getComponentUid());
817 private Component getInstanceOriginNode(ComponentInstance componentInstance) {
818 return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getActualComponentUid());
821 private Component getOriginComponentFromComponentInstance(String componentInstanceName, String origComponetId) {
822 Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaFullElement(origComponetId);
823 if (eitherComponent.isRight()) {
824 log.debug("Failed to get origin component with id {} for component instance {} ", origComponetId, componentInstanceName);
825 throw new ByActionStatusComponentException(
826 componentsUtils.convertFromStorageResponse(eitherComponent.right().value(), ComponentTypeEnum.RESOURCE), "", null);
828 return eitherComponent.left().value();
831 private ComponentInstance createComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent,
832 ComponentInstance componentInstance, User user) {
833 Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade
834 .addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
835 if (result.isRight()) {
836 log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
837 throw new ByResponseFormatComponentException(componentsUtils
838 .getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), "",
841 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
842 Component updatedComponent = result.left().value().getLeft();
843 Map<String, String> existingEnvVersions = new HashMap<>();
844 // TODO existingEnvVersions ??
845 addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
846 Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream()
847 .filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
848 if (!updatedInstanceOptional.isPresent()) {
849 log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
850 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
852 return updatedInstanceOptional.get();
855 public boolean isCloudSpecificArtifact(String artifact) {
856 if (artifact.contains(CLOUD_SPECIFIC_FIXED_KEY_WORD)) {
857 for (int i = 0; i < CLOUD_SPECIFIC_KEY_WORDS.length; i++) {
858 if (Arrays.stream(CLOUD_SPECIFIC_KEY_WORDS[i]).noneMatch(artifact::contains)) {
869 * addResourceInstanceArtifacts - add artifacts (HEAT_ENV) to resource instance The instance artifacts are generated from the resource's
872 * @param containerComponent
873 * @param componentInstance
874 * @param originComponent
876 * @param existingEnvVersions
879 protected ActionStatus addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance,
880 org.openecomp.sdc.be.model.Component originComponent, User user,
881 Map<String, String> existingEnvVersions) {
882 log.debug("add artifacts to resource instance");
883 List<GroupDefinition> filteredGroups = new ArrayList<>();
884 ActionStatus status = setResourceArtifactsOnResourceInstance(componentInstance);
885 if (ActionStatus.OK != status) {
886 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(status, "", null));
888 StorageOperationStatus artStatus;
889 // generate heat_env if necessary
890 Map<String, ArtifactDefinition> componentDeploymentArtifacts = componentInstance.getDeploymentArtifacts();
891 if (MapUtils.isNotEmpty(componentDeploymentArtifacts)) {
892 Map<String, ArtifactDefinition> finalDeploymentArtifacts = new HashMap<>();
893 Map<String, List<ArtifactDefinition>> groupInstancesArtifacts = new HashMap<>();
894 Integer defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout()
895 .getDefaultMinutes();
896 List<ArtifactDefinition> listOfCloudSpecificArts = new ArrayList<>();
897 for (ArtifactDefinition artifact : componentDeploymentArtifacts.values()) {
898 String type = artifact.getArtifactType();
899 if (!type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())) {
900 finalDeploymentArtifacts.put(artifact.getArtifactLabel(), artifact);
902 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HELM.getType()) || type
903 .equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()) || type
904 .equalsIgnoreCase(ArtifactTypeEnum.CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT.getType())) {
905 artifact.setTimeout(defaultHeatTimeout);
909 if (artifact.checkEsIdExist()) {
910 ArtifactDefinition artifactDefinition = artifactBusinessLogic
911 .createHeatEnvPlaceHolder(new ArrayList<>(), artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(),
912 NodeTypeEnum.ResourceInstance, componentInstance.getName(), user, containerComponent, existingEnvVersions);
914 finalDeploymentArtifacts.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
915 if (CollectionUtils.isNotEmpty(originComponent.getGroups())) {
916 filteredGroups = originComponent.getGroups().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
918 if (isCloudSpecificArtifact(artifactDefinition.getArtifactName())) {
919 listOfCloudSpecificArts.add(artifact);
921 if (CollectionUtils.isNotEmpty(filteredGroups)) {
922 filteredGroups.stream()
923 .filter(g -> g.getArtifacts() != null && g.getArtifacts().stream().anyMatch(p -> p.equals(artifactDefinition.getGeneratedFromId()))).findFirst()
924 .ifPresent(g -> fillInstanceArtifactMap(groupInstancesArtifacts, artifactDefinition, g));
928 groupInstancesArtifacts.forEach((k, v) -> v.addAll(listOfCloudSpecificArts));
929 filteredGroups.forEach(g -> listOfCloudSpecificArts.forEach(e -> {
930 g.getArtifactsUuid().add(e.getArtifactUUID());
931 g.getArtifacts().add(e.getUniqueId());
933 artStatus = toscaOperationFacade
934 .addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, finalDeploymentArtifacts);
935 if (artStatus != StorageOperationStatus.OK) {
936 log.debug("Failed to add instance deployment artifacts for instance {} in conatiner {} error {}", componentInstance.getUniqueId(),
937 containerComponent.getUniqueId(), artStatus);
938 throw new ByResponseFormatComponentException(
939 componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
941 StorageOperationStatus result = toscaOperationFacade
942 .addGroupInstancesToComponentInstance(containerComponent, componentInstance, filteredGroups, groupInstancesArtifacts);
943 if (result != StorageOperationStatus.OK) {
944 log.debug("failed to update group instance for component instance {}", componentInstance.getUniqueId());
945 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
947 componentInstance.setDeploymentArtifacts(finalDeploymentArtifacts);
949 artStatus = toscaOperationFacade
950 .addInformationalArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, originComponent.getArtifacts());
951 if (artStatus != StorageOperationStatus.OK) {
952 log.debug("Failed to add informational artifacts to the instance {} belonging to the conatiner {}. Status is {}",
953 componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
954 throw new ByResponseFormatComponentException(
955 componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
957 componentInstance.setArtifacts(originComponent.getArtifacts());
958 return ActionStatus.OK;
961 private void fillInstanceArtifactMap(Map<String, List<ArtifactDefinition>> groupInstancesArtifacts, ArtifactDefinition artifactDefinition,
962 GroupDefinition groupInstance) {
963 List<ArtifactDefinition> artifactsUid;
964 if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
965 artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
967 artifactsUid = new ArrayList<>();
969 artifactsUid.add(artifactDefinition);
970 groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
973 private ActionStatus setResourceArtifactsOnResourceInstance(ComponentInstance resourceInstance) {
974 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getResourceDeploymentArtifacts = artifactBusinessLogic
975 .getArtifacts(resourceInstance.getComponentUid(), NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null);
976 Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
977 if (getResourceDeploymentArtifacts.isRight()) {
978 StorageOperationStatus status = getResourceDeploymentArtifacts.right().value();
979 if (status != StorageOperationStatus.NOT_FOUND) {
980 log.debug("Failed to fetch resource: {} artifacts. status is {}", resourceInstance.getComponentUid(), status);
981 return componentsUtils.convertFromStorageResponseForResourceInstance(status, true);
984 deploymentArtifacts = getResourceDeploymentArtifacts.left().value();
986 if (!deploymentArtifacts.isEmpty()) {
987 Map<String, ArtifactDefinition> tempDeploymentArtifacts = new HashMap<>(deploymentArtifacts);
988 for (Entry<String, ArtifactDefinition> artifact : deploymentArtifacts.entrySet()) {
989 if (!artifact.getValue().checkEsIdExist()) {
990 tempDeploymentArtifacts.remove(artifact.getKey());
993 resourceInstance.setDeploymentArtifacts(tempDeploymentArtifacts);
995 return ActionStatus.OK;
998 public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId,
999 String componentInstanceId, String userId,
1000 ComponentInstance componentInstance) {
1001 return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, true);
1004 public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(final String containerComponentParam,
1005 final String containerComponentId,
1006 final String componentInstanceId, final String userId,
1007 ComponentInstance componentInstance, boolean needLock) {
1008 validateUserExists(userId);
1009 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1010 final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
1011 validateCanWorkOnComponent(containerComponent, userId);
1012 ComponentTypeEnum instanceType = getComponentType(containerComponentType);
1013 Either<Boolean, StorageOperationStatus> validateParentStatus = toscaOperationFacade
1014 .validateComponentExists(componentInstance.getComponentUid());
1015 if (validateParentStatus.isRight()) {
1016 log.debug("Failed to get component instance {} on service {}", componentInstanceId, containerComponentId);
1017 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND, componentInstance.getName(),
1018 instanceType.getValue().toLowerCase());
1020 if (!Boolean.TRUE.equals(validateParentStatus.left().value())) {
1021 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(),
1022 instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(), containerComponentId);
1025 lockComponent(containerComponent, "updateComponentInstance");
1027 Component origComponent;
1028 boolean failed = false;
1030 origComponent = getOriginComponentFromComponentInstance(componentInstance);
1031 componentInstance = updateComponentInstanceMetadata(containerComponent, containerComponentType, origComponent, componentInstanceId,
1033 } catch (ComponentException e) {
1038 unlockComponent(failed, containerComponent);
1041 return Either.left(componentInstance);
1044 // New Multiple Instance Update API
1045 public List<ComponentInstance> updateComponentInstance(String containerComponentParam, Component containerComponent, String containerComponentId,
1046 String userId, List<ComponentInstance> componentInstanceList, boolean needLock) {
1047 boolean failed = false;
1049 validateUserExists(userId);
1050 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1051 ComponentParametersView componentFilter = new ComponentParametersView();
1052 componentFilter.disableAll();
1053 componentFilter.setIgnoreUsers(false);
1054 componentFilter.setIgnoreComponentInstances(false);
1055 if (containerComponent == null) {
1056 containerComponent = validateComponentExistsByFilter(containerComponentId, containerComponentType, componentFilter);
1058 validateCanWorkOnComponent(containerComponent, userId);
1059 ComponentTypeEnum instanceType = getComponentType(containerComponentType);
1060 for (ComponentInstance componentInstance : componentInstanceList) {
1061 boolean validateParent = validateParent(containerComponent, componentInstance.getUniqueId());
1062 if (!validateParent) {
1063 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(),
1064 instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(), containerComponentId);
1068 lockComponent(containerComponent, "updateComponentInstance");
1070 List<ComponentInstance> updatedList = new ArrayList<>();
1071 List<ComponentInstance> instancesFromContainerComponent = containerComponent.getComponentInstances();
1072 List<ComponentInstance> listForUpdate = new ArrayList<>();
1073 if (instancesFromContainerComponent == null || instancesFromContainerComponent.isEmpty()) {
1074 containerComponent.setComponentInstances(componentInstanceList);
1076 Iterator<ComponentInstance> iterator = instancesFromContainerComponent.iterator();
1077 while (iterator.hasNext()) {
1078 ComponentInstance origInst = iterator.next();
1079 Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getUniqueId().equals(origInst.getUniqueId()))
1081 if (op.isPresent()) {
1082 ComponentInstance updatedCi = op.get();
1083 updatedCi = buildComponentInstance(updatedCi, origInst);
1084 Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, origInst, updatedCi.getName());
1085 if (!Boolean.TRUE.equals(isUniqueName)) {
1086 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1087 "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ",
1088 origInst.getName(), updatedCi.getName());
1089 throw new ByResponseFormatComponentException(componentsUtils
1090 .getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), origInst.getName()));
1092 listForUpdate.add(updatedCi);
1094 listForUpdate.add(origInst);
1097 containerComponent.setComponentInstances(listForUpdate);
1098 Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade
1099 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, componentFilter);
1100 if (updateStatus.isRight()) {
1102 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata belonging to container component {}. Status is {}. ",
1103 containerComponent.getName(), updateStatus.right().value());
1104 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(
1105 componentsUtils.convertFromStorageResponseForResourceInstance(updateStatus.right().value(), true), "", null));
1107 for (ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()) {
1108 Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getName().equals(updatedInstance.getName()))
1110 if (op.isPresent()) {
1111 updatedList.add(updatedInstance);
1116 } catch (ComponentException e) {
1121 unlockComponent(failed, containerComponent);
1126 private boolean validateParent(org.openecomp.sdc.be.model.Component containerComponent, String nodeTemplateId) {
1127 return containerComponent.getComponentInstances().stream().anyMatch(p -> p.getUniqueId().equals(nodeTemplateId));
1130 private ComponentTypeEnum getComponentType(ComponentTypeEnum containerComponentType) {
1131 if (ComponentTypeEnum.PRODUCT == containerComponentType) {
1132 return ComponentTypeEnum.SERVICE_INSTANCE;
1134 return ComponentTypeEnum.RESOURCE_INSTANCE;
1138 private ComponentInstance updateComponentInstanceMetadata(Component containerComponent, ComponentTypeEnum containerComponentType,
1139 org.openecomp.sdc.be.model.Component origComponent, String componentInstanceId,
1140 ComponentInstance componentInstance) {
1141 Optional<ComponentInstance> componentInstanceOptional;
1142 Either<ImmutablePair<Component, String>, StorageOperationStatus> updateRes = null;
1143 ComponentInstance oldComponentInstance = null;
1144 boolean isNameChanged = false;
1145 componentInstanceOptional = containerComponent.getComponentInstances().stream()
1146 .filter(ci -> ci.getUniqueId().equals(componentInstance.getUniqueId())).findFirst();
1147 if (!componentInstanceOptional.isPresent()) {
1148 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find the component instance {} in container component {}. ",
1149 componentInstance.getName(), containerComponent.getName());
1150 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
1152 String oldComponentName;
1153 oldComponentInstance = componentInstanceOptional.get();
1154 oldComponentName = oldComponentInstance.getName();
1155 String newInstanceName = componentInstance.getName();
1156 if (oldComponentName != null && !oldComponentInstance.getName().equals(newInstanceName)) {
1157 isNameChanged = true;
1159 Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, oldComponentInstance, newInstanceName);
1160 if (!Boolean.TRUE.equals(isUniqueName)) {
1161 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1162 "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ",
1163 oldComponentInstance.getName(), newInstanceName);
1164 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(),
1165 componentInstance.getName());
1167 if (!DirectivesUtil.isValid(componentInstance.getDirectives())) {
1168 final String directivesStr = componentInstance.getDirectives().stream().collect(Collectors.joining(" , ", " [ ", " ] "));
1169 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1170 "Failed to update the directives of the component instance {} to {}. Directives data {} is invalid. ", oldComponentInstance.getName(),
1171 newInstanceName, directivesStr);
1172 throw new ByActionStatusComponentException(ActionStatus.DIRECTIVES_INVALID_VALUE, containerComponentType.getValue(),
1173 componentInstance.getName());
1175 updateRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, origComponent,
1176 updateComponentInstanceMetadata(oldComponentInstance, componentInstance));
1177 if (updateRes.isRight()) {
1178 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1179 "Failed to update metadata of component instance {} belonging to container component {}. Status is {}. ", componentInstance.getName(),
1180 containerComponent.getName(), updateRes.right().value());
1181 throw new ByResponseFormatComponentException(componentsUtils
1182 .getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateRes.right().value(), true),
1185 // region - Update instance Groups
1186 if (isNameChanged) {
1187 Either<StorageOperationStatus, StorageOperationStatus> result = toscaOperationFacade
1188 .cleanAndAddGroupInstancesToComponentInstance(containerComponent, oldComponentInstance, componentInstanceId);
1189 if (result.isRight()) {
1191 .addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId,
1192 result.right().value());
1194 if (containerComponent instanceof Service) {
1195 Either<ComponentInstance, ResponseFormat> renameEither = renameServiceFilter((Service) containerComponent, newInstanceName,
1196 oldComponentInstance.getName());
1197 if (renameEither.isRight()) {
1198 throw new ByResponseFormatComponentException(renameEither.right().value());
1200 updateForwardingPathDefinition(containerComponent, componentInstance, oldComponentName);
1205 String newInstanceId = updateRes.left().value().getRight();
1206 Optional<ComponentInstance> updatedInstanceOptional = updateRes.left().value().getLeft().getComponentInstances().stream()
1207 .filter(ci -> ci.getUniqueId().equals(newInstanceId)).findFirst();
1208 if (!updatedInstanceOptional.isPresent()) {
1209 log.debug("Failed to update metadata of component instance {} of container component {}", componentInstance.getName(),
1210 containerComponent.getName());
1211 throw new ByResponseFormatComponentException(
1212 componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
1214 return componentInstanceOptional.get();
1217 private void updateForwardingPathDefinition(Component containerComponent, ComponentInstance componentInstance, String oldComponentName) {
1218 Collection<ForwardingPathDataDefinition> forwardingPathDataDefinitions = getForwardingPathDataDefinitions(containerComponent.getUniqueId());
1219 Set<ForwardingPathDataDefinition> updated = new ForwardingPathUtils()
1220 .updateComponentInstanceName(forwardingPathDataDefinitions, oldComponentName, componentInstance.getName());
1221 updated.forEach(fp -> {
1222 Either<ForwardingPathDataDefinition, StorageOperationStatus> resultEither = forwardingPathOperation
1223 .updateForwardingPath(containerComponent.getUniqueId(), fp);
1224 if (resultEither.isRight()) {
1225 CommonUtility.addRecordToLog(log, LogLevelEnum.ERROR, "Failed to rename forwarding path for container {}. error {} ",
1226 containerComponent.getName(), resultEither.right().value());
1231 public Either<ComponentInstance, ResponseFormat> renameServiceFilter(final Service containerComponent, final String newInstanceName,
1232 final String oldInstanceName) {
1233 Map<String, CINodeFilterDataDefinition> renamedNodesFilter = ServiceFilterUtils
1234 .getRenamedNodesFilter(containerComponent, oldInstanceName, newInstanceName);
1235 for (Entry<String, CINodeFilterDataDefinition> entry : renamedNodesFilter.entrySet()) {
1236 Either<CINodeFilterDataDefinition, StorageOperationStatus> renameEither = nodeFilterOperation
1237 .updateNodeFilter(containerComponent.getUniqueId(), entry.getKey(), entry.getValue());
1238 if (renameEither.isRight()) {
1239 return Either.right(componentsUtils.getResponseFormatForResourceInstance(
1240 componentsUtils.convertFromStorageResponse(renameEither.right().value(), ComponentTypeEnum.SERVICE), containerComponent.getName(),
1244 return Either.left(null);
1248 * @param oldPrefix- The normalized old vf name
1249 * @param newNormailzedPrefix- The normalized new vf name
1250 * @param qualifiedGroupInstanceName- old Group Instance Name
1253 // modify group names
1254 private String getNewGroupName(String oldPrefix, String newNormailzedPrefix, String qualifiedGroupInstanceName) {
1255 if (qualifiedGroupInstanceName == null) {
1256 log.info("CANNOT change group name ");
1259 if (qualifiedGroupInstanceName.startsWith(oldPrefix) || qualifiedGroupInstanceName
1260 .startsWith(ValidationUtils.normalizeComponentInstanceName(oldPrefix))) {
1261 return qualifiedGroupInstanceName.replaceFirst(oldPrefix, newNormailzedPrefix);
1263 return qualifiedGroupInstanceName;
1266 private ComponentInstance updateComponentInstanceMetadata(ComponentInstance oldComponentInstance, ComponentInstance newComponentInstance) {
1267 oldComponentInstance.setName(newComponentInstance.getName());
1268 oldComponentInstance.setModificationTime(System.currentTimeMillis());
1269 oldComponentInstance.setCustomizationUUID(UUID.randomUUID().toString());
1270 oldComponentInstance.setDirectives(newComponentInstance.getDirectives());
1271 oldComponentInstance.setMaxOccurrences(newComponentInstance.getMaxOccurrences());
1272 oldComponentInstance.setMinOccurrences(newComponentInstance.getMinOccurrences());
1273 oldComponentInstance.setInstanceCount(newComponentInstance.getInstanceCount());
1274 if (oldComponentInstance.getGroupInstances() != null) {
1275 oldComponentInstance.getGroupInstances().forEach(group -> group.setName(getNewGroupName(oldComponentInstance.getNormalizedName(),
1276 ValidationUtils.normalizeComponentInstanceName(newComponentInstance.getName()), group.getName())));
1278 return oldComponentInstance;
1281 public ComponentInstance deleteComponentInstance(final String containerComponentParam, final String containerComponentId,
1282 final String componentInstanceId, String userId) throws BusinessLogicException {
1283 validateUserExists(userId);
1284 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1285 final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
1286 validateCanWorkOnComponent(containerComponent, userId);
1287 boolean failed = false;
1288 final Optional<ComponentInstance> componentInstanceOptional = containerComponent.getComponentInstanceById(componentInstanceId);
1289 if (!componentInstanceOptional.isPresent()) {
1290 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND));
1292 ComponentInstance componentInstance = componentInstanceOptional.get();
1294 if (containerComponent instanceof Service || containerComponent instanceof Resource) {
1295 final Either<String, StorageOperationStatus> deleteServiceFilterEither = nodeFilterOperation
1296 .deleteNodeFilter(containerComponent, componentInstanceId);
1297 if (deleteServiceFilterEither.isRight()) {
1298 final ActionStatus status = componentsUtils
1299 .convertFromStorageResponse(deleteServiceFilterEither.right().value(), containerComponentType);
1300 janusGraphDao.rollback();
1301 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(status, componentInstanceId));
1303 final Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance(containerComponent,
1304 componentInstance, containerComponentType, userId);
1305 if (resultOp.isRight()) {
1306 janusGraphDao.rollback();
1307 throw new ByResponseFormatComponentException(resultOp.right().value());
1310 lockComponent(containerComponent, "deleteComponentInstance");
1311 final ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
1312 componentInstance = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId, containerComponentType,
1313 deletedCompInstance);
1314 final ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator
1315 .doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
1316 if (ActionStatus.OK != onDeleteOperationsStatus) {
1317 throw new ByActionStatusComponentException(onDeleteOperationsStatus);
1319 } catch (final ComponentException e) {
1323 unlockComponent(failed, containerComponent);
1325 return componentInstance;
1329 * Try to modify the delete and return two cases
1331 * @param containerComponentParam
1332 * @param containerComponentId
1333 * @param componentInstanceId
1337 public Either<ComponentInstance, ResponseFormat> deleteAbstractComponentInstance(String containerComponentParam, String containerComponentId,
1338 String componentInstanceId, String userId) {
1339 log.debug("enter deleteAbstractComponentInstance");
1340 validateUserExists(userId);
1341 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1342 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
1343 validateCanWorkOnComponent(containerComponent, userId);
1344 boolean failed = false;
1345 ComponentInstance deletedRelatedInst;
1347 if (containerComponent instanceof Service) {
1348 final Optional<ComponentInstance> componentInstanceById = containerComponent.getComponentInstanceById(componentInstanceId);
1349 if (componentInstanceById.isPresent()) {
1350 ComponentInstance componentInstance = componentInstanceById.get();
1351 Either<String, StorageOperationStatus> deleteServiceFilterEither = nodeFilterOperation
1352 .deleteNodeFilter(containerComponent, componentInstanceId);
1353 if (deleteServiceFilterEither.isRight()) {
1354 log.debug("enter deleteAbstractComponentInstance:deleteServiceFilterEither is right, filed");
1355 ActionStatus status = componentsUtils
1356 .convertFromStorageResponse(deleteServiceFilterEither.right().value(), containerComponentType);
1357 janusGraphDao.rollback();
1358 return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
1360 Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance(containerComponent, componentInstance,
1361 ComponentTypeEnum.SERVICE, userId);
1362 if (resultOp.isRight()) {
1363 log.debug("enter deleteAbstractComponentInstance:resultOp is right, filed");
1364 janusGraphDao.rollback();
1369 log.debug("enter deleteAbstractComponentInstance:");
1370 lockComponent(containerComponent, "deleteComponentInstance");
1371 ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
1372 deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId, containerComponentType,
1373 deletedCompInstance);
1374 ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator
1375 .doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
1376 log.debug("enter deleteAbstractComponentInstance,get onDeleteOperationsStatus:{}", onDeleteOperationsStatus);
1377 if (ActionStatus.OK != onDeleteOperationsStatus) {
1378 throw new ByActionStatusComponentException(onDeleteOperationsStatus);
1380 } catch (ComponentException e) {
1384 unlockComponent(failed, containerComponent);
1386 log.debug("enter deleteAbstractComponentInstance,deleted RelatedInst success");
1387 return Either.left(deletedRelatedInst);
1390 public Either<ComponentInstance, ResponseFormat> deleteNodeFiltersFromComponentInstance(final Component component,
1391 final ComponentInstance componentInstance,
1392 final ComponentTypeEnum containerComponentType,
1393 final String userId) {
1394 final Set<String> componentFiltersIDsToBeDeleted = getComponentFiltersRelatedToComponentInstance(component.getUniqueId(), componentInstance);
1395 if (!componentFiltersIDsToBeDeleted.isEmpty()) {
1396 final Set<String> ids = component.getComponentInstances().stream().filter(ci -> componentFiltersIDsToBeDeleted.contains(ci.getName()))
1397 .map(ComponentInstance::getUniqueId).collect(Collectors.toSet());
1398 final Either<Set<String>, StorageOperationStatus> deleteComponentNodeFiltersEither = nodeFilterOperation
1399 .deleteNodeFilters(component, ids);
1400 if (deleteComponentNodeFiltersEither.isRight()) {
1401 final ActionStatus status = componentsUtils
1402 .convertFromStorageResponse(deleteComponentNodeFiltersEither.right().value(), containerComponentType);
1403 return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
1405 for (final String id : ids) {
1406 final Optional<ComponentInstance> componentInstanceById = component.getComponentInstanceById(id);
1407 if (!componentInstanceById.isPresent()) {
1408 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1410 final ComponentInstance componentInstanceToBeUpdated = componentInstanceById.get();
1411 componentInstanceToBeUpdated.setDirectives(Collections.emptyList());
1412 final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither = updateComponentInstanceMetadata(
1413 containerComponentType.getValue(), component.getUniqueId(), componentInstanceToBeUpdated.getUniqueId(), userId,
1414 componentInstanceToBeUpdated, false);
1415 if (componentInstanceResponseFormatEither.isRight()) {
1416 return componentInstanceResponseFormatEither;
1420 return Either.left(componentInstance);
1423 private Set<String> getComponentFiltersRelatedToComponentInstance(String containerComponentId, ComponentInstance componentInstance) {
1424 ComponentParametersView filter = new ComponentParametersView(true);
1425 filter.setIgnoreComponentInstances(false);
1426 Either<Component, StorageOperationStatus> componentFilterOrigin = toscaOperationFacade.getToscaElement(containerComponentId, filter);
1427 final Component component = componentFilterOrigin.left().value();
1428 return ComponentsUtils.getNodesFiltersToBeDeleted(component, componentInstance);
1431 ComponentInstance deleteForwardingPathsRelatedTobeDeletedComponentInstance(String containerComponentId, ComponentTypeEnum containerComponentType,
1432 ComponentInstance componentInstance) {
1433 if (containerComponentType == ComponentTypeEnum.SERVICE) {
1434 List<String> pathIDsToBeDeleted = getForwardingPathsRelatedToComponentInstance(containerComponentId, componentInstance.getName());
1435 if (!pathIDsToBeDeleted.isEmpty()) {
1436 deleteForwardingPaths(containerComponentId, pathIDsToBeDeleted);
1439 return componentInstance;
1442 private void deleteForwardingPaths(String serviceId, List<String> pathIdsToDelete) {
1443 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1444 if (storageStatus.isRight()) {
1445 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus.right().value()));
1447 Either<Set<String>, StorageOperationStatus> result = forwardingPathOperation
1448 .deleteForwardingPath(storageStatus.left().value(), Sets.newHashSet(pathIdsToDelete));
1449 if (result.isRight()) {
1450 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(result.right().value()));
1454 private List<String> getForwardingPathsRelatedToComponentInstance(String containerComponentId, String componentInstanceId) {
1455 Collection<ForwardingPathDataDefinition> allPaths = getForwardingPathDataDefinitions(containerComponentId);
1456 List<String> pathIDsToBeDeleted = new ArrayList<>();
1457 allPaths.stream().filter(path -> isPathRelatedToComponent(path, componentInstanceId))
1458 .forEach(path -> pathIDsToBeDeleted.add(path.getUniqueId()));
1459 return pathIDsToBeDeleted;
1462 private Collection<ForwardingPathDataDefinition> getForwardingPathDataDefinitions(String containerComponentId) {
1463 ComponentParametersView filter = new ComponentParametersView(true);
1464 filter.setIgnoreServicePath(false);
1465 Either<Service, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade.getToscaElement(containerComponentId, filter);
1466 return forwardingPathOrigin.left().value().getForwardingPaths().values();
1469 private boolean isPathRelatedToComponent(ForwardingPathDataDefinition pathDataDefinition, String componentInstanceId) {
1470 return pathDataDefinition.getPathElements().getListToscaDataDefinition().stream().anyMatch(
1471 elementDataDefinition -> elementDataDefinition.getFromNode().equalsIgnoreCase(componentInstanceId) || elementDataDefinition.getToNode()
1472 .equalsIgnoreCase(componentInstanceId));
1475 private ComponentInstance deleteComponentInstance(Component containerComponent, String componentInstanceId,
1476 ComponentTypeEnum containerComponentType) {
1477 Either<ImmutablePair<Component, String>, StorageOperationStatus> deleteRes = toscaOperationFacade
1478 .deleteComponentInstanceFromTopologyTemplate(containerComponent, componentInstanceId);
1479 if (deleteRes.isRight()) {
1480 log.debug("Failed to delete entry on graph for resourceInstance {}", componentInstanceId);
1481 ActionStatus status = componentsUtils.convertFromStorageResponse(deleteRes.right().value(), containerComponentType);
1482 throw new ByActionStatusComponentException(status, componentInstanceId);
1484 log.debug("The component instance {} has been removed from container component {}. ", componentInstanceId, containerComponent);
1485 ComponentInstance deletedInstance = findAndRemoveComponentInstanceFromContainerComponent(componentInstanceId, containerComponent);
1486 if (CollectionUtils.isNotEmpty(containerComponent.getInputs())) {
1487 List<InputDefinition> inputsToDelete = containerComponent.getInputs().stream()
1488 .filter(i -> i.getInstanceUniqueId() != null && i.getInstanceUniqueId().equals(componentInstanceId)).collect(Collectors.toList());
1489 if (CollectionUtils.isNotEmpty(inputsToDelete)) {
1490 StorageOperationStatus deleteInputsRes = toscaOperationFacade
1491 .deleteComponentInstanceInputsFromTopologyTemplate(containerComponent, inputsToDelete);
1492 if (deleteInputsRes != StorageOperationStatus.OK) {
1493 log.debug("Failed to delete inputs of the component instance {} from container component. ", componentInstanceId);
1494 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(deleteInputsRes, containerComponentType),
1495 componentInstanceId);
1499 if (CollectionUtils.isNotEmpty(containerComponent.getOutputs())) {
1500 final List<OutputDefinition> outputsToDelete = containerComponent.getOutputs().stream()
1501 .filter(i -> i.getInstanceUniqueId() != null && i.getInstanceUniqueId().equals(componentInstanceId)).collect(Collectors.toList());
1502 if (CollectionUtils.isNotEmpty(outputsToDelete)) {
1503 final StorageOperationStatus deleteOutputsRes = toscaOperationFacade
1504 .deleteComponentInstanceOutputsFromTopologyTemplate(containerComponent, outputsToDelete);
1505 if (deleteOutputsRes != StorageOperationStatus.OK) {
1506 log.debug("Failed to delete outputs of the component instance {} from container component. ", componentInstanceId);
1507 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(deleteOutputsRes, containerComponentType),
1508 componentInstanceId);
1512 return deletedInstance;
1515 private ComponentInstance findAndRemoveComponentInstanceFromContainerComponent(String componentInstanceId, Component containerComponent) {
1516 ComponentInstance foundInstance = null;
1517 for (ComponentInstance instance : containerComponent.getComponentInstances()) {
1518 if (instance.getUniqueId().equals(componentInstanceId)) {
1519 foundInstance = instance;
1520 containerComponent.getComponentInstances().remove(instance);
1524 findAndRemoveComponentInstanceRelations(componentInstanceId, containerComponent);
1525 return foundInstance;
1528 private void findAndRemoveComponentInstanceRelations(String componentInstanceId, Component containerComponent) {
1529 if (CollectionUtils.isNotEmpty(containerComponent.getComponentInstancesRelations())) {
1530 containerComponent.setComponentInstancesRelations(
1531 containerComponent.getComponentInstancesRelations().stream().filter(r -> isNotBelongingRelation(componentInstanceId, r))
1532 .collect(Collectors.toList()));
1536 private boolean isNotBelongingRelation(String componentInstanceId, RequirementCapabilityRelDef relation) {
1537 return !relation.getToNode().equals(componentInstanceId) && !relation.getFromNode().equals(componentInstanceId);
1540 public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef,
1541 ComponentTypeEnum componentTypeEnum) {
1542 return associateRIToRI(componentId, userId, requirementDef, componentTypeEnum, true);
1545 public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef,
1546 ComponentTypeEnum componentTypeEnum, boolean needLock) {
1547 validateUserExists(userId);
1548 RequirementCapabilityRelDef requirementCapabilityRelDef;
1549 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1550 validateCanWorkOnComponent(containerComponent, userId);
1551 boolean failed = false;
1554 lockComponent(containerComponent, ASSOCIATE_RI_TO_RI);
1556 requirementCapabilityRelDef = associateRIToRIOnGraph(containerComponent, requirementDef);
1557 } catch (ComponentException e) {
1562 unlockComponent(failed, containerComponent);
1565 return requirementCapabilityRelDef;
1568 public RequirementCapabilityRelDef associateRIToRIOnGraph(Component containerComponent, RequirementCapabilityRelDef requirementDef) {
1569 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
1570 Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade
1571 .associateResourceInstances(null, containerComponent.getUniqueId(), requirementDef);
1572 if (result.isLeft()) {
1573 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
1574 return result.left().value();
1576 log.debug("Failed to associate node: {} with node {}", requirementDef.getFromNode(), requirementDef.getToNode());
1577 String fromNameOrId = "";
1578 String toNameOrId = "";
1579 Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(containerComponent, requirementDef.getFromNode());
1580 Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(containerComponent, requirementDef.getToNode());
1581 toNameOrId = requirementDef.getFromNode();
1582 fromNameOrId = requirementDef.getFromNode();
1583 if (fromResult.isLeft()) {
1584 fromNameOrId = fromResult.left().value().getName();
1586 if (toResult.isLeft()) {
1587 toNameOrId = toResult.left().value().getName();
1589 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true),
1590 fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement());
1595 * @param componentId
1597 * @param requirementDefList
1598 * @param componentTypeEnum
1601 public List<RequirementCapabilityRelDef> batchDissociateRIFromRI(String componentId, String userId,
1602 List<RequirementCapabilityRelDef> requirementDefList,
1603 ComponentTypeEnum componentTypeEnum) {
1604 validateUserExists(userId);
1605 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1606 validateCanWorkOnComponent(containerComponent, userId);
1607 boolean failed = false;
1608 List<RequirementCapabilityRelDef> delOkResult = new ArrayList<>();
1610 lockComponent(containerComponent, ASSOCIATE_RI_TO_RI);
1611 for (RequirementCapabilityRelDef requirementDef : requirementDefList) {
1612 RequirementCapabilityRelDef requirementCapabilityRelDef = dissociateRIFromRI(componentId, userId, requirementDef,
1613 containerComponent.getComponentType());
1614 delOkResult.add(requirementCapabilityRelDef);
1616 } catch (ComponentException e) {
1620 unlockComponent(failed, containerComponent);
1625 public RequirementCapabilityRelDef dissociateRIFromRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef,
1626 ComponentTypeEnum componentTypeEnum) {
1627 validateUserExists(userId);
1628 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1629 validateCanWorkOnComponent(containerComponent, userId);
1630 boolean failed = false;
1632 lockComponent(containerComponent, ASSOCIATE_RI_TO_RI);
1633 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
1634 Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade
1635 .dissociateResourceInstances(componentId, requirementDef);
1636 if (result.isLeft()) {
1637 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
1638 return result.left().value();
1640 log.debug("Failed to dissocaite node {} from node {}", requirementDef.getFromNode(), requirementDef.getToNode());
1641 String fromNameOrId = "";
1642 String toNameOrId = "";
1643 Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(containerComponent,
1644 requirementDef.getFromNode());
1645 Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(containerComponent, requirementDef.getToNode());
1646 toNameOrId = requirementDef.getFromNode();
1647 fromNameOrId = requirementDef.getFromNode();
1648 if (fromResult.isLeft()) {
1649 fromNameOrId = fromResult.left().value().getName();
1651 if (toResult.isLeft()) {
1652 toNameOrId = toResult.left().value().getName();
1654 throw new ByActionStatusComponentException(
1655 componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId,
1656 requirementDef.getRelationships().get(0).getRelation().getRequirement());
1658 } catch (ComponentException e) {
1662 unlockComponent(failed, containerComponent);
1667 * Allows to get relation contained in specified component according to received Id
1669 * @param componentId
1672 * @param componentTypeEnum
1675 public Either<RequirementCapabilityRelDef, ResponseFormat> getRelationById(String componentId, String relationId, String userId,
1676 ComponentTypeEnum componentTypeEnum) {
1677 Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
1679 org.openecomp.sdc.be.model.Component containerComponent = null;
1680 RequirementCapabilityRelDef foundRelation = null;
1681 validateUserExists(userId);
1682 containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1683 List<RequirementCapabilityRelDef> requirementCapabilityRelations = containerComponent.getComponentInstancesRelations();
1684 foundRelation = findRelation(relationId, requirementCapabilityRelations);
1685 if (foundRelation == null) {
1686 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RELATION_NOT_FOUND, relationId, componentId);
1687 log.debug("Relation with id {} was not found on the component", relationId, componentId);
1688 resultOp = Either.right(responseFormat);
1690 if (resultOp == null) {
1691 resultOp = setRelatedCapability(foundRelation, containerComponent);
1693 if (resultOp.isLeft()) {
1694 resultOp = setRelatedRequirement(foundRelation, containerComponent);
1696 } catch (Exception e) {
1697 log.error("The exception {} occured upon get relation {} of the component {} ", e, relationId, componentId);
1698 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1703 private RequirementCapabilityRelDef findRelation(String relationId, List<RequirementCapabilityRelDef> requirementCapabilityRelations) {
1704 for (RequirementCapabilityRelDef relationship : requirementCapabilityRelations) {
1705 if (relationship.getRelationships().stream().anyMatch(r -> r.getRelation().getId().equals(relationId))) {
1706 return relationship;
1712 private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedRequirement(RequirementCapabilityRelDef foundRelation,
1713 Component containerComponent) {
1714 Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
1715 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1716 String instanceId = foundRelation.getFromNode();
1717 Optional<RequirementDefinition> foundRequirement;
1718 Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId))
1720 if (!instance.isPresent()) {
1721 ResponseFormat responseFormat = componentsUtils
1722 .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance",
1723 containerComponent.getComponentType().getValue(), containerComponent.getName());
1724 log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
1725 result = Either.right(responseFormat);
1727 if (result == null && instance.isPresent()) {
1728 for (List<RequirementDefinition> requirements : instance.get().getRequirements().values()) {
1729 foundRequirement = requirements.stream()
1730 .filter(r -> isBelongingCalcRequirement(relationshipInfo, r, containerComponent.getLifecycleState())).findFirst();
1731 if (foundRequirement.isPresent()) {
1732 foundRelation.resolveSingleRelationship().setRequirement(foundRequirement.get());
1733 result = Either.left(foundRelation);
1737 if (result == null) {
1738 Either<RequirementDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade
1739 .getFulfilledRequirementByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullRequirement);
1740 if (getfulfilledRequirementRes.isRight()) {
1741 ResponseFormat responseFormat = componentsUtils
1742 .getResponseFormat(ActionStatus.REQUIREMENT_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getRequirement(), instanceId,
1743 containerComponent.getUniqueId());
1744 log.debug("Requirement {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId,
1745 containerComponent.getUniqueId());
1746 result = Either.right(responseFormat);
1748 foundRelation.resolveSingleRelationship().setRequirement(getfulfilledRequirementRes.left().value());
1751 if (result == null) {
1752 result = Either.left(foundRelation);
1757 private boolean isBelongingFullRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req) {
1758 return req.getName().equals(relationshipInfo.getRequirement()) && req.getUniqueId().equals(relationshipInfo.getRequirementUid()) && req
1759 .getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
1762 private boolean isBelongingCalcRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req, LifecycleStateEnum state) {
1763 return nameMatches(relationshipInfo.getRequirement(), req.getName(), req.getPreviousName(), state) && req.getUniqueId()
1764 .equals(relationshipInfo.getRequirementUid()) && req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
1767 private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedCapability(RequirementCapabilityRelDef foundRelation,
1768 Component containerComponent) {
1769 Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
1770 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1771 String instanceId = foundRelation.getToNode();
1772 Optional<CapabilityDefinition> foundCapability;
1773 Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId))
1775 if (!instance.isPresent()) {
1776 ResponseFormat responseFormat = componentsUtils
1777 .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance",
1778 containerComponent.getComponentType().getValue(), containerComponent.getName());
1779 log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
1780 result = Either.right(responseFormat);
1782 if (result == null && instance.isPresent()) {
1783 for (List<CapabilityDefinition> capabilities : instance.get().getCapabilities().values()) {
1784 foundCapability = capabilities.stream()
1785 .filter(c -> isBelongingCalcCapability(relationshipInfo, c, containerComponent.getLifecycleState())).findFirst();
1786 if (foundCapability.isPresent()) {
1787 foundRelation.resolveSingleRelationship().setCapability(foundCapability.get());
1788 result = Either.left(foundRelation);
1792 if (result == null) {
1793 Either<CapabilityDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade
1794 .getFulfilledCapabilityByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullCapability);
1795 if (getfulfilledRequirementRes.isRight()) {
1796 ResponseFormat responseFormat = componentsUtils
1797 .getResponseFormat(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getCapability(), instanceId,
1798 containerComponent.getUniqueId());
1799 log.debug("Capability {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId,
1800 containerComponent.getUniqueId());
1801 result = Either.right(responseFormat);
1803 foundRelation.resolveSingleRelationship().setCapability(getfulfilledRequirementRes.left().value());
1806 if (result == null) {
1807 result = Either.left(foundRelation);
1812 private boolean isBelongingFullCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap) {
1813 return cap.getName().equals(relationshipInfo.getCapability()) && cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) && cap
1814 .getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
1817 private boolean isBelongingCalcCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap, LifecycleStateEnum state) {
1818 return nameMatches(relationshipInfo.getCapability(), cap.getName(), cap.getPreviousName(), state) && cap.getUniqueId()
1819 .equals(relationshipInfo.getCapabilityUid()) && cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
1822 private boolean nameMatches(String nameFromRelationship, String currName, String previousName, LifecycleStateEnum state) {
1823 return state == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT ? currName.equals(nameFromRelationship)
1824 : previousName != null && previousName.equals(nameFromRelationship);
1827 private Either<ComponentInstanceProperty, ResponseFormat> updateAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
1828 Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation
1829 .updateAttributeValueInResourceInstance(attribute, resourceInstanceId, true);
1830 Either<ComponentInstanceProperty, ResponseFormat> result;
1831 if (eitherAttribute.isLeft()) {
1832 log.debug("Attribute value {} was updated on graph.", attribute.getValueUniqueUid());
1833 ComponentInstanceProperty instanceAttribute = eitherAttribute.left().value();
1834 result = Either.left(instanceAttribute);
1836 log.debug("Failed to update attribute value {} in resource instance {}", attribute, resourceInstanceId);
1837 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(eitherAttribute.right().value());
1838 result = Either.right(componentsUtils.getResponseFormat(actionStatus, ""));
1843 private Either<ComponentInstanceProperty, ResponseFormat> createAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
1844 Either<ComponentInstanceProperty, ResponseFormat> result;
1845 Wrapper<Integer> indexCounterWrapper = new Wrapper<>();
1846 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
1847 validateIncrementCounter(resourceInstanceId, GraphPropertiesDictionary.ATTRIBUTE_COUNTER, indexCounterWrapper, errorWrapper);
1848 if (!errorWrapper.isEmpty()) {
1849 result = Either.right(errorWrapper.getInnerElement());
1851 Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation
1852 .addAttributeValueToResourceInstance(attribute, resourceInstanceId, indexCounterWrapper.getInnerElement(), true);
1853 if (eitherAttribute.isLeft()) {
1854 log.debug("Attribute value was added to resource instance {}", resourceInstanceId);
1855 ComponentInstanceProperty instanceAttribute = eitherAttribute.left().value();
1856 result = Either.left(instanceAttribute);
1858 log.debug("Failed to add attribute value {} to resource instance {}", attribute, resourceInstanceId);
1859 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(eitherAttribute.right().value());
1860 result = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
1867 * Create Or Updates Attribute Instance
1869 * @param componentTypeEnum
1870 * @param componentId
1871 * @param resourceInstanceId
1876 public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateAttributeValue(ComponentTypeEnum componentTypeEnum, String componentId,
1877 String resourceInstanceId,
1878 ComponentInstanceProperty attribute, String userId) {
1879 Either<ComponentInstanceProperty, ResponseFormat> result = null;
1880 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
1881 validateUserExists(userId);
1882 if (errorWrapper.isEmpty()) {
1883 validateComponentTypeEnum(componentTypeEnum, "CreateOrUpdateAttributeValue", errorWrapper);
1885 if (errorWrapper.isEmpty()) {
1886 validateCanWorkOnComponent(componentId, componentTypeEnum, userId, errorWrapper);
1888 if (errorWrapper.isEmpty()) {
1889 validateComponentLock(componentId, componentTypeEnum, errorWrapper);
1892 if (errorWrapper.isEmpty()) {
1893 final boolean isCreate = Objects.isNull(attribute.getValueUniqueUid());
1895 result = createAttributeValue(attribute, resourceInstanceId);
1897 result = updateAttributeValue(attribute, resourceInstanceId);
1900 result = Either.right(errorWrapper.getInnerElement());
1904 if (result == null || result.isRight()) {
1905 janusGraphDao.rollback();
1907 janusGraphDao.commit();
1910 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
1914 public Either<List<ComponentInstanceProperty>, ResponseFormat> createOrUpdatePropertiesValues(ComponentTypeEnum componentTypeEnum,
1915 String componentId, String resourceInstanceId,
1916 List<ComponentInstanceProperty> properties,
1918 Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
1919 /*-------------------------------Validations---------------------------------*/
1920 validateUserExists(userId);
1922 if (componentTypeEnum == null) {
1923 BeEcompErrorManager.getInstance().logInvalidInputError("CreateOrUpdatePropertiesValues", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
1924 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
1927 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
1929 if (getResourceResult.isRight()) {
1930 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
1931 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
1932 return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
1934 Component containerComponent = getResourceResult.left().value();
1936 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
1937 if (Boolean.TRUE.equals(containerComponent.isArchived())) {
1938 log.info(COMPONENT_ARCHIVED, componentId);
1939 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
1941 log.info(RESTRICTED_OPERATION_ON_SERVIVE, userId, componentId);
1942 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
1945 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
1946 if (resourceInstanceStatus.isRight()) {
1947 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
1948 resourceInstanceId, RESOURCE_INSTANCE, SERVICE, componentId));
1950 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
1953 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
1954 if (lockStatus != StorageOperationStatus.OK) {
1955 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
1956 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
1958 List<ComponentInstanceProperty> updatedProperties = new ArrayList<>();
1960 for (ComponentInstanceProperty property : properties) {
1961 validateMandatoryFields(property);
1962 validatePropertyExistsOnComponent(property, containerComponent, foundResourceInstance);
1963 String propertyParentUniqueId = property.getParentUniqueId();
1964 if (property.isToscaFunction()) {
1965 if (property.getToscaFunction().getType() == null) {
1966 throw ToscaFunctionExceptionSupplier.missingFunctionType().get();
1968 if (property.isToscaGetFunction()) {
1969 validateToscaGetFunction(property, containerComponent);
1971 property.setValue(property.getToscaFunction().getValue());
1973 Either<String, ResponseFormat> updatedPropertyValue = updatePropertyObjectValue(property, containerComponent.getModel());
1974 if (updatedPropertyValue.isRight()) {
1975 log.error("Failed to update property object value of property: {}",
1977 throw new ByResponseFormatComponentException(updatedPropertyValue.right().value());
1979 Optional<CapabilityDefinition>
1980 capPropDefinition = getPropertyCapabilityOfChildInstance(propertyParentUniqueId, foundResourceInstance.getCapabilities());
1981 if (capPropDefinition.isPresent()) {
1982 updatedPropertyValue
1983 .bimap(updatedValue -> updateCapabilityPropFromUpdateInstProp(property, updatedValue,
1984 containerComponent, foundResourceInstance, capPropDefinition.get().getType(),
1985 capPropDefinition.get().getName()), Either::right);
1987 updatedPropertyValue.bimap(
1988 updatedValue -> updatePropertyOnContainerComponent(property, updatedValue, containerComponent, foundResourceInstance),
1991 updatedProperties.add(property);
1995 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
1996 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
1997 if (updateContainerRes.isRight()) {
1998 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
1999 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2002 resultOp = Either.left(updatedProperties);
2005 } catch (final ComponentException e) {
2006 return Either.right(e.getResponseFormat());
2008 if (resultOp == null || resultOp.isRight()) {
2009 janusGraphDao.rollback();
2011 janusGraphDao.commit();
2014 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2018 public Either<List<ComponentInstanceAttribute>, ResponseFormat> createOrUpdateAttributeValues(final ComponentTypeEnum componentTypeEnum,
2019 final String componentId,
2020 final String resourceInstanceId,
2021 final List<ComponentInstanceAttribute> attributes,
2022 final String userId) {
2023 Either<List<ComponentInstanceAttribute>, ResponseFormat> resultOp = null;
2024 /*-------------------------------Validations---------------------------------*/
2025 validateUserExists(userId);
2027 if (componentTypeEnum == null) {
2028 BeEcompErrorManager.getInstance().logInvalidInputError("CreateOrUpdatePropertiesValues", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2029 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2032 final Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade
2033 .getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
2035 if (getResourceResult.isRight()) {
2036 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
2037 final ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
2038 return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
2040 final Component containerComponent = getResourceResult.left().value();
2042 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
2043 if (Boolean.TRUE.equals(containerComponent.isArchived())) {
2044 log.info(COMPONENT_ARCHIVED, componentId);
2045 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
2047 log.info(RESTRICTED_OPERATION_ON_SERVIVE, userId, componentId);
2048 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2051 final Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent,
2052 resourceInstanceId);
2053 if (resourceInstanceStatus.isRight()) {
2054 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
2055 resourceInstanceId, RESOURCE_INSTANCE, SERVICE, componentId));
2057 final ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
2060 final StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
2061 if (lockStatus != StorageOperationStatus.OK) {
2062 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
2063 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2065 final List<ComponentInstanceAttribute> updatedProperties = new ArrayList<>();
2067 for (final ComponentInstanceAttribute attribute : attributes) {
2068 final ComponentInstanceAttribute componentInstanceProperty = validateAttributeExistsOnComponent(attribute, containerComponent,
2069 foundResourceInstance);
2070 final Either<String, ResponseFormat> updatedPropertyValue = updateAttributeObjectValue(attribute);
2071 if (updatedPropertyValue.isRight()) {
2072 log.error("Failed to update attribute object value of attribute: {}", attribute);
2073 throw new ByResponseFormatComponentException(updatedPropertyValue.right().value());
2075 updatedPropertyValue.bimap(
2077 componentInstanceProperty.setValue(updatedValue);
2078 return updateAttributeOnContainerComponent(attribute, updatedValue,
2079 containerComponent, foundResourceInstance);
2081 updatedProperties.add(componentInstanceProperty);
2084 final Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
2085 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
2086 if (updateContainerRes.isRight()) {
2087 final ActionStatus actionStatus = componentsUtils
2088 .convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
2089 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2092 resultOp = Either.left(updatedProperties);
2095 } catch (final ComponentException e) {
2096 return Either.right(e.getResponseFormat());
2098 if (resultOp == null || resultOp.isRight()) {
2099 janusGraphDao.rollback();
2101 janusGraphDao.commit();
2104 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2108 private void validateMandatoryFields(PropertyDataDefinition property) {
2109 if (StringUtils.isEmpty(property.getName())) {
2110 throw new ByActionStatusComponentException(ActionStatus.MISSING_PROPERTY_NAME);
2114 private void validatePropertyExistsOnComponent(ComponentInstanceProperty property, Component containerComponent,
2115 ComponentInstance foundResourceInstance) {
2116 List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties()
2117 .get(foundResourceInstance.getUniqueId());
2118 final boolean hasProperty = instanceProperties.stream().anyMatch(p -> p.getName().equals(property.getName()));
2120 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, property.getName());
2124 private ComponentInstanceAttribute validateAttributeExistsOnComponent(final ComponentInstanceAttribute attribute,
2125 final Component containerComponent,
2126 final ComponentInstance foundResourceInstance) {
2127 final List<ComponentInstanceAttribute> instanceProperties =
2128 containerComponent.getComponentInstancesAttributes().get(foundResourceInstance.getUniqueId());
2129 final Optional<ComponentInstanceAttribute> instanceAttribute =
2130 instanceProperties.stream().filter(p -> p.getName().equals(attribute.getName())).findAny();
2131 if (!instanceAttribute.isPresent()) {
2132 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, attribute.getName());
2134 return instanceAttribute.get();
2137 private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property,
2138 String newValue, Component containerComponent,
2139 ComponentInstance foundResourceInstance,
2140 String capabilityType, String capabilityName) {
2141 String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
2142 ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
2143 foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
2144 if (actionStatus != null) {
2145 return actionStatus;
2148 return componentsUtils.getResponseFormat(ActionStatus.OK);
2151 private ResponseFormat updateCapabilityPropFromUpdateInstProp(ComponentInstanceProperty property,
2152 String newValue, Component containerComponent,
2153 ComponentInstance foundResourceInstance,
2154 String capabilityType, String capabilityName) {
2155 String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
2156 Either<Component, StorageOperationStatus> getComponentRes =
2157 toscaOperationFacade.getToscaFullElement(foundResourceInstance.getComponentUid());
2158 if (getComponentRes.isRight()) {
2159 return componentsUtils.getResponseFormat(getComponentRes.right().value());
2162 ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
2163 foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
2164 if (actionStatus != null) {
2165 return actionStatus;
2168 return componentsUtils.getResponseFormat(ActionStatus.OK);
2171 private ResponseFormat updateCapPropOnContainerComponent(ComponentInstanceProperty property, String newValue,
2172 Component containerComponent,
2173 ComponentInstance foundResourceInstance,
2174 String capabilityType, String capabilityName,
2175 String componentInstanceUniqueId) {
2176 Map<String, List<CapabilityDefinition>> capabilities =
2177 Optional.ofNullable(foundResourceInstance.getCapabilities()).orElse(Collections.emptyMap());
2178 List<CapabilityDefinition> capPerType =
2179 Optional.ofNullable(capabilities.get(capabilityType)).orElse(Collections.emptyList());
2180 Optional<CapabilityDefinition> cap =
2181 capPerType.stream().filter(c -> c.getName().equals(capabilityName)).findAny();
2182 if (cap.isPresent()) {
2183 List<ComponentInstanceProperty> capProperties = cap.get().getProperties();
2184 if (capProperties != null) {
2185 Optional<ComponentInstanceProperty> instanceProperty =
2186 capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
2187 StorageOperationStatus status;
2188 if (instanceProperty.isPresent()) {
2189 String capKey = ModelConverter
2190 .buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName,
2191 componentInstanceUniqueId, cap.get());
2192 instanceProperty.get().setValue(newValue);
2193 List<String> path = new ArrayList<>();
2194 path.add(componentInstanceUniqueId);
2196 instanceProperty.get().setPath(path);
2197 status = toscaOperationFacade.updateComponentInstanceCapabiltyProperty(containerComponent,
2198 componentInstanceUniqueId, capKey, instanceProperty.get());
2199 if (status != StorageOperationStatus.OK) {
2200 ActionStatus actionStatus =
2201 componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2202 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2205 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2212 private ResponseFormat updatePropertyOnContainerComponent(ComponentInstanceProperty instanceProperty, String newValue,
2213 Component containerComponent, ComponentInstance foundResourceInstance) {
2214 StorageOperationStatus status;
2215 instanceProperty.setValue(newValue);
2216 status = toscaOperationFacade.updateComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(), instanceProperty);
2217 if (status != StorageOperationStatus.OK) {
2218 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2219 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2221 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2222 return componentsUtils.getResponseFormat(ActionStatus.OK);
2225 private ResponseFormat updateAttributeOnContainerComponent(final ComponentInstanceAttribute instanceAttribute,
2226 final String newValue,
2227 final Component containerComponent,
2228 final ComponentInstance foundResourceInstance) {
2230 instanceAttribute.setValue(newValue);
2231 final StorageOperationStatus status =
2232 toscaOperationFacade.updateComponentInstanceAttribute(containerComponent, foundResourceInstance.getUniqueId(), instanceAttribute);
2233 if (status != StorageOperationStatus.OK) {
2234 final ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2235 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2237 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2238 return componentsUtils.getResponseFormat(ActionStatus.OK);
2241 private <T extends PropertyDefinition> Either<String, ResponseFormat> validatePropertyObjectValue(T property, String newValue, boolean isInput) {
2242 final Map<String, DataTypeDefinition> allDataTypes = componentsUtils.getAllDataTypes(applicationDataTypeCache, property.getModel());
2243 String propertyType = property.getType();
2244 String innerType = getInnerType(property);
2246 // Specific Update Logic
2247 Either<Object, Boolean> isValid = propertyOperation
2248 .validateAndUpdatePropertyValue(property.getType(), newValue, true, innerType, allDataTypes);
2249 if (isValid.isRight()) {
2250 if (!Boolean.TRUE.equals(isValid.right().value())) {
2251 log.error("Invalid value {} of property {} ", newValue, property.getName());
2252 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
2255 Object object = isValid.left().value();
2256 if (object != null) {
2257 newValue = object.toString();
2260 if (validateAndUpdateRules(property, isInput, allDataTypes, innerType, propertyType)) {
2261 return Either.right(componentsUtils.getResponseFormat(componentsUtils
2262 .convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
2264 return Either.left(newValue);
2267 private <T extends PropertyDefinition> boolean validateAndUpdateRules(T property, boolean isInput, Map<String, DataTypeDefinition> allDataTypes,
2268 String innerType, String propertyType) {
2270 ImmutablePair<String, Boolean> pair = propertyOperation
2271 .validateAndUpdateRules(propertyType, ((ComponentInstanceProperty) property).getRules(), innerType, allDataTypes, true);
2272 if (pair.getRight() != null && !pair.getRight()) {
2273 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
2280 private <T extends PropertyDefinition> Either<String, ResponseFormat> updatePropertyObjectValue(T property, final String model) {
2281 final Map<String, DataTypeDefinition> allDataTypes = componentsUtils.getAllDataTypes(applicationDataTypeCache, model);
2282 String innerType = null;
2283 String propertyType = property.getType();
2284 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
2285 log.debug("The type of the property {} is {}", property.getUniqueId(), propertyType);
2287 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
2288 SchemaDefinition schema = property.getSchema();
2289 if (schema == null) {
2290 log.debug("Schema doesn't exists for property of type {}", type);
2292 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2294 PropertyDataDefinition propDef = schema.getProperty();
2295 if (propDef == null) {
2296 log.debug("Property in Schema Definition inside property of type {} doesn't exist", type);
2298 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2300 innerType = propDef.getType();
2303 // Specific Update Logic
2304 String newValue = property.getValue();
2306 if (property.hasToscaFunction()) {
2307 return Either.left(newValue);
2310 Either<Object, Boolean> isValid = propertyOperation
2311 .validateAndUpdatePropertyValue(propertyType, property.getValue(), true, innerType, allDataTypes);
2312 if (isValid.isRight()) {
2313 if (!Boolean.TRUE.equals(isValid.right().value())) {
2314 log.debug("validate and update property value has failed with value: {}", property.getValue());
2315 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(
2316 DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
2319 Object object = isValid.left().value();
2320 if (object != null) {
2321 newValue = object.toString();
2324 ImmutablePair<String, Boolean> pair = propertyOperation
2325 .validateAndUpdateRules(propertyType, ((ComponentInstanceProperty) property).getRules(), innerType, allDataTypes, true);
2326 if (pair.getRight() != null && Boolean.FALSE.equals(pair.getRight())) {
2327 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
2328 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(
2329 DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
2331 return Either.left(newValue);
2334 private <T extends AttributeDefinition> Either<String, ResponseFormat> updateAttributeObjectValue(final T attribute) {
2335 String innerType = null;
2336 final String attributeType = attribute.getType();
2337 final ToscaPropertyType type = ToscaPropertyType.isValidType(attributeType);
2338 log.debug("The type of the attribute {} is {}", attribute.getUniqueId(), attributeType);
2340 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
2341 final SchemaDefinition def = attribute.getSchema();
2343 log.debug("Schema doesn't exists for attribute of type {}", type);
2345 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2347 PropertyDataDefinition propDef = def.getProperty();
2348 if (propDef == null) {
2349 log.debug("Property in Schema Definition inside attribute of type {} doesn't exist", type);
2351 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2353 innerType = propDef.getType();
2356 // Specific Update Logic
2357 String newValue = attribute.getValue();
2359 final var isValid = attributeOperation.validateAndUpdateAttributeValue(attribute, innerType,
2360 componentsUtils.getAllDataTypes(applicationDataTypeCache, attribute.getModel()));
2361 if (isValid.isRight()) {
2362 final Boolean res = isValid.right().value();
2363 if (!Boolean.TRUE.equals(res)) {
2364 log.debug("validate and update attribute value has failed with value: {}", newValue);
2365 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(
2366 DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
2369 final Object object = isValid.left().value();
2370 if (object != null) {
2371 newValue = object.toString();
2374 return Either.left(newValue);
2377 private <T extends PropertyDefinition> void validateToscaGetFunction(T property, Component parentComponent) {
2378 final ToscaGetFunctionDataDefinition toscaGetFunction = (ToscaGetFunctionDataDefinition) property.getToscaFunction();
2379 validateGetToscaFunctionAttributes(toscaGetFunction);
2380 validateGetPropertySource(toscaGetFunction.getFunctionType(), toscaGetFunction.getPropertySource());
2381 if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_INPUT) {
2382 validateGetFunction(property, parentComponent.getInputs(), parentComponent.getModel());
2385 if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_PROPERTY) {
2386 if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
2387 validateGetFunction(property, parentComponent.getProperties(), parentComponent.getModel());
2388 } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
2389 final ComponentInstance componentInstance =
2390 parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
2391 .orElseThrow(ToscaGetFunctionExceptionSupplier.instanceNotFound(toscaGetFunction.getSourceName()));
2392 validateGetFunction(property, componentInstance.getProperties(), parentComponent.getModel());
2397 if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_ATTRIBUTE) {
2398 if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
2399 validateGetFunction(property, parentComponent.getAttributes(), parentComponent.getModel());
2400 } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
2401 final ComponentInstance componentInstance =
2402 parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
2403 .orElseThrow(ToscaGetFunctionExceptionSupplier.instanceNotFound(toscaGetFunction.getSourceName()));
2404 validateGetFunction(property, componentInstance.getAttributes(), parentComponent.getModel());
2410 throw ToscaGetFunctionExceptionSupplier.functionNotSupported(toscaGetFunction.getFunctionType()).get();
2413 private <T extends PropertyDefinition> void validateGetFunction(final T property,
2414 final List<? extends ToscaPropertyData> parentProperties,
2415 final String model) {
2416 final ToscaGetFunctionDataDefinition toscaGetFunction = (ToscaGetFunctionDataDefinition) property.getToscaFunction();
2417 if (CollectionUtils.isEmpty(parentProperties)) {
2418 throw ToscaGetFunctionExceptionSupplier
2419 .propertyNotFoundOnTarget(toscaGetFunction.getPropertyName(), toscaGetFunction.getPropertySource(),
2420 toscaGetFunction.getFunctionType()
2423 final String getFunctionPropertyUniqueId = toscaGetFunction.getPropertyUniqueId();
2424 ToscaPropertyData referredProperty = parentProperties.stream()
2425 .filter(property1 -> getFunctionPropertyUniqueId.equals(property1.getUniqueId()))
2427 .orElseThrow(ToscaGetFunctionExceptionSupplier
2428 .propertyNotFoundOnTarget(toscaGetFunction.getPropertyName(), toscaGetFunction.getPropertySource()
2429 , toscaGetFunction.getFunctionType())
2431 if (toscaGetFunction.isSubProperty()) {
2432 referredProperty = findSubProperty(referredProperty, toscaGetFunction, model);
2435 if (!property.getType().equals(referredProperty.getType())) {
2436 throw ToscaGetFunctionExceptionSupplier
2437 .propertyTypeDiverge(toscaGetFunction.getType(), referredProperty.getType(), property.getType()).get();
2439 if (PropertyType.typeHasSchema(referredProperty.getType()) && !referredProperty.getSchemaType().equals(property.getSchemaType())) {
2440 throw ToscaGetFunctionExceptionSupplier
2441 .propertySchemaDiverge(toscaGetFunction.getType(), referredProperty.getSchemaType(), property.getSchemaType()).get();
2445 private ToscaPropertyData findSubProperty(final ToscaPropertyData referredProperty,
2446 final ToscaGetFunctionDataDefinition toscaGetFunction,
2447 final String model) {
2448 final Map<String, DataTypeDefinition> dataTypeMap = loadDataTypes(model);
2449 final List<String> propertyPathFromSource = toscaGetFunction.getPropertyPathFromSource();
2450 DataTypeDefinition dataType = dataTypeMap.get(referredProperty.getType());
2451 if (dataType == null) {
2452 throw ToscaGetFunctionExceptionSupplier
2453 .propertyDataTypeNotFound(propertyPathFromSource.get(0), referredProperty.getType(), toscaGetFunction.getFunctionType()).get();
2455 ToscaPropertyData foundProperty = referredProperty;
2456 for (int i = 1; i < propertyPathFromSource.size(); i++) {
2457 final String currentPropertyName = propertyPathFromSource.get(i);
2458 foundProperty = dataType.getProperties().stream()
2459 .filter(propertyDefinition -> currentPropertyName.equals(propertyDefinition.getName())).findFirst()
2461 ToscaGetFunctionExceptionSupplier
2462 .propertyNotFoundOnTarget(propertyPathFromSource.subList(0, i), toscaGetFunction.getPropertySource(),
2463 toscaGetFunction.getFunctionType())
2465 dataType = dataTypeMap.get(foundProperty.getType());
2466 if (dataType == null) {
2467 throw ToscaGetFunctionExceptionSupplier
2468 .propertyDataTypeNotFound(propertyPathFromSource.subList(0, i), foundProperty.getType(),
2469 toscaGetFunction.getFunctionType()).get();
2472 return foundProperty;
2475 private Map<String, DataTypeDefinition> loadDataTypes(String model) {
2476 final Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> dataTypeEither =
2477 applicationDataTypeCache.getAll(model);
2478 if (dataTypeEither.isRight()) {
2479 throw ToscaGetFunctionExceptionSupplier.couldNotLoadDataTypes(model).get();
2481 return dataTypeEither.left().value();
2484 private void validateGetPropertySource(final ToscaGetFunctionType functionType, final PropertySource propertySource) {
2485 if (functionType == ToscaGetFunctionType.GET_INPUT && propertySource != PropertySource.SELF) {
2486 throw ToscaGetFunctionExceptionSupplier
2487 .targetSourceNotSupported(functionType, propertySource).get();
2489 if (functionType == ToscaGetFunctionType.GET_PROPERTY && !List.of(PropertySource.SELF, PropertySource.INSTANCE).contains(propertySource)) {
2490 throw ToscaGetFunctionExceptionSupplier
2491 .targetSourceNotSupported(functionType, propertySource).get();
2495 private void validateGetToscaFunctionAttributes(final ToscaGetFunctionDataDefinition toscaGetFunction) {
2496 if (toscaGetFunction.getFunctionType() == null) {
2497 throw ToscaGetFunctionExceptionSupplier.targetFunctionTypeNotFound().get();
2499 if (toscaGetFunction.getPropertySource() == null) {
2500 throw ToscaGetFunctionExceptionSupplier.targetPropertySourceNotFound(toscaGetFunction.getFunctionType()).get();
2502 if (CollectionUtils.isEmpty(toscaGetFunction.getPropertyPathFromSource())) {
2503 throw ToscaGetFunctionExceptionSupplier
2504 .targetSourcePathNotFound(toscaGetFunction.getFunctionType()).get();
2506 if (StringUtils.isEmpty(toscaGetFunction.getSourceName()) || StringUtils.isBlank(toscaGetFunction.getSourceName())) {
2507 throw ToscaGetFunctionExceptionSupplier.sourceNameNotFound(toscaGetFunction.getPropertySource()).get();
2509 if (StringUtils.isEmpty(toscaGetFunction.getSourceUniqueId()) || StringUtils.isBlank(toscaGetFunction.getSourceUniqueId())) {
2510 throw ToscaGetFunctionExceptionSupplier.sourceIdNotFound(toscaGetFunction.getPropertySource()).get();
2512 if (StringUtils.isEmpty(toscaGetFunction.getPropertyName()) || StringUtils.isBlank(toscaGetFunction.getPropertyName())) {
2513 throw ToscaGetFunctionExceptionSupplier.propertyNameNotFound(toscaGetFunction.getPropertySource()).get();
2515 if (StringUtils.isEmpty(toscaGetFunction.getPropertyUniqueId()) || StringUtils.isBlank(toscaGetFunction.getPropertyUniqueId())) {
2516 throw ToscaGetFunctionExceptionSupplier.propertyIdNotFound(toscaGetFunction.getPropertySource()).get();
2520 private ResponseFormat updateInputOnContainerComponent(ComponentInstanceInput input, String newValue, Component containerComponent,
2521 ComponentInstance foundResourceInstance) {
2522 StorageOperationStatus status;
2523 input.setValue(newValue);
2524 status = toscaOperationFacade.updateComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), input);
2525 if (status != StorageOperationStatus.OK) {
2526 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2527 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2529 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2530 return componentsUtils.getResponseFormat(ActionStatus.OK);
2533 public Either<List<ComponentInstanceInput>, ResponseFormat> createOrUpdateInstanceInputValues(ComponentTypeEnum componentTypeEnum,
2534 String componentId, String resourceInstanceId,
2535 List<ComponentInstanceInput> inputs,
2538 Either<List<ComponentInstanceInput>, ResponseFormat> resultOp = null;
2540 validateUserExists(userId);
2542 if (componentTypeEnum == null) {
2543 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2544 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2547 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
2549 if (getResourceResult.isRight()) {
2550 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
2551 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
2552 return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
2554 Component containerComponent = getResourceResult.left().value();
2556 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
2557 if (Boolean.TRUE.equals(containerComponent.isArchived())) {
2558 log.info(COMPONENT_ARCHIVED, componentId);
2559 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
2561 log.info(RESTRICTED_OPERATION_ON_SERVIVE, userId, componentId);
2562 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2565 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
2566 if (resourceInstanceStatus.isRight()) {
2567 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
2568 resourceInstanceId, RESOURCE_INSTANCE, SERVICE, componentId));
2571 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
2574 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
2575 if (lockStatus != StorageOperationStatus.OK) {
2576 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
2577 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2579 List<ComponentInstanceInput> updatedInputs = new ArrayList<>();
2581 for (ComponentInstanceInput input : inputs) {
2582 validateMandatoryFields(input);
2583 ComponentInstanceInput componentInstanceInput = validateInputExistsOnComponent(input, containerComponent, foundResourceInstance);
2584 Either<String, ResponseFormat> validatedInputValue = validatePropertyObjectValue(componentInstanceInput, input.getValue(), true);
2585 if (validatedInputValue.isRight()) {
2586 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT, input.getName());
2588 updateInputOnContainerComponent(componentInstanceInput, validatedInputValue.left().value(), containerComponent,
2589 foundResourceInstance);
2590 updatedInputs.add(componentInstanceInput);
2592 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
2593 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
2594 if (updateContainerRes.isRight()) {
2595 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
2596 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2599 resultOp = Either.left(updatedInputs);
2603 if (resultOp == null || resultOp.isRight()) {
2604 janusGraphDao.rollback();
2606 janusGraphDao.commit();
2609 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2614 private ComponentInstanceInput validateInputExistsOnComponent(ComponentInstanceInput input, Component containerComponent,
2615 ComponentInstance foundResourceInstance) {
2616 List<ComponentInstanceInput> instanceProperties = containerComponent.getComponentInstancesInputs().get(foundResourceInstance.getUniqueId());
2617 Optional<ComponentInstanceInput> instanceInput = instanceProperties.stream().filter(p -> p.getName().equals(input.getName())).findAny();
2618 if (!instanceInput.isPresent()) {
2619 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, input.getName());
2621 return instanceInput.get();
2624 public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateGroupInstancePropertyValue(ComponentTypeEnum componentTypeEnum,
2625 String componentId, String resourceInstanceId,
2626 String groupInstanceId,
2627 ComponentInstanceProperty property,
2630 Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
2632 validateUserExists(userId);
2634 if (componentTypeEnum == null) {
2635 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2636 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2640 if (!ComponentValidationUtils.canWorkOnComponent(componentId, toscaOperationFacade, userId)) {
2641 log.info("Restricted operation for user: {} on service: {}", userId, componentId);
2642 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2646 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
2647 if (lockStatus != StorageOperationStatus.OK) {
2648 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
2649 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2653 String propertyValueUid = property.getValueUniqueUid();
2655 if (propertyValueUid == null) {
2657 Either<Integer, StorageOperationStatus> counterRes = groupInstanceOperation
2658 .increaseAndGetGroupInstancePropertyCounter(groupInstanceId);
2660 if (counterRes.isRight()) {
2661 log.debug("increaseAndGetResourcePropertyCounter failed resource instance: {} property: {}", resourceInstanceId, property);
2662 StorageOperationStatus status = counterRes.right().value();
2663 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2664 resultOp = Either.right(componentsUtils.getResponseFormat(actionStatus));
2666 Integer index = counterRes.left().value();
2667 Either<ComponentInstanceProperty, StorageOperationStatus> result = groupInstanceOperation
2668 .addPropertyValueToGroupInstance(property, resourceInstanceId, index, true);
2670 if (result.isLeft()) {
2671 log.trace("Property value was added to resource instance {}", resourceInstanceId);
2672 ComponentInstanceProperty instanceProperty = result.left().value();
2674 resultOp = Either.left(instanceProperty);
2677 log.debug("Failed to add property value: {} to resource instance {}", property, resourceInstanceId);
2679 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2681 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2685 Either<ComponentInstanceProperty, StorageOperationStatus> result = groupInstanceOperation
2686 .updatePropertyValueInGroupInstance(property, resourceInstanceId, true);
2688 if (result.isLeft()) {
2689 log.debug("Property value {} was updated on graph.", property.getValueUniqueUid());
2690 ComponentInstanceProperty instanceProperty = result.left().value();
2692 resultOp = Either.left(instanceProperty);
2695 log.debug("Failed to update property value: {}, in resource instance {}", property, resourceInstanceId);
2697 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2699 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2702 if (resultOp.isLeft()) {
2703 StorageOperationStatus updateCustomizationUUID = componentInstanceOperation.updateCustomizationUUID(resourceInstanceId);
2704 if (updateCustomizationUUID != StorageOperationStatus.OK) {
2705 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateCustomizationUUID);
2707 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2714 if (resultOp == null || resultOp.isRight()) {
2715 janusGraphDao.rollback();
2717 janusGraphDao.commit();
2720 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2725 public Either<ComponentInstanceProperty, ResponseFormat> deletePropertyValue(ComponentTypeEnum componentTypeEnum, String serviceId,
2726 String resourceInstanceId, String propertyValueId, String userId) {
2728 validateUserExists(userId);
2730 Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
2732 if (componentTypeEnum == null) {
2733 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2734 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2738 if (!ComponentValidationUtils.canWorkOnComponent(serviceId, toscaOperationFacade, userId)) {
2739 log.info("Restricted operation for user {} on service {}", userId, serviceId);
2740 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2744 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(serviceId, componentTypeEnum.getNodeType());
2745 if (lockStatus != StorageOperationStatus.OK) {
2746 log.debug(FAILED_TO_LOCK_SERVICE, serviceId);
2747 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2751 Either<ComponentInstanceProperty, StorageOperationStatus> result = propertyOperation
2752 .removePropertyValueFromResourceInstance(propertyValueId, resourceInstanceId, true);
2754 if (result.isLeft()) {
2755 log.debug("Property value {} was removed from graph.", propertyValueId);
2756 ComponentInstanceProperty instanceProperty = result.left().value();
2758 resultOp = Either.left(instanceProperty);
2762 log.debug("Failed to remove property value {} in resource instance {}", propertyValueId, resourceInstanceId);
2764 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2766 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2772 if (resultOp == null || resultOp.isRight()) {
2773 janusGraphDao.rollback();
2775 janusGraphDao.commit();
2778 graphLockOperation.unlockComponent(serviceId, componentTypeEnum.getNodeType());
2783 private Component getAndValidateOriginComponentOfComponentInstance(Component containerComponent, ComponentInstance componentInstance) {
2785 ComponentTypeEnum componentType = getComponentTypeByParentComponentType(containerComponent.getComponentType());
2786 Component component;
2787 Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaFullElement(componentInstance.getComponentUid());
2788 if (getComponentRes.isRight()) {
2789 log.debug("Failed to get the component with id {} for component instance {} creation. ", componentInstance.getComponentUid(),
2790 componentInstance.getName());
2791 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getComponentRes.right().value(), componentType);
2792 throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
2794 component = getComponentRes.left().value();
2795 LifecycleStateEnum resourceCurrState = component.getLifecycleState();
2796 if (resourceCurrState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
2797 ActionStatus actionStatus = ActionStatus.CONTAINER_CANNOT_CONTAIN_COMPONENT_IN_STATE;
2798 throw new ByActionStatusComponentException(actionStatus, containerComponent.getComponentType().toString(), resourceCurrState.toString());
2800 if (Boolean.TRUE.equals(component.isArchived())) {
2801 ActionStatus actionStatus = ActionStatus.COMPONENT_IS_ARCHIVED;
2802 throw new ByActionStatusComponentException(actionStatus, component.getName());
2804 final Map<String, InterfaceDefinition> componentInterfaces = component.getInterfaces();
2805 if (MapUtils.isNotEmpty(componentInterfaces)) {
2806 componentInterfaces.forEach(componentInstance::addInterface);
2811 public Either<Set<String>, ResponseFormat> forwardingPathOnVersionChange(String containerComponentParam,
2812 String containerComponentId,
2813 String componentInstanceId,
2814 ComponentInstance newComponentInstance) {
2815 Either<Set<String>, ResponseFormat> resultOp;
2816 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
2817 ComponentParametersView componentParametersView = getComponentParametersViewForForwardingPath();
2820 Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
2822 //Fetch current component instance
2823 Either<ComponentInstance, StorageOperationStatus> eitherResourceInstance =
2824 getResourceInstanceById(containerComponent, componentInstanceId);
2825 if (eitherResourceInstance.isRight()) {
2826 resultOp = Either.right(componentsUtils.getResponseFormat(
2827 ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId));
2830 ComponentInstance currentResourceInstance = eitherResourceInstance.left().value();
2832 //Check whether new componentInstance exists
2833 String resourceId = newComponentInstance.getComponentUid();
2834 Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade.validateComponentExists(resourceId);
2835 if (componentExistsRes.isRight()) {
2836 log.debug("Failed to find resource {}", resourceId);
2837 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse
2838 (componentExistsRes.right().value()), resourceId));
2840 } else if (!Boolean.TRUE.equals(componentExistsRes.left().value())) {
2841 log.debug("The resource {} not found ", resourceId);
2842 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
2846 //Fetch component using new component instance uid
2847 Component updatedContainerComponent = getOriginComponentFromComponentInstance(newComponentInstance);
2848 Set<String> toDeleteForwardingPaths = getForwardingPaths(containerComponent,
2849 currentResourceInstance, updatedContainerComponent);
2850 resultOp = Either.left(toDeleteForwardingPaths);
2855 private Set<String> getForwardingPaths(Component containerComponent, ComponentInstance currentResourceInstance,
2856 Component updatedContainerComponent) {
2857 DataForMergeHolder dataForMergeHolder = new DataForMergeHolder();
2858 dataForMergeHolder.setOrigComponentInstId(currentResourceInstance.getName());
2860 Service service = (Service) containerComponent;
2861 ForwardingPathUtils forwardingPathUtils = new ForwardingPathUtils();
2863 return forwardingPathUtils.
2864 getForwardingPathsToBeDeletedOnVersionChange(service, dataForMergeHolder, updatedContainerComponent);
2867 private ComponentParametersView getComponentParametersViewForForwardingPath() {
2868 ComponentParametersView componentParametersView = new ComponentParametersView();
2869 componentParametersView.setIgnoreCapabiltyProperties(false);
2870 componentParametersView.setIgnoreServicePath(false);
2871 return componentParametersView;
2874 public ComponentInstance changeComponentInstanceVersion(String containerComponentParam, String containerComponentId, String componentInstanceId,
2875 String userId, ComponentInstance newComponentInstance) {
2877 User user = validateUserExists(userId);
2878 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
2879 ComponentParametersView componentParametersView = new ComponentParametersView();
2880 componentParametersView.setIgnoreCapabiltyProperties(false);
2882 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType,
2883 componentParametersView);
2885 validateCanWorkOnComponent(containerComponent, userId);
2887 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceId);
2888 if (resourceInstanceStatus.isRight()) {
2889 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId,
2890 containerComponentId);
2893 ComponentInstance currentResourceInstance = resourceInstanceStatus.left().value();
2895 return changeInstanceVersion(containerComponent, currentResourceInstance, newComponentInstance, user, containerComponentType);
2898 public ComponentInstance changeInstanceVersion(org.openecomp.sdc.be.model.Component containerComponent,
2899 ComponentInstance currentResourceInstance,
2900 ComponentInstance newComponentInstance,
2902 final ComponentTypeEnum containerComponentType) {
2903 boolean failed = false;
2904 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus;
2907 lockComponent(containerComponent, "changeComponentInstanceVersion");
2908 String containerComponentId = containerComponent.getUniqueId();
2909 String componentInstanceId = currentResourceInstance.getUniqueId();
2910 if (currentResourceInstance.getComponentUid().equals(newComponentInstance.getComponentUid())) {
2911 return currentResourceInstance;
2913 String resourceId = newComponentInstance.getComponentUid();
2915 Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade
2916 .validateComponentExists(resourceId);
2917 if (componentExistsRes.isRight()) {
2918 StorageOperationStatus errorStatus = componentExistsRes.right().value();
2920 log.debug("Failed to validate existing of the component {}. Status is {} ", resourceId, errorStatus);
2921 throw new ByActionStatusComponentException(
2922 componentsUtils.convertFromStorageResponse(errorStatus), resourceId);
2923 } else if (!Boolean.TRUE.equals(componentExistsRes.left().value())) {
2924 log.debug("The resource {} not found ", resourceId);
2925 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceId);
2928 Component eitherOriginComponent = getInstanceOriginNode(currentResourceInstance);
2929 DataForMergeHolder dataHolder = compInstMergeDataBL
2930 .saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent);
2931 ComponentInstance resResourceInfo = deleteComponentInstance(containerComponent, componentInstanceId,
2932 containerComponentType);
2934 if (resResourceInfo == null) {
2935 log.error("Calling `deleteComponentInstance` for the resource {} returned a null", resourceId);
2936 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceId);
2938 Component origComponent = null;
2939 OriginTypeEnum originType = currentResourceInstance.getOriginType();
2940 newComponentInstance.setOriginType(originType);
2941 if (originType == OriginTypeEnum.ServiceProxy) {
2942 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade
2943 .getLatestByName(SERVICE_PROXY, null);
2944 if (isServiceProxyOrigin(serviceProxyOrigin)) {
2945 throw new ByActionStatusComponentException(
2946 componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
2948 origComponent = serviceProxyOrigin.left().value();
2950 StorageOperationStatus fillProxyRes = fillInstanceData(newComponentInstance, origComponent);
2952 if (isFillProxyRes(fillProxyRes)) {
2953 throw new ByActionStatusComponentException(
2954 componentsUtils.convertFromStorageResponse(fillProxyRes));
2956 } else if (originType == OriginTypeEnum.ServiceSubstitution) {
2957 final Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade
2958 .getToscaFullElement(newComponentInstance.getComponentUid());
2959 if (getServiceResult.isRight()) {
2960 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
2962 final Component service = getServiceResult.left().value();
2964 final Either<Component, StorageOperationStatus> getServiceDerivedFromTypeResult = toscaOperationFacade
2965 .getLatestByToscaResourceName(service.getDerivedFromGenericType(), service.getModel());
2966 if (getServiceDerivedFromTypeResult.isRight()) {
2967 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
2970 origComponent = getServiceDerivedFromTypeResult.left().value();
2972 final StorageOperationStatus fillProxyRes = fillInstanceData(newComponentInstance, origComponent);
2973 if (isFillProxyRes(fillProxyRes)) {
2974 throw new ByActionStatusComponentException(
2975 componentsUtils.convertFromStorageResponse(fillProxyRes));
2978 origComponent = getOriginComponentFromComponentInstance(newComponentInstance);
2979 newComponentInstance.setName(resResourceInfo.getName());
2980 final Map<String, InterfaceDefinition> componentInterfaces = origComponent.getInterfaces();
2981 if (MapUtils.isNotEmpty(componentInterfaces)) {
2982 componentInterfaces.forEach(newComponentInstance::addInterface);
2986 newComponentInstance.setInvariantName(resResourceInfo.getInvariantName());
2987 newComponentInstance.setPosX(resResourceInfo.getPosX());
2988 newComponentInstance.setPosY(resResourceInfo.getPosY());
2989 newComponentInstance.setDescription(resResourceInfo.getDescription());
2990 newComponentInstance.setInstanceCount(resResourceInfo.getInstanceCount());
2991 newComponentInstance.setMaxOccurrences(resResourceInfo.getMaxOccurrences());
2992 newComponentInstance.setMinOccurrences(resResourceInfo.getMinOccurrences());
2993 checkForExternalReqAndCapabilities(origComponent, resResourceInfo);
2995 ComponentInstance updatedComponentInstance =
2996 createComponentInstanceOnGraph(containerComponent, origComponent, newComponentInstance, user);
2997 dataHolder.setCurrInstanceNode(origComponent);
2999 .mergeComponentUserOrigData(user, dataHolder, containerComponent, containerComponentId, newComponentInstance.getUniqueId());
3001 ActionStatus postChangeVersionResult = onChangeInstanceOperationOrchestrator
3002 .doPostChangeVersionOperations(containerComponent, currentResourceInstance, newComponentInstance);
3003 if (postChangeVersionResult != ActionStatus.OK) {
3004 throw new ByActionStatusComponentException(postChangeVersionResult);
3007 ComponentParametersView filter = new ComponentParametersView(true);
3008 filter.setIgnoreComponentInstances(false);
3009 Either<Component, StorageOperationStatus> updatedComponentRes = toscaOperationFacade.getToscaElement(containerComponentId, filter);
3010 if (updatedComponentRes.isRight()) {
3011 StorageOperationStatus storageOperationStatus = updatedComponentRes.right().value();
3012 ActionStatus actionStatus = componentsUtils
3013 .convertFromStorageResponse(storageOperationStatus, containerComponent.getComponentType());
3014 log.debug("Component with id {} was not found", containerComponentId);
3015 throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
3017 resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(),
3018 updatedComponentInstance.getUniqueId());
3019 if (resourceInstanceStatus.isRight()) {
3020 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse
3021 (resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId());
3023 return resourceInstanceStatus.left().value();
3025 } catch (ComponentException e) {
3029 unlockComponent(failed, containerComponent);
3033 private void checkForExternalReqAndCapabilities(Component component, ComponentInstance resResourceInfo) {
3034 Map<String, List<RequirementDefinition>> requirementsMap = resResourceInfo.getRequirements();
3035 Map<String, List<RequirementDefinition>> externalRequirementsMap = new HashMap<>();
3036 List<RequirementDefinition> externalRequirementList = new ArrayList<>();
3037 if (requirementsMap != null && !requirementsMap.isEmpty()) {
3038 requirementsMap.forEach((type, requirementDefinitions) -> {
3039 if (requirementDefinitions != null && !requirementDefinitions.isEmpty()) {
3040 for (final RequirementDefinition requirementDefinition : requirementDefinitions) {
3041 if (requirementDefinition.isExternal()) {
3042 externalRequirementList.add(requirementDefinition);
3043 externalRequirementsMap.put(type, externalRequirementList);
3050 Map<String, List<CapabilityDefinition>> capabilitiesMap = resResourceInfo.getCapabilities();
3051 Map<String, List<CapabilityDefinition>> externalCapabilitiesMap = new HashMap<>();
3052 List<CapabilityDefinition> externalCapabilitiesList = new ArrayList<>();
3053 if (capabilitiesMap != null && !capabilitiesMap.isEmpty()) {
3054 capabilitiesMap.forEach((type, capabilityDefinitions) -> {
3055 if (capabilityDefinitions != null && !capabilityDefinitions.isEmpty()) {
3056 for (final CapabilityDefinition capabilityDefinition : capabilityDefinitions) {
3057 if (capabilityDefinition.isExternal()) {
3058 externalCapabilitiesList.add(capabilityDefinition);
3059 externalCapabilitiesMap.put(type, externalCapabilitiesList);
3065 component.setCapabilities(externalCapabilitiesMap);
3066 component.setRequirements(externalRequirementsMap);
3069 private boolean isFillProxyRes(StorageOperationStatus fillProxyRes) {
3070 if (fillProxyRes != StorageOperationStatus.OK) {
3071 log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
3078 public List<ComponentInstanceProperty> getComponentInstancePropertiesById(String containerComponentTypeParam, String containerComponentId,
3079 String componentInstanceUniqueId, String userId) {
3080 Component containerComponent = null;
3082 boolean failed = false;
3084 validateUserExists(userId);
3085 validateComponentType(containerComponentTypeParam);
3087 Either<Component, StorageOperationStatus> validateContainerComponentExists = toscaOperationFacade.getToscaElement(containerComponentId);
3088 if (validateContainerComponentExists.isRight()) {
3089 throw new ByActionStatusComponentException(
3090 componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value()));
3092 containerComponent = validateContainerComponentExists.left().value();
3094 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent,
3095 componentInstanceUniqueId);
3096 if (resourceInstanceStatus.isRight()) {
3097 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId,
3098 containerComponentId);
3101 List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(componentInstanceUniqueId);
3102 if (CollectionUtils.isEmpty(instanceProperties)) {
3103 instanceProperties = new ArrayList<>();
3105 return instanceProperties;
3106 } catch (ComponentException e) {
3110 unlockComponent(failed, containerComponent);
3114 public List<ComponentInstanceAttribute> getComponentInstanceAttributesById(final String containerComponentTypeParam,
3115 final String containerComponentId,
3116 final String componentInstanceUniqueId,
3117 final String userId) {
3118 Component containerComponent = null;
3120 boolean failed = false;
3122 validateUserExists(userId);
3123 validateComponentType(containerComponentTypeParam);
3125 final Either<Component, StorageOperationStatus> validateContainerComponentExists =
3126 toscaOperationFacade.getToscaElement(containerComponentId);
3127 if (validateContainerComponentExists.isRight()) {
3128 throw new ByActionStatusComponentException(
3129 componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value()));
3131 containerComponent = validateContainerComponentExists.left().value();
3133 if (getResourceInstanceById(containerComponent, componentInstanceUniqueId).isRight()) {
3134 throw new ByActionStatusComponentException(
3135 ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId);
3138 final Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = containerComponent.getComponentInstancesAttributes();
3139 return componentInstancesAttributes == null ? new ArrayList<>()
3140 : componentInstancesAttributes.getOrDefault(componentInstanceUniqueId, new ArrayList<>());
3141 } catch (final ComponentException e) {
3145 unlockComponent(failed, containerComponent);
3149 protected void validateIncrementCounter(String resourceInstanceId, GraphPropertiesDictionary counterType,
3150 Wrapper<Integer> instaceCounterWrapper,
3151 Wrapper<ResponseFormat> errorWrapper) {
3152 Either<Integer, StorageOperationStatus> counterRes = componentInstanceOperation
3153 .increaseAndGetResourceInstanceSpecificCounter(resourceInstanceId, counterType, true);
3155 if (counterRes.isRight()) {
3156 log.debug("increase And Get {} failed resource instance {}", counterType, resourceInstanceId);
3157 StorageOperationStatus status = counterRes.right().value();
3158 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
3159 errorWrapper.setInnerElement(componentsUtils.getResponseFormat(actionStatus));
3161 instaceCounterWrapper.setInnerElement(counterRes.left().value());
3167 * updates componentInstance modificationTime
3169 * @param componentInstance
3170 * @param componentInstanceType
3171 * @param modificationTime
3172 * @param inTransaction
3175 public Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceModificationTimeAndCustomizationUuid(
3176 ComponentInstance componentInstance, NodeTypeEnum componentInstanceType, Long modificationTime, boolean inTransaction) {
3177 Either<ComponentInstanceData, ResponseFormat> result;
3178 Either<ComponentInstanceData, StorageOperationStatus> updateComponentInstanceRes = componentInstanceOperation
3179 .updateComponentInstanceModificationTimeAndCustomizationUuidOnGraph(componentInstance, componentInstanceType, modificationTime,
3181 if (updateComponentInstanceRes.isRight()) {
3182 log.debug("Failed to update component instance {} with new last update date and mofifier. Status is {}. ", componentInstance.getName(),
3183 updateComponentInstanceRes.right().value());
3185 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateComponentInstanceRes.right().value())));
3187 result = Either.left(updateComponentInstanceRes.left().value());
3192 public Either<ComponentInstance, ResponseFormat> deleteServiceProxy() {
3193 // TODO Add implementation
3194 return Either.left(new ComponentInstance());
3197 public Either<ComponentInstance, ResponseFormat> createServiceProxy() {
3198 // TODO Add implementation
3199 return Either.left(new ComponentInstance());
3202 public Either<ComponentInstance, ResponseFormat> changeServiceProxyVersion() {
3203 // TODO Add implementation
3204 return Either.left(new ComponentInstance());
3207 private Boolean validateInstanceNameUniquenessUponUpdate(Component containerComponent, ComponentInstance oldComponentInstance,
3208 String newInstanceName) {
3209 return ComponentValidations.validateNameIsUniqueInComponent(oldComponentInstance.getName(), newInstanceName, containerComponent);
3212 private Either<ComponentInstance, StorageOperationStatus> getResourceInstanceById(final Component containerComponent, final String instanceId) {
3213 final List<ComponentInstance> instances = containerComponent.getComponentInstances();
3214 if (CollectionUtils.isEmpty(instances)) {
3215 return Either.right(StorageOperationStatus.NOT_FOUND);
3218 final Optional<ComponentInstance> foundInstance = instances.stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
3219 if (foundInstance.isEmpty()) {
3220 return Either.right(StorageOperationStatus.NOT_FOUND);
3223 return Either.left(foundInstance.get());
3226 private ComponentInstance buildComponentInstance(ComponentInstance resourceInstanceForUpdate, ComponentInstance origInstanceForUpdate) {
3227 Long creationDate = origInstanceForUpdate.getCreationTime();
3228 Long modificationTime = System.currentTimeMillis();
3229 resourceInstanceForUpdate.setCreationTime(creationDate);
3230 resourceInstanceForUpdate.setModificationTime(modificationTime);
3231 resourceInstanceForUpdate.setCustomizationUUID(origInstanceForUpdate.getCustomizationUUID());
3232 if (StringUtils.isEmpty(resourceInstanceForUpdate.getName()) && StringUtils.isNotEmpty(origInstanceForUpdate.getName())) {
3233 resourceInstanceForUpdate.setName(origInstanceForUpdate.getName());
3235 resourceInstanceForUpdate.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(resourceInstanceForUpdate.getName()));
3236 if (StringUtils.isEmpty(resourceInstanceForUpdate.getIcon())) {
3237 resourceInstanceForUpdate.setIcon(origInstanceForUpdate.getIcon());
3239 if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentVersion())) {
3240 resourceInstanceForUpdate.setComponentVersion(origInstanceForUpdate.getComponentVersion());
3242 if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentName())) {
3243 resourceInstanceForUpdate.setComponentName(origInstanceForUpdate.getComponentName());
3245 if (StringUtils.isEmpty(resourceInstanceForUpdate.getToscaComponentName())) {
3246 resourceInstanceForUpdate.setToscaComponentName(origInstanceForUpdate.getToscaComponentName());
3248 if (resourceInstanceForUpdate.getOriginType() == null) {
3249 resourceInstanceForUpdate.setOriginType(origInstanceForUpdate.getOriginType());
3251 if (resourceInstanceForUpdate.getOriginType() == OriginTypeEnum.ServiceProxy) {
3252 resourceInstanceForUpdate.setIsProxy(true);
3254 if (resourceInstanceForUpdate.getSourceModelInvariant() == null) {
3255 resourceInstanceForUpdate.setSourceModelInvariant(origInstanceForUpdate.getSourceModelInvariant());
3257 if (resourceInstanceForUpdate.getSourceModelName() == null) {
3258 resourceInstanceForUpdate.setSourceModelName(origInstanceForUpdate.getSourceModelName());
3260 if (resourceInstanceForUpdate.getSourceModelUuid() == null) {
3261 resourceInstanceForUpdate.setSourceModelUuid(origInstanceForUpdate.getSourceModelUuid());
3263 if (resourceInstanceForUpdate.getSourceModelUid() == null) {
3264 resourceInstanceForUpdate.setSourceModelUid(origInstanceForUpdate.getSourceModelUid());
3266 if (resourceInstanceForUpdate.getCreatedFrom() == null) {
3267 resourceInstanceForUpdate.setCreatedFrom(origInstanceForUpdate.getCreatedFrom());
3269 return resourceInstanceForUpdate;
3273 * Returns list of ComponentInstanceProperty belonging to component instance capability specified by name, type and ownerId
3275 * @param containerComponentType
3276 * @param containerComponentId
3277 * @param componentInstanceUniqueId
3278 * @param capabilityType
3279 * @param capabilityName
3284 public List<ComponentInstanceProperty> getComponentInstanceCapabilityPropertiesById(String containerComponentType, String containerComponentId,
3285 String componentInstanceUniqueId, String capabilityType,
3286 String capabilityName, String ownerId, String userId) {
3287 Component containerComponent = null;
3288 List<ComponentInstanceProperty> resultOp = null;
3290 validateUserExists(userId);
3291 validateComponentType(containerComponentType);
3292 containerComponent = toscaOperationFacade.getToscaFullElement(containerComponentId).left().on(this::componentException);
3293 ComponentInstance resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId).left()
3294 .on(this::componentInstanceException);
3295 resultOp = findCapabilityOfInstance(containerComponentId, componentInstanceUniqueId, capabilityType, capabilityName, ownerId,
3296 resourceInstanceStatus.getCapabilities());
3297 } catch (StorageException | ComponentException e) {
3298 unlockRollbackWithException(containerComponent, e);
3299 } catch (Exception e) {
3300 unlockRollbackWithException(containerComponent, new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR));
3302 unlockWithCommit(containerComponent);
3306 private List<ComponentInstanceProperty> findCapabilityOfInstance(String componentId, String instanceId, String capabilityType,
3307 String capabilityName, String ownerId,
3308 Map<String, List<CapabilityDefinition>> instanceCapabilities) {
3309 CapabilityDefinition foundCapability;
3310 if (MapUtils.isNotEmpty(instanceCapabilities)) {
3311 List<CapabilityDefinition> capabilitiesPerType = instanceCapabilities.get(capabilityType);
3312 if (capabilitiesPerType != null) {
3313 Optional<CapabilityDefinition> capabilityOpt = capabilitiesPerType.stream()
3314 .filter(c -> c.getName().equals(capabilityName) && c.getOwnerId().equals(ownerId)).findFirst();
3315 if (capabilityOpt.isPresent()) {
3316 foundCapability = capabilityOpt.get();
3317 return foundCapability.getProperties() == null ? new ArrayList<>() : foundCapability.getProperties();
3321 return fetchComponentInstanceCapabilityProperties(componentId, instanceId, capabilityType, capabilityName, ownerId);
3324 private List<ComponentInstanceProperty> fetchComponentInstanceCapabilityProperties(String componentId, String instanceId, String capabilityType,
3325 String capabilityName, String ownerId) {
3327 return toscaOperationFacade.getComponentInstanceCapabilityProperties(componentId, instanceId, capabilityName, capabilityType, ownerId)
3328 .left().on(this::componentInstancePropertyListException);
3329 } catch (Exception e) {
3330 log.debug("The exception {} occurred upon the component {} instance {} capability {} properties retrieving. ", componentId, instanceId,
3332 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
3336 public Either<RequirementDefinition, ResponseFormat> updateInstanceRequirement(ComponentTypeEnum componentTypeEnum, String containerComponentId,
3337 String componentInstanceUniqueId,
3338 RequirementDefinition requirementDef, String userId) {
3339 Either<RequirementDefinition, ResponseFormat> resultOp = null;
3340 validateUserExists(userId);
3341 if (componentTypeEnum == null) {
3342 BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceRequirement", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
3343 return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
3345 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
3346 if (getResourceResult.isRight()) {
3347 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
3348 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3350 Component containerComponent = getResourceResult.left().value();
3351 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
3352 log.info(RESTRICTED_OPERATION_ON_COMPONENT, userId, containerComponentId);
3353 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3355 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent,
3356 componentInstanceUniqueId);
3357 if (resourceInstanceStatus.isRight()) {
3358 return Either.right(componentsUtils
3359 .getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
3362 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
3363 if (lockStatus != StorageOperationStatus.OK) {
3364 log.debug(FAILED_TO_LOCK_COMPONENT, containerComponentId);
3365 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
3368 StorageOperationStatus updateRequirementStatus = toscaOperationFacade
3369 .updateComponentInstanceRequirement(containerComponentId, componentInstanceUniqueId, requirementDef);
3370 if (updateRequirementStatus != StorageOperationStatus.OK) {
3371 log.debug("Failed to update component instance requirement on instance {} in container {}", componentInstanceUniqueId,
3372 containerComponentId);
3373 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateRequirementStatus)));
3375 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
3376 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3377 if (updateContainerRes.isRight()) {
3378 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3379 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3382 resultOp = Either.left(requirementDef);
3385 if (resultOp == null || resultOp.isRight()) {
3386 janusGraphDao.rollback();
3388 janusGraphDao.commit();
3391 graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
3395 public Either<CapabilityDefinition, ResponseFormat> updateInstanceCapability(final ComponentTypeEnum containerComponentType,
3396 final String containerComponentId,
3397 final String componentInstanceUniqueId,
3398 final CapabilityDefinition capabilityDefinition,
3399 final String userId) {
3400 if (containerComponentType == null) {
3401 BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapability", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
3402 return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
3404 validateUserExists(userId);
3405 final Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
3406 if (getResourceResult.isRight()) {
3407 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
3408 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_FOUND, containerComponentId));
3410 final Component containerComponent = getResourceResult.left().value();
3411 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
3412 log.info(RESTRICTED_OPERATION_ON_COMPONENT, userId, containerComponentId);
3413 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3415 final Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus =
3416 getResourceInstanceById(containerComponent, componentInstanceUniqueId);
3417 if (resourceInstanceStatus.isRight()) {
3418 return Either.right(componentsUtils
3419 .getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
3422 final StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, containerComponentType.getNodeType());
3423 if (lockStatus != StorageOperationStatus.OK) {
3424 log.debug(FAILED_TO_LOCK_COMPONENT, containerComponentId);
3425 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
3427 var success = false;
3429 final CapabilityDataDefinition updatedCapabilityDefinition = toscaOperationFacade
3430 .updateComponentInstanceCapability(containerComponentId, componentInstanceUniqueId, capabilityDefinition);
3431 final Either<Component, StorageOperationStatus> updateContainerEither = toscaOperationFacade
3432 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3433 if (updateContainerEither.isRight()) {
3434 var actionStatus = componentsUtils.convertFromStorageResponse(updateContainerEither.right().value(), containerComponentType);
3435 return Either.right(componentsUtils.getResponseFormat(actionStatus));
3438 return Either.left(new CapabilityDefinition(updatedCapabilityDefinition));
3439 } catch (final BusinessException e) {
3440 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, NodeTemplateOperation.class.getName(), (ErrorLogOptionalData) null,
3441 FAILED_TO_UPDATE_COMPONENT_INSTANCE_CAPABILITY, componentInstanceUniqueId, containerComponentId);
3443 } catch (final Exception e) {
3444 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, NodeTemplateOperation.class.getName(), (ErrorLogOptionalData) null,
3445 FAILED_TO_UPDATE_COMPONENT_INSTANCE_CAPABILITY, componentInstanceUniqueId, containerComponentId);
3446 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
3449 janusGraphDao.commit();
3451 janusGraphDao.rollback();
3454 graphLockOperation.unlockComponent(containerComponentId, containerComponentType.getNodeType());
3458 public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum,
3459 String containerComponentId,
3460 String componentInstanceUniqueId,
3461 String capabilityType, String capabilityName,
3462 List<ComponentInstanceProperty> properties,
3464 Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
3465 validateUserExists(userId);
3466 if (componentTypeEnum == null) {
3467 BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
3468 return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
3470 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
3471 if (getResourceResult.isRight()) {
3472 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
3473 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3475 Component containerComponent = getResourceResult.left().value();
3476 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
3477 log.info(RESTRICTED_OPERATION_ON_COMPONENT, userId, containerComponentId);
3478 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3480 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent,
3481 componentInstanceUniqueId);
3482 if (resourceInstanceStatus.isRight()) {
3483 return Either.right(componentsUtils
3484 .getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
3486 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
3488 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
3489 if (lockStatus != StorageOperationStatus.OK) {
3490 log.debug(FAILED_TO_LOCK_COMPONENT, containerComponentId);
3491 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
3494 for (ComponentInstanceProperty property : properties) {
3495 Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, property.getValue(), false);
3496 newPropertyValueEither.bimap(
3497 updatedValue -> updateCapabilityPropertyOnContainerComponent(property, updatedValue, containerComponent, foundResourceInstance,
3498 capabilityType, capabilityName), Either::right);
3500 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
3501 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3502 if (updateContainerRes.isRight()) {
3503 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3504 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3507 resultOp = Either.left(properties);
3510 if (resultOp == null || resultOp.isRight()) {
3511 janusGraphDao.rollback();
3513 janusGraphDao.commit();
3516 graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
3520 public Either<Map<String, ComponentInstance>, ResponseFormat> copyComponentInstance(ComponentInstance inputComponentInstance,
3521 String containerComponentId, String componentInstanceId,
3523 Map<String, ComponentInstance> resultMap = new HashMap<>();
3524 Either<Component, StorageOperationStatus> getOrigComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3525 if (getOrigComponent.isRight()) {
3526 log.error("Failed to get the original component information");
3527 return Either.right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED, FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS));
3529 Component origComponent = getOrigComponent.left().value();
3531 lockComponent(origComponent, "copyComponentInstance");
3532 } catch (ComponentException e) {
3533 log.error("destComponentInstance's data is {}", origComponent.toString());
3534 return Either.right(componentsUtils
3535 .getResponseFormat(ActionStatus.USER_DEFINED, "Failed to lock component destComponentInstance's data is {}",
3536 origComponent.toString()));
3538 boolean failed = false;
3539 ComponentInstance actionResponse = null;
3541 actionResponse = createComponentInstance("services", containerComponentId, userId, inputComponentInstance, false);
3542 } catch (ComponentException e) {
3544 // on failure of the create instance unlock the resource and rollback the transaction.
3545 return Either.right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED, FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS));
3547 // on failure of the create instance unlock the resource and rollback the transaction.
3548 if (null == actionResponse) {
3549 log.error(FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS);
3550 unlockComponent(failed, origComponent);
3553 Either<String, ResponseFormat> resultOp = null;
3555 ComponentInstance destComponentInstance = actionResponse;
3556 log.debug("destComponentInstance's data is {}", destComponentInstance);
3557 resultOp = deepCopyComponentInstance(origComponent, containerComponentId, componentInstanceId, destComponentInstance, userId);
3558 resultMap.put("componentInstance", destComponentInstance);
3561 if (resultOp == null || resultOp.isRight()) {
3562 unlockComponent(true, origComponent);
3563 janusGraphDao.rollback();
3564 log.error("Failed to deep copy component instance");
3566 unlockComponent(false, origComponent);
3567 janusGraphDao.commit();
3568 log.debug("Success trasaction commit");
3571 if (resultOp == null || resultOp.isRight()) {
3573 .right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED, "Failed to deep copy the component instance to the canvas"));
3575 return Either.left(resultMap);
3579 private Either<String, ResponseFormat> deepCopyComponentInstance(Component sourceComponent, String containerComponentId,
3580 String sourceComponentInstanceId, ComponentInstance destComponentInstance,
3582 Either<Component, StorageOperationStatus> getDestComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3583 if (getDestComponent.isRight()) {
3584 log.error("Failed to get the dest component information");
3585 return Either.right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED, FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS));
3587 Component destComponent = getDestComponent.left().value();
3588 Either<String, ResponseFormat> copyComponentInstanceWithPropertiesAndInputs = copyComponentInstanceWithPropertiesAndInputs(sourceComponent,
3589 destComponent, sourceComponentInstanceId, destComponentInstance);
3590 if (copyComponentInstanceWithPropertiesAndInputs.isRight()) {
3591 log.error("Failed to copy component instance with properties and inputs as part of deep copy");
3592 return Either.right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED,
3593 "Failed to copy the component instance with properties and inputs as part of deep copy"));
3595 Either<String, ResponseFormat> copyComponentInstanceWithAttributes = copyComponentInstanceWithAttributes(sourceComponent, destComponent,
3596 sourceComponentInstanceId, destComponentInstance, userId);
3597 if (copyComponentInstanceWithAttributes.isRight()) {
3598 log.error("Failed to copy component instance with attributes as part of deep copy");
3599 return Either.right(componentsUtils
3600 .getResponseFormat(ActionStatus.USER_DEFINED, "Failed to copy the component instance with attributes as part of deep copy"));
3602 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3605 private Either<String, ResponseFormat> copyComponentInstanceWithPropertiesAndInputs(Component sourceComponent, Component destComponent,
3606 String sourceComponentInstanceId,
3607 ComponentInstance destComponentInstance) {
3608 log.debug("start to copy ComponentInstance with properties and inputs");
3609 List<ComponentInstanceProperty> sourcePropList = null;
3610 if (sourceComponent.getComponentInstancesProperties() != null
3611 && sourceComponent.getComponentInstancesProperties().get(sourceComponentInstanceId) != null) {
3612 sourcePropList = sourceComponent.getComponentInstancesProperties().get(sourceComponentInstanceId);
3613 log.debug("sourcePropList");
3615 List<ComponentInstanceProperty> destPropList = null;
3616 String destComponentInstanceId = destComponentInstance.getUniqueId();
3617 log.debug("destComponentInstanceId: {}", destComponentInstance.getUniqueId());
3618 if (destComponent.getComponentInstancesProperties() != null
3619 && destComponent.getComponentInstancesProperties().get(destComponentInstanceId) != null) {
3620 destPropList = destComponent.getComponentInstancesProperties().get(destComponentInstanceId);
3621 log.debug("destPropList {}");
3623 List<ComponentInstancePropInput> componentInstancePropInputList = new ArrayList<>();
3624 if (null != destPropList && null != sourcePropList) {
3625 log.debug("start to set property and attribute");
3626 for (ComponentInstanceProperty destProp : destPropList) {
3627 String destPropertyName = destProp.getName();
3628 for (ComponentInstanceProperty sourceProp : sourcePropList) {
3629 if (!destPropertyName.equals(sourceProp.getName())) {
3632 log.debug("now set property");
3633 final List<GetInputValueDataDefinition> getInputValues = sourceProp.getGetInputValues();
3634 if (getInputValues == null && !StringUtils.isEmpty(sourceProp.getValue()) && (destProp.getValue() == null || !destProp.getValue()
3635 .equals(sourceProp.getValue()))) {
3636 log.debug("Now starting to copy the property {} in value {}", destPropertyName, sourceProp.getValue());
3637 destProp.setValue(sourceProp.getValue());
3638 Either<String, ResponseFormat> updatePropertyValueEither = updateComponentInstanceProperty(destComponent.getUniqueId(),
3639 destComponentInstanceId, destProp);
3640 if (updatePropertyValueEither.isRight()) {
3641 log.error("Failed to copy the property {}", destPropertyName);
3642 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM,
3643 "Failed to paste component instance to the canvas, property copy"));
3647 log.debug("Now start to update inputs");
3648 if (getInputValues != null) {
3649 if (getInputValues.isEmpty()) {
3650 log.debug("property is return from input, set by man");
3653 log.debug("Now starting to copy the {} property", destPropertyName);
3654 Either<String, ResponseFormat> getSourceInputDefaultValue = getInputListDefaultValue(sourceComponent,
3655 getInputValues.get(0).getInputId());
3656 if (getSourceInputDefaultValue.isRight()) {
3657 return Either.right(getSourceInputDefaultValue.right().value());
3659 componentInstancePropInputList.add(new ComponentInstancePropInput(destProp));
3664 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3667 private Either<String, ResponseFormat> copyComponentInstanceWithAttributes(Component sourceComponent, Component destComponent,
3668 String sourceComponentInstanceId,
3669 ComponentInstance destComponentInstance, String userId) {
3670 String destComponentInstanceId = destComponentInstance.getUniqueId();
3671 log.info("start to copy component instance with attributes");
3672 List<ComponentInstanceAttribute> sourceAttributeList = null;
3673 if (sourceComponent.getComponentInstancesAttributes() != null
3674 && sourceComponent.getComponentInstancesAttributes().get(sourceComponentInstanceId) != null) {
3675 sourceAttributeList = sourceComponent.getComponentInstancesAttributes().get(sourceComponentInstanceId);
3676 log.info("sourceAttributes {}");
3678 List<ComponentInstanceAttribute> destAttributeList = null;
3679 if (destComponent.getComponentInstancesAttributes() != null
3680 && destComponent.getComponentInstancesAttributes().get(destComponentInstanceId) != null) {
3681 destAttributeList = destComponent.getComponentInstancesAttributes().get(destComponentInstanceId);
3682 log.info("destAttributeList {}");
3684 if (null != sourceAttributeList && null != destAttributeList) {
3685 log.info("set attribute");
3686 for (ComponentInstanceAttribute sourceAttribute : sourceAttributeList) {
3687 String sourceAttributeName = sourceAttribute.getName();
3688 for (ComponentInstanceAttribute destAttribute : destAttributeList) {
3689 if (sourceAttributeName.equals(destAttribute.getName())) {
3690 log.debug("Start to copy the attribute exists {}", sourceAttributeName);
3691 sourceAttribute.setUniqueId(
3692 UniqueIdBuilder.buildResourceInstanceUniuqeId("attribute", destComponentInstanceId.split("\\.")[1], sourceAttributeName));
3693 Either<ComponentInstanceAttribute, ResponseFormat> updateAttributeValueEither = createOrUpdateAttributeValueForCopyPaste(
3694 ComponentTypeEnum.SERVICE, destComponent.getUniqueId(), destComponentInstanceId, sourceAttribute, userId);
3695 if (updateAttributeValueEither.isRight()) {
3696 log.error("Failed to copy the attribute");
3697 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM,
3698 "Failed to paste component instance to the canvas, attribute copy"));
3705 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3708 private Either<ComponentInstanceAttribute, ResponseFormat> createOrUpdateAttributeValueForCopyPaste(ComponentTypeEnum componentTypeEnum,
3709 String componentId, String resourceInstanceId,
3710 ComponentInstanceAttribute attribute,
3712 Either<ComponentInstanceAttribute, ResponseFormat> resultOp = null;
3713 validateUserExists(userId);
3714 if (componentTypeEnum == null) {
3715 BeEcompErrorManager.getInstance()
3716 .logInvalidInputError("createOrUpdateAttributeValueForCopyPaste", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
3717 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
3720 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
3721 if (getResourceResult.isRight()) {
3722 log.info("Failed to retrieve component id {}", componentId);
3723 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3726 Component containerComponent = getResourceResult.left().value();
3727 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
3728 if (resourceInstanceStatus.isRight()) {
3730 .right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, resourceInstanceId, componentId));
3733 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
3734 String propertyType = attribute.getType();
3735 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
3736 log.info("The type of attribute id{},is {} ", attribute.getUniqueId(), propertyType);
3737 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
3738 SchemaDefinition def = attribute.getSchema();
3740 log.info("Schema doesn't exists for attribute of type {}", type);
3742 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
3744 PropertyDataDefinition propDef = def.getProperty();
3745 if (propDef == null) {
3746 log.info("Attribute in Schema Definition inside attribute of type {} doesn't exist", type);
3748 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
3751 List<ComponentInstanceAttribute> instanceAttributes = containerComponent.getComponentInstancesAttributes().get(resourceInstanceId);
3752 Optional<ComponentInstanceAttribute> instanceAttribute = instanceAttributes.stream()
3753 .filter(p -> p.getUniqueId().equals(attribute.getUniqueId())).findAny();
3754 StorageOperationStatus status;
3755 if (instanceAttribute.isPresent()) {
3756 log.info("updateComponentInstanceAttribute");
3757 status = toscaOperationFacade.updateComponentInstanceAttribute(containerComponent, foundResourceInstance.getUniqueId(), attribute);
3759 log.info("addComponentInstanceAttribute");
3760 status = toscaOperationFacade.addComponentInstanceAttribute(containerComponent, foundResourceInstance.getUniqueId(), attribute);
3762 if (status != StorageOperationStatus.OK) {
3763 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
3764 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3767 List<String> path = new ArrayList<>();
3768 path.add(foundResourceInstance.getUniqueId());
3769 attribute.setPath(path);
3770 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
3771 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
3772 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3773 if (updateContainerRes.isRight()) {
3774 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3775 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3778 resultOp = Either.left(attribute);
3782 private Either<String, ResponseFormat> updateComponentInstanceProperty(String containerComponentId, String componentInstanceId,
3783 ComponentInstanceProperty property) {
3784 Either<String, ResponseFormat> resultOp;
3785 Either<Component, StorageOperationStatus> getComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3786 if (getComponent.isRight()) {
3787 log.error("Failed to get the component information");
3788 return Either.right(componentsUtils
3789 .getResponseFormatForResourceInstanceProperty(ActionStatus.INVALID_CONTENT_PARAM, "Failed to get the component information"));
3791 Component containerComponent = getComponent.left().value();
3792 StorageOperationStatus status = toscaOperationFacade.updateComponentInstanceProperty(containerComponent, componentInstanceId, property);
3793 if (status != StorageOperationStatus.OK) {
3794 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
3795 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3798 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade
3799 .updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3800 if (updateContainerRes.isRight()) {
3801 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3802 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3805 return Either.left("Update OK");
3808 private Either<String, ResponseFormat> getInputListDefaultValue(Component component, String inputId) {
3809 List<InputDefinition> inputList = component.getInputs();
3810 for (InputDefinition input : inputList) {
3811 if (input.getUniqueId().equals(inputId)) {
3812 if (input.getDefaultValue() == null) {
3813 log.debug("The input's default value is null");
3814 return Either.left(null);
3816 return Either.left(input.getDefaultValue());
3819 log.error("The input's default value with id {} is not found", inputId);
3820 return Either.right(componentsUtils.getResponseFormat(ActionStatus.USER_DEFINED, "Failed to paste component instance to the canvas"));
3824 * Method to delete selected nodes and edges on composition page
3826 * @param containerComponentType
3827 * @param componentId
3828 * @param componentInstanceIdList
3832 public Map<String, List<String>> batchDeleteComponentInstance(String containerComponentType, String componentId,
3833 List<String> componentInstanceIdList, String userId) {
3834 List<String> deleteErrorIds = new ArrayList<>();
3835 Map<String, List<String>> deleteErrorMap = new HashMap<>();
3836 validateUserExists(userId);
3837 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId,
3838 ComponentTypeEnum.findByParamName(containerComponentType), null);
3839 boolean failed = false;
3841 lockComponent(containerComponent, "batchDeleteComponentInstance");
3842 for (String eachInstanceId : componentInstanceIdList) {
3843 Either<ComponentInstance, ResponseFormat> actionResponse = batchDeleteComponentInstance(containerComponent, containerComponentType,
3845 log.debug("batchDeleteResourceInstances actionResponse is {}", actionResponse);
3846 if (actionResponse.isRight()) {
3847 log.error("Failed to delete ComponentInstance [{}]", eachInstanceId);
3848 deleteErrorIds.add(eachInstanceId);
3851 //sending the ids of the error nodes that were not deleted to UI
3852 deleteErrorMap.put("deleteFailedIds", deleteErrorIds);
3853 return deleteErrorMap;
3854 } catch (ComponentException e) {
3858 unlockComponent(failed, containerComponent);
3862 private Either<ComponentInstance, ResponseFormat> batchDeleteComponentInstance(Component containerComponent, String containerComponentType,
3863 String componentInstanceId) {
3864 ComponentInstance resultOp;
3865 final ComponentTypeEnum containerComponentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
3867 resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentTypeEnum);
3868 log.info("Successfully deleted instance with id {}", componentInstanceId);
3869 return Either.left(resultOp);
3870 } catch (ComponentException e) {
3871 log.error("Failed to deleteComponentInstance with instanceId[{}]", componentInstanceId);
3872 return Either.right(new ResponseFormat());
3876 public void validateUser(final String userId) {
3877 final User user = userValidations.validateUserExists(userId);
3878 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
3881 public void setCompositionBusinessLogic(CompositionBusinessLogic compositionBusinessLogic) {
3882 this.compositionBusinessLogic = compositionBusinessLogic;
3885 public void setContainerInstanceTypesData(ContainerInstanceTypesData containerInstanceTypesData) {
3886 this.containerInstanceTypesData = containerInstanceTypesData;