2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.impl;
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.function.BiConsumer;
42 import java.util.stream.Collectors;
43 import org.apache.commons.collections.CollectionUtils;
44 import org.apache.commons.collections.MapUtils;
45 import org.apache.commons.lang.StringUtils;
46 import org.apache.commons.lang3.tuple.ImmutablePair;
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.instance.ComponentInstanceChangeOperationOrchestrator;
52 import org.openecomp.sdc.be.components.impl.utils.DirectivesUtil;
53 import org.openecomp.sdc.be.components.merge.instance.ComponentInstanceMergeDataBusinessLogic;
54 import org.openecomp.sdc.be.components.merge.instance.DataForMergeHolder;
55 import org.openecomp.sdc.be.components.utils.PropertiesUtils;
56 import org.openecomp.sdc.be.components.validation.ComponentValidations;
57 import org.openecomp.sdc.be.config.BeEcompErrorManager;
58 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
59 import org.openecomp.sdc.be.config.ConfigurationManager;
60 import org.openecomp.sdc.be.dao.api.ActionStatus;
61 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
62 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
63 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
64 import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
65 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
66 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
67 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
68 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
69 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
70 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
71 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
72 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
73 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
74 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
75 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
76 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
77 import org.openecomp.sdc.be.impl.ComponentsUtils;
78 import org.openecomp.sdc.be.impl.ForwardingPathUtils;
79 import org.openecomp.sdc.be.impl.ServiceFilterUtils;
80 import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
81 import org.openecomp.sdc.be.model.ArtifactDefinition;
82 import org.openecomp.sdc.be.model.CapabilityDefinition;
83 import org.openecomp.sdc.be.model.Component;
84 import org.openecomp.sdc.be.model.ComponentInstance;
85 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
86 import org.openecomp.sdc.be.model.ComponentInstanceInput;
87 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
88 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
89 import org.openecomp.sdc.be.model.ComponentParametersView;
90 import org.openecomp.sdc.be.model.DataTypeDefinition;
91 import org.openecomp.sdc.be.model.GroupDefinition;
92 import org.openecomp.sdc.be.model.InputDefinition;
93 import org.openecomp.sdc.be.model.InterfaceDefinition;
94 import org.openecomp.sdc.be.model.LifecycleStateEnum;
95 import org.openecomp.sdc.be.model.PolicyDefinition;
96 import org.openecomp.sdc.be.model.PropertyDefinition;
97 import org.openecomp.sdc.be.model.RelationshipInfo;
98 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
99 import org.openecomp.sdc.be.model.RequirementDefinition;
100 import org.openecomp.sdc.be.model.Resource;
101 import org.openecomp.sdc.be.model.Service;
102 import org.openecomp.sdc.be.model.User;
103 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
104 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
105 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
106 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
107 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
108 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
109 import org.openecomp.sdc.be.model.operations.StorageException;
110 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
111 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
112 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
113 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
114 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
115 import org.openecomp.sdc.be.model.operations.impl.ComponentInstanceOperation;
116 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
117 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
118 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
119 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
120 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
121 import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
122 import org.openecomp.sdc.be.user.Role;
123 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
124 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
125 import org.openecomp.sdc.common.api.Constants;
126 import org.openecomp.sdc.common.datastructure.Wrapper;
127 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
128 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
129 import org.openecomp.sdc.common.log.wrappers.Logger;
130 import org.openecomp.sdc.common.util.ValidationUtils;
131 import org.openecomp.sdc.exception.ResponseFormat;
132 import org.springframework.beans.factory.annotation.Autowired;
134 @org.springframework.stereotype.Component
135 public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
137 private static final Logger log = Logger.getLogger(ComponentInstanceBusinessLogic.class);
138 private static final String VF_MODULE = "org.openecomp.groups.VfModule";
139 private static final String TRY_TO_CREATE_ENTRY_ON_GRAPH = "Try to create entry on graph";
140 private static final String CLOUD_SPECIFIC_FIXED_KEY_WORD = "cloudtech";
141 private static final String[][] CLOUD_SPECIFIC_KEY_WORDS = {{"k8s", "azure", "aws"}, /* cloud specific technology */
142 {"charts", "day0", "configtemplate"} /*cloud specific sub type*/};
143 private static final String FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE = "Failed to create entry on graph for component instance {}";
144 private static final String ENTITY_ON_GRAPH_IS_CREATED = "Entity on graph is created.";
145 private static final String INVALID_COMPONENT_TYPE = "invalid component type";
146 private static final String FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID = "Failed to retrieve component, component id {}";
147 private static final String FAILED_TO_LOCK_SERVICE = "Failed to lock service {}";
148 private static final String CREATE_OR_UPDATE_PROPERTY_VALUE = "CreateOrUpdatePropertyValue";
149 private static final String FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS = "Failed to copy the component instance to the canvas";
150 private static final String COPY_COMPONENT_INSTANCE_OK = "Copy component instance OK";
152 private ComponentInstanceOperation componentInstanceOperation;
153 private ArtifactsBusinessLogic artifactBusinessLogic;
154 private ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
155 private ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
156 private ForwardingPathOperation forwardingPathOperation;
157 private NodeFilterOperation nodeFilterOperation;
160 public ComponentInstanceBusinessLogic(IElementOperation elementDao,
161 IGroupOperation groupOperation,
162 IGroupInstanceOperation groupInstanceOperation,
163 IGroupTypeOperation groupTypeOperation,
164 InterfaceOperation interfaceOperation,
165 InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
166 ComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
167 ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL,
168 ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator,
169 ForwardingPathOperation forwardingPathOperation, NodeFilterOperation nodeFilterOperation,
170 ArtifactsOperations artifactToscaOperation) {
171 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
172 interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
173 this.componentInstanceOperation = componentInstanceOperation;
174 this.artifactBusinessLogic = artifactBusinessLogic;
175 this.compInstMergeDataBL = compInstMergeDataBL;
176 this.onChangeInstanceOperationOrchestrator = onChangeInstanceOperationOrchestrator;
177 this.forwardingPathOperation = forwardingPathOperation;
178 this.nodeFilterOperation = nodeFilterOperation;
182 private CompositionBusinessLogic compositionBusinessLogic;
185 private ContainerInstanceTypesData containerInstanceTypesData;
187 public ComponentInstance createComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance) {
188 return createComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, true);
191 public List<ComponentInstanceProperty> getComponentInstancePropertiesByInputId(org.openecomp.sdc.be.model.Component component, String inputId){
192 List<ComponentInstanceProperty> resList = new ArrayList<>();
193 Map<String, List<ComponentInstanceProperty>> ciPropertiesMap = component.getComponentInstancesProperties();
194 if(ciPropertiesMap != null && !ciPropertiesMap.isEmpty()){
195 ciPropertiesMap.forEach(new BiConsumer<String, List<ComponentInstanceProperty>>() {
197 public void accept(String s, List<ComponentInstanceProperty> ciPropList) {
199 Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci ->ci.getUniqueId().equals(s)).findAny();
201 ciName = ciOp.get().getName();
202 if (ciPropList != null && !ciPropList.isEmpty()) {
203 for(ComponentInstanceProperty prop: ciPropList){
204 List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
205 addCompInstanceProperty(s, ciName, prop, inputsValues, inputId, resList);
215 private void addCompInstanceProperty(String s, String ciName, ComponentInstanceProperty prop, List<GetInputValueDataDefinition> inputsValues, String inputId, List<ComponentInstanceProperty> resList) {
216 if(inputsValues != null && !inputsValues.isEmpty()){
217 for(GetInputValueDataDefinition inputData: inputsValues){
218 if(isGetInputValueForInput(inputData, inputId)){
219 prop.setComponentInstanceId(s);
220 prop.setComponentInstanceName(ciName);
228 public Optional<ComponentInstanceProperty> getComponentInstancePropertyByPolicyId(Component component,
229 PolicyDefinition policy) {
231 Optional<ComponentInstanceProperty> propertyCandidate = getComponentInstancePropertyByPolicy(component, policy);
233 if(propertyCandidate.isPresent()) {
234 ComponentInstanceProperty componentInstanceProperty = propertyCandidate.get();
235 Optional<GetPolicyValueDataDefinition> getPolicyCandidate =
236 getGetPolicyValueDataDefinition(policy, componentInstanceProperty);
238 getPolicyCandidate.ifPresent(getPolicyValue ->
239 updateComponentInstancePropertyAfterUndeclaration(componentInstanceProperty, getPolicyValue, policy));
240 return Optional.of(componentInstanceProperty);
243 return Optional.empty();
247 private void updateComponentInstancePropertyAfterUndeclaration(ComponentInstanceProperty componentInstanceProperty,
248 GetPolicyValueDataDefinition getPolicyValue, PolicyDefinition policyDefinition) {
249 componentInstanceProperty.setValue(getPolicyValue.getOrigPropertyValue());
250 List<GetPolicyValueDataDefinition> getPolicyValues = componentInstanceProperty.getGetPolicyValues();
251 if(CollectionUtils.isNotEmpty(getPolicyValues)) {
252 getPolicyValues.remove(getPolicyValue);
253 componentInstanceProperty.setGetPolicyValues(getPolicyValues);
254 policyDefinition.setGetPolicyValues(getPolicyValues);
258 private Optional<GetPolicyValueDataDefinition> getGetPolicyValueDataDefinition(PolicyDefinition policy,
259 ComponentInstanceProperty componentInstanceProperty) {
260 List<GetPolicyValueDataDefinition> getPolicyValues = policy.getGetPolicyValues();
261 return getPolicyValues.stream()
262 .filter(getPolicyValue -> getPolicyValue
264 .equals(componentInstanceProperty
269 private Optional<ComponentInstanceProperty> getComponentInstancePropertyByPolicy(Component component,
270 PolicyDefinition policy) {
271 Map<String, List<ComponentInstanceProperty>> componentInstancesProperties =
272 component.getComponentInstancesProperties();
274 if(MapUtils.isEmpty(componentInstancesProperties)) {
275 return Optional.empty();
278 String instanceUniqueId = policy.getInstanceUniqueId();
280 List<ComponentInstanceProperty> componentInstanceProperties =
281 componentInstancesProperties.containsKey(instanceUniqueId)
282 ? componentInstancesProperties.get(instanceUniqueId)
285 return componentInstanceProperties
286 .stream().filter(property -> property.getName().equals(policy.getName())).findAny();
289 public List<ComponentInstanceInput> getComponentInstanceInputsByInputId(
290 org.openecomp.sdc.be.model.Component component, String inputId) {
291 List<ComponentInstanceInput> resList = new ArrayList<>();
292 Map<String, List<ComponentInstanceInput>> ciInputsMap = component.getComponentInstancesInputs();
293 if(ciInputsMap != null && !ciInputsMap.isEmpty()){
294 ciInputsMap.forEach(new BiConsumer<String, List<ComponentInstanceInput>>() {
296 public void accept(String s, List<ComponentInstanceInput> ciPropList) {
298 Optional<ComponentInstance> ciOp = component.getComponentInstances().stream().filter(ci ->ci.getUniqueId().equals(s)).findAny();
300 ciName = ciOp.get().getName();
301 if (ciPropList != null && !ciPropList.isEmpty()) {
302 for(ComponentInstanceInput prop: ciPropList){
303 List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
304 addCompInstanceInput(s, ciName, prop, inputsValues, inputId, resList);
315 private void addCompInstanceInput(String s, String ciName, ComponentInstanceInput prop, List<GetInputValueDataDefinition> inputsValues, String inputId, List<ComponentInstanceInput> resList) {
316 if(inputsValues != null && !inputsValues.isEmpty()){
317 for(GetInputValueDataDefinition inputData: inputsValues){
318 if(isGetInputValueForInput(inputData, inputId)){
319 prop.setComponentInstanceId(s);
320 prop.setComponentInstanceName(ciName);
328 public ComponentInstance createComponentInstance(final String containerComponentParam,
329 final String containerComponentId, final String userId,
330 final ComponentInstance resourceInstance, final boolean needLock) {
331 final User user = validateUserExists(userId);
332 validateUserNotEmpty(user, "Create component instance");
333 validateJsonBody(resourceInstance, ComponentInstance.class);
334 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
335 final org.openecomp.sdc.be.model.Component containerComponent =
336 validateComponentExists(containerComponentId, containerComponentType, null);
338 if (ModelConverter.isAtomicComponent(containerComponent)) {
339 if (log.isDebugEnabled()) {
340 log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
342 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
345 validateCanWorkOnComponent(containerComponent, userId);
347 Component origComponent = null;
348 if (resourceInstance != null && containerComponentType != null) {
349 final OriginTypeEnum originType = resourceInstance.getOriginType();
350 validateInstanceName(resourceInstance);
351 if (originType == OriginTypeEnum.ServiceProxy) {
352 origComponent = getOrigComponentForServiceProxy(containerComponent, resourceInstance);
353 } else if (originType == OriginTypeEnum.ServiceSubstitution){
354 origComponent = getOrigComponentForServiceSubstitution(resourceInstance);
356 origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
357 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
359 validateResourceInstanceState(containerComponent, origComponent);
360 overrideFields(origComponent, resourceInstance);
361 compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
363 return createComponent(needLock, containerComponent,origComponent, resourceInstance, user);
367 private Component getOrigComponentForServiceProxy(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance resourceInstance) {
368 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
369 if (isServiceProxyOrigin(serviceProxyOrigin)) {
370 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
372 Component origComponent = serviceProxyOrigin.left().value();
374 StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
375 if (isFillProxyRes(fillProxyRes)) {
376 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
378 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, OriginTypeEnum.ServiceProxy);
379 return origComponent;
382 private Component getOrigComponentForServiceSubstitution(ComponentInstance resourceInstance) {
383 final Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade.getToscaFullElement(resourceInstance.getComponentUid());
384 if (getServiceResult.isRight()) {
385 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
387 final Component service = getServiceResult.left().value();
389 final Either<Component, StorageOperationStatus> getServiceDerivedFromTypeResult = toscaOperationFacade.getLatestByToscaResourceName(service.getDerivedFromGenericType());
390 if (getServiceDerivedFromTypeResult.isRight()) {
391 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
394 Component origComponent = getServiceDerivedFromTypeResult.left().value();
396 final StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
397 if (isFillProxyRes(fillProxyRes)) {
398 throw new ByActionStatusComponentException(
399 componentsUtils.convertFromStorageResponse(fillProxyRes));
401 return origComponent;
404 private ComponentInstance createComponent(boolean needLock, Component containerComponent, Component origComponent, ComponentInstance resourceInstance, User user) {
406 boolean failed = false;
409 ComponentInstance lockComponent = isNeedLock(needLock, containerComponent);
410 if (lockComponent != null) {
411 return lockComponent;
413 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
414 return createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
415 }catch (ComponentException e){
420 unlockComponent(failed, containerComponent);
425 * Try using either to make a judgment
426 * @param containerComponentParam
427 * @param containerComponentId
429 * @param resourceInstance
433 public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance) {
434 log.debug("enter createRealComponentInstance");
435 return createRealComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, false, true);
438 * Try using either to make a judgment
440 * @param inTransaction
442 * @param containerComponentParam
443 * @param containerComponentId
445 * @param resourceInstance
448 public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance, boolean inTransaction, boolean needLock) {
450 log.debug("enter createRealComponentInstance");
451 Component origComponent = null;
453 org.openecomp.sdc.be.model.Component containerComponent = null;
454 ComponentTypeEnum containerComponentType;
456 user = validateUserExists(userId);
457 validateUserNotEmpty(user, "Create component instance");
458 validateJsonBody(resourceInstance, ComponentInstance.class);
459 containerComponentType = validateComponentType(containerComponentParam);
460 containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
462 log.debug("enter createRealComponentInstance,validate user json success");
463 if (ModelConverter.isAtomicComponent(containerComponent)) {
464 log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
465 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
468 validateCanWorkOnComponent(containerComponent, userId);
469 log.debug("enter createRealComponentInstance,validateCanWorkOnComponent success");
471 if (resourceInstance != null && containerComponentType != null) {
472 log.debug("enter createRealComponentInstance,start create ComponentInstance");
473 OriginTypeEnum originType = resourceInstance.getOriginType();
474 validateInstanceName(resourceInstance);
475 if (originType == OriginTypeEnum.ServiceProxy) {
477 log.debug("enter createRealComponentInstance,originType equals ServiceProxy");
478 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
479 if (isServiceProxyOrigin(serviceProxyOrigin)) {
480 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
482 origComponent = serviceProxyOrigin.left().value();
484 StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
485 if (isFillProxyRes(fillProxyRes)) {
486 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
489 log.debug("enter createRealComponentInstance,originType is not ServiceProxy");
490 origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
492 validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
493 validateResourceInstanceState(containerComponent, origComponent);
494 overrideFields(origComponent, resourceInstance);
495 compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
496 log.debug("enter createRealComponentInstance,final validate success");
498 return createRealComponent(needLock, containerComponent, origComponent, resourceInstance, user);
500 } catch (ComponentException e) {
501 log.debug("create Real Component Instance failed");
506 private Either<ComponentInstance, ResponseFormat> createRealComponent(boolean needLock, Component containerComponent, Component origComponent, ComponentInstance resourceInstance, User user) {
508 log.debug("enter createRealComponent");
509 boolean failed = false;
512 ComponentInstance lockComponent = isNeedLock(needLock, containerComponent);
513 if (lockComponent != null) {
514 return Either.left(lockComponent);
516 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
517 return createRealComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
518 } catch (ComponentException e) {
523 unlockComponent(failed, containerComponent);
527 private Either<ComponentInstance, ResponseFormat> createRealComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent, ComponentInstance componentInstance, User user) {
528 Either<ComponentInstance, ResponseFormat> resultOp;
529 log.debug("enter createRealComponentInstanceOnGraph");
531 Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade.addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
533 if (result.isRight()) {
534 log.debug("enter createRealComponentInstanceOnGraph,result is right");
535 ActionStatus status = componentsUtils.convertFromStorageResponse(result.right().value());
536 log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
537 return Either.right(componentsUtils.getResponseFormat(status));
540 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
541 log.debug("enter createRealComponentInstanceOnGraph,Entity on graph is created.");
542 Component updatedComponent = result.left().value().getLeft();
543 Map<String, String> existingEnvVersions = new HashMap<>();
544 // TODO existingEnvVersions ??
545 addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
547 Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
548 if (!updatedInstanceOptional.isPresent()) {
549 log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
550 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
552 log.debug("enter createRealComponentInstanceOnGraph,and final success");
553 return Either.left(updatedInstanceOptional.get());
556 private void overrideFields(Component origComponent, ComponentInstance resourceInstance) {
557 resourceInstance.setComponentVersion(origComponent.getVersion());
558 resourceInstance.setIcon(origComponent.getIcon());
561 private void validateInstanceName(ComponentInstance resourceInstance) {
563 String resourceInstanceName = resourceInstance.getName();
564 if (StringUtils.isEmpty(resourceInstanceName)) {
565 log.debug("ComponentInstance name is empty");
566 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
569 if (!ValidationUtils.validateComponentNameLength(resourceInstanceName)) {
570 log.debug("ComponentInstance name exceeds max length {} ", ValidationUtils.COMPONENT_NAME_MAX_LENGTH);
571 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
574 if (!ValidationUtils.validateComponentNamePattern(resourceInstanceName)) {
575 log.debug("ComponentInstance name {} has invalid format", resourceInstanceName);
576 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
580 private void validateResourceInstanceState(Component containerComponent, Component origComponent) {
581 if (origComponent.getLifecycleState() == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT){
582 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
583 containerComponent.getComponentType().getValue(), origComponent.getLifecycleState().toString());
587 private void validateOriginAndResourceInstanceTypes(final Component containerComponent,
588 final Component origComponent,
589 final OriginTypeEnum originType) {
590 final ResourceTypeEnum resourceType = getResourceTypeEnumFromOriginComponent(origComponent);
591 validateOriginType(originType, resourceType);
592 validateOriginComponentIsValidForContainer(containerComponent, resourceType);
595 private void validateOriginComponentIsValidForContainer(Component containerComponent, ResourceTypeEnum resourceType) {
596 switch (containerComponent.getComponentType()) {
598 if (!containerInstanceTypesData.isAllowedForServiceComponent(resourceType)) {
599 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
600 containerComponent.getComponentType().toString(), resourceType.name());
604 final ResourceTypeEnum componentResourceType = ((Resource) containerComponent).getResourceType();
605 if (!containerInstanceTypesData.isAllowedForResourceComponent(componentResourceType, resourceType)) {
606 throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
607 containerComponent.getComponentType().toString(), resourceType.name());
611 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
615 private void validateOriginType(OriginTypeEnum originType, ResourceTypeEnum resourceType) {
616 ResourceTypeEnum convertedOriginType;
618 convertedOriginType = ResourceTypeEnum.getTypeIgnoreCase(originType.name());
621 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
624 if (resourceType != convertedOriginType) throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
627 private ResourceTypeEnum getResourceTypeEnumFromOriginComponent(final Component origComponent) {
628 switch (origComponent.getComponentType()) {
630 return ResourceTypeEnum.ServiceProxy;
632 return ((Resource) origComponent).getResourceType();
634 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
638 private ComponentInstance isNeedLock(boolean needLock, Component containerComponent) {
640 lockComponent(containerComponent, "createComponentInstance");
645 private boolean isServiceProxyOrigin(Either<Component, StorageOperationStatus> serviceProxyOrigin) {
646 if (serviceProxyOrigin.isRight()) {
647 log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
653 private StorageOperationStatus fillInstanceData(ComponentInstance resourceInstance, Component origComponent) {
654 final ComponentParametersView filter = new ComponentParametersView(true);
655 filter.setIgnoreCapabilities(false);
656 filter.setIgnoreCapabiltyProperties(false);
657 filter.setIgnoreComponentInstances(false);
658 filter.setIgnoreRequirements(false);
659 filter.setIgnoreInterfaces(false);
660 filter.setIgnoreProperties(false);
661 filter.setIgnoreInputs(false);
662 Either<Component, StorageOperationStatus> serviceRes =
663 toscaOperationFacade.getToscaElement(resourceInstance.getComponentUid(), filter);
664 if (serviceRes.isRight()) {
665 return serviceRes.right().value();
667 final Component service = serviceRes.left().value();
668 final Map<String, List<CapabilityDefinition>> capabilities = service.getCapabilities();
669 resourceInstance.setCapabilities(capabilities);
670 final Map<String, List<RequirementDefinition>> req = service.getRequirements();
671 resourceInstance.setRequirements(req);
672 final Map<String, InterfaceDefinition> serviceInterfaces = service.getInterfaces();
673 if(MapUtils.isNotEmpty(serviceInterfaces)) {
674 serviceInterfaces.forEach(resourceInstance::addInterface);
676 resourceInstance.setProperties(PropertiesUtils.getProperties(service));
678 final List<InputDefinition> serviceInputs = service.getInputs();
679 resourceInstance.setInputs(serviceInputs);
680 resourceInstance.setSourceModelInvariant(service.getInvariantUUID());
681 resourceInstance.setSourceModelName(service.getName());
682 resourceInstance.setSourceModelUuid(service.getUUID());
683 resourceInstance.setSourceModelUid(service.getUniqueId());
684 resourceInstance.setComponentUid(origComponent.getUniqueId());
685 resourceInstance.setComponentVersion(service.getVersion());
687 switch(resourceInstance.getOriginType()) {
689 return fillProxyInstanceData(resourceInstance, origComponent, service);
690 case ServiceSubstitution:
691 return fillServiceSubstitutableNodeTypeData(resourceInstance, service);
693 return StorageOperationStatus.OK;
697 private StorageOperationStatus fillProxyInstanceData(final ComponentInstance resourceInstance, final Component origComponent, final Component service) {
698 final String name = ValidationUtils.normalizeComponentInstanceName(service.getName()) + ToscaOperationFacade.PROXY_SUFFIX;
699 final String toscaResourceName = ((Resource) origComponent).getToscaResourceName();
700 final int lastIndexOf = toscaResourceName.lastIndexOf('.');
701 if (lastIndexOf != -1) {
702 final String proxyToscaName = toscaResourceName.substring(0, lastIndexOf + 1) + name;
703 resourceInstance.setToscaComponentName(proxyToscaName);
705 resourceInstance.setName(name);
706 resourceInstance.setIsProxy(true);
707 resourceInstance.setDescription("A Proxy for Service " + service.getName());
708 return StorageOperationStatus.OK;
711 private StorageOperationStatus fillServiceSubstitutableNodeTypeData(final ComponentInstance resourceInstance, final Component service) {
712 resourceInstance.setToscaComponentName("org.openecomp.service." + ValidationUtils.convertToSystemName(service.getName()));
713 resourceInstance.setName(ValidationUtils.normalizeComponentInstanceName(service.getName()));
714 resourceInstance.setIsProxy(false);
715 resourceInstance.setDescription("A substitutable node type for service " + service.getName());
717 return StorageOperationStatus.OK;
720 public Either<CreateAndAssotiateInfo, ResponseFormat> createAndAssociateRIToRI(String containerComponentParam, String containerComponentId, String userId, CreateAndAssotiateInfo createAndAssotiateInfo) {
722 Either<CreateAndAssotiateInfo, ResponseFormat> resultOp = null;
723 ComponentInstance resourceInstance = createAndAssotiateInfo.getNode();
724 RequirementCapabilityRelDef associationInfo = createAndAssotiateInfo.getAssociate();
726 User user = validateUserExists(userId);
728 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
730 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
732 if (ModelConverter.isAtomicComponent(containerComponent)) {
733 log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
734 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType()));
737 validateCanWorkOnComponent(containerComponent, userId);
739 boolean failed = false;
741 lockComponent(containerComponent, "createAndAssociateRIToRI");
742 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
743 Component origComponent = getOriginComponentFromComponentInstance(resourceInstance);
745 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
746 ComponentInstance resResourceInfo = createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
747 if (associationInfo.getFromNode() == null || associationInfo.getFromNode().isEmpty()) {
748 associationInfo.setFromNode(resResourceInfo.getUniqueId());
750 associationInfo.setToNode(resResourceInfo.getUniqueId());
753 Either<RequirementCapabilityRelDef, StorageOperationStatus> resultReqCapDef = toscaOperationFacade.associateResourceInstances(containerComponent, containerComponentId, associationInfo);
754 if (resultReqCapDef.isLeft()) {
755 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
756 RequirementCapabilityRelDef resReqCapabilityRelDef = resultReqCapDef.left().value();
757 CreateAndAssotiateInfo resInfo = new CreateAndAssotiateInfo(resResourceInfo, resReqCapabilityRelDef);
758 resultOp = Either.left(resInfo);
762 log.info("Failed to associate node {} with node {}", associationInfo.getFromNode(), associationInfo.getToNode());
763 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(resultReqCapDef.right().value(), true), "", null));
767 }catch (ComponentException e){
771 unlockComponent(failed, containerComponent);
775 private Component getOriginComponentFromComponentInstance(ComponentInstance componentInstance) {
776 return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getComponentUid());
779 private Component getInstanceOriginNode(ComponentInstance componentInstance) {
780 return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getActualComponentUid());
783 private Component getOriginComponentFromComponentInstance(String componentInstanceName, String origComponetId) {
784 Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaFullElement(origComponetId);
785 if (eitherComponent.isRight()) {
786 log.debug("Failed to get origin component with id {} for component instance {} ", origComponetId, componentInstanceName);
787 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(eitherComponent.right().value(), ComponentTypeEnum.RESOURCE), "", null);
789 return eitherComponent.left().value();
792 private ComponentInstance createComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent, ComponentInstance componentInstance, User user) {
793 Either<ComponentInstance, ResponseFormat> resultOp;
795 Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade.addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
797 if (result.isRight()) {
798 log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
799 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), "", null));
802 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
803 Component updatedComponent = result.left().value().getLeft();
804 Map<String, String> existingEnvVersions = new HashMap<>();
805 // TODO existingEnvVersions ??
806 addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
808 Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
809 if (!updatedInstanceOptional.isPresent()) {
810 log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
811 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
813 return updatedInstanceOptional.get();
816 public boolean isCloudSpecificArtifact(String artifact) {
817 if (artifact.contains(CLOUD_SPECIFIC_FIXED_KEY_WORD)) {
818 for (int i = 0; i < CLOUD_SPECIFIC_KEY_WORDS.length; i++) {
819 if (Arrays.stream(CLOUD_SPECIFIC_KEY_WORDS[i]).noneMatch(str -> artifact.contains(str))) {
831 * addResourceInstanceArtifacts - add artifacts (HEAT_ENV) to resource instance The instance artifacts are generated from the resource's artifacts
832 * @param containerComponent
833 * @param componentInstance
834 * @param originComponent
836 * @param existingEnvVersions
839 protected ActionStatus addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance, org.openecomp.sdc.be.model.Component originComponent, User user, Map<String, String> existingEnvVersions) {
841 log.debug("add artifacts to resource instance");
842 List<GroupDefinition> filteredGroups = new ArrayList<>();
843 ActionStatus status = setResourceArtifactsOnResourceInstance(componentInstance);
844 if (ActionStatus.OK != status) {
845 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(status, "", null));
847 StorageOperationStatus artStatus;
848 // generate heat_env if necessary
849 Map<String, ArtifactDefinition> componentDeploymentArtifacts = componentInstance.getDeploymentArtifacts();
850 if (MapUtils.isNotEmpty(componentDeploymentArtifacts)) {
852 Map<String, ArtifactDefinition> finalDeploymentArtifacts = new HashMap<>();
853 Map<String, List<ArtifactDefinition>> groupInstancesArtifacts = new HashMap<>();
854 Integer defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration()
855 .getHeatArtifactDeploymentTimeout().getDefaultMinutes();
856 List<ArtifactDefinition> listOfCloudSpecificArts = new ArrayList<>();
857 for (ArtifactDefinition artifact : componentDeploymentArtifacts.values()) {
858 String type = artifact.getArtifactType();
859 if (!type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())) {
860 finalDeploymentArtifacts.put(artifact.getArtifactLabel(), artifact);
862 if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HELM.getType())|| type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT.getType())) {
863 artifact.setTimeout(defaultHeatTimeout);
867 if (artifact.checkEsIdExist()) {
868 ArtifactDefinition artifactDefinition = artifactBusinessLogic.createHeatEnvPlaceHolder(new ArrayList<>(),
869 artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(),
870 NodeTypeEnum.ResourceInstance, componentInstance.getName(), user, containerComponent,
871 existingEnvVersions);
873 finalDeploymentArtifacts.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
875 if (CollectionUtils.isNotEmpty(originComponent.getGroups())) {
876 filteredGroups = originComponent.getGroups().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
878 if (isCloudSpecificArtifact(artifactDefinition.getArtifactName())) {
879 listOfCloudSpecificArts.add(artifact);
881 if (CollectionUtils.isNotEmpty(filteredGroups)) {
882 filteredGroups.stream().filter(g ->
885 .anyMatch(p -> p.equals(artifactDefinition.getGeneratedFromId())))
887 .ifPresent(g -> fillInstanceArtifactMap(groupInstancesArtifacts, artifactDefinition, g));
891 groupInstancesArtifacts.forEach((k,v) -> v.addAll(listOfCloudSpecificArts));
892 filteredGroups.forEach(g -> listOfCloudSpecificArts.forEach((e) -> {
893 g.getArtifactsUuid().add(e.getArtifactUUID());
894 g.getArtifacts().add(e.getUniqueId());
896 artStatus = toscaOperationFacade.addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, finalDeploymentArtifacts);
897 if (artStatus != StorageOperationStatus.OK) {
898 log.debug("Failed to add instance deployment artifacts for instance {} in conatiner {} error {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
899 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
902 StorageOperationStatus result = toscaOperationFacade.addGroupInstancesToComponentInstance(containerComponent, componentInstance, filteredGroups, groupInstancesArtifacts);
903 if (result != StorageOperationStatus.OK) {
904 log.debug("failed to update group instance for component instance {}", componentInstance.getUniqueId());
905 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
907 componentInstance.setDeploymentArtifacts(finalDeploymentArtifacts);
910 artStatus = toscaOperationFacade.addInformationalArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, originComponent.getArtifacts());
911 if (artStatus != StorageOperationStatus.OK) {
912 log.debug("Failed to add informational artifacts to the instance {} belonging to the conatiner {}. Status is {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
913 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
916 componentInstance.setArtifacts(originComponent.getArtifacts());
917 return ActionStatus.OK;
920 private void fillInstanceArtifactMap(Map<String, List<ArtifactDefinition>> groupInstancesArtifacts, ArtifactDefinition artifactDefinition, GroupDefinition groupInstance) {
921 List<ArtifactDefinition> artifactsUid;
922 if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
923 artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
925 artifactsUid = new ArrayList<>();
927 artifactsUid.add(artifactDefinition);
928 groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
931 private ActionStatus setResourceArtifactsOnResourceInstance(ComponentInstance resourceInstance) {
932 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getResourceDeploymentArtifacts =
933 artifactBusinessLogic.getArtifacts(resourceInstance.getComponentUid(), NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null);
935 Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
936 if (getResourceDeploymentArtifacts.isRight()) {
937 StorageOperationStatus status = getResourceDeploymentArtifacts.right().value();
938 if (status != StorageOperationStatus.NOT_FOUND) {
939 log.debug("Failed to fetch resource: {} artifacts. status is {}", resourceInstance.getComponentUid(), status);
940 return componentsUtils.convertFromStorageResponseForResourceInstance(status, true);
943 deploymentArtifacts = getResourceDeploymentArtifacts.left().value();
946 if (!deploymentArtifacts.isEmpty()) {
947 Map<String, ArtifactDefinition> tempDeploymentArtifacts = new HashMap<>(deploymentArtifacts);
948 for (Entry<String, ArtifactDefinition> artifact : deploymentArtifacts.entrySet()) {
949 if (!artifact.getValue().checkEsIdExist()) {
950 tempDeploymentArtifacts.remove(artifact.getKey());
954 resourceInstance.setDeploymentArtifacts(tempDeploymentArtifacts);
957 return ActionStatus.OK;
960 public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance componentInstance) {
961 return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, false, true);
964 public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(
965 final String containerComponentParam,
966 final String containerComponentId,
967 final String componentInstanceId,
969 ComponentInstance componentInstance,
970 final boolean inTransaction,
973 validateUserExists(userId);
975 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
977 final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
979 validateCanWorkOnComponent(containerComponent, userId);
980 ComponentTypeEnum instanceType = getComponentType(containerComponentType);
981 Either<Boolean, StorageOperationStatus> validateParentStatus = toscaOperationFacade.validateComponentExists(componentInstance.getComponentUid());
982 if (validateParentStatus.isRight()) {
983 log.debug("Failed to get component instance {} on service {}", componentInstanceId, containerComponentId);
984 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND, componentInstance.getName(), instanceType.getValue().toLowerCase());
986 if (!validateParentStatus.left().value()) {
987 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(), instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(), containerComponentId);
991 lockComponent(containerComponent, "updateComponentInstance");
993 Component origComponent;
994 boolean failed = false;
996 origComponent = getOriginComponentFromComponentInstance(componentInstance);
997 componentInstance = updateComponentInstanceMetadata(containerComponent, containerComponentType, origComponent, componentInstanceId, componentInstance);
998 }catch (ComponentException e) {
1003 unlockComponent(failed, containerComponent);
1006 return Either.left(componentInstance);
1009 // New Multiple Instance Update API
1010 public List<ComponentInstance> updateComponentInstance(String containerComponentParam, Component containerComponent, String containerComponentId, String userId, List<ComponentInstance> componentInstanceList, boolean needLock) {
1012 boolean failed = false;
1014 validateUserExists(userId);
1016 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1017 ComponentParametersView componentFilter = new ComponentParametersView();
1018 componentFilter.disableAll();
1019 componentFilter.setIgnoreUsers(false);
1020 componentFilter.setIgnoreComponentInstances(false);
1021 if (containerComponent == null) {
1022 containerComponent = validateComponentExistsByFilter(containerComponentId, containerComponentType, componentFilter);
1024 validateCanWorkOnComponent(containerComponent, userId);
1026 ComponentTypeEnum instanceType = getComponentType(containerComponentType);
1028 for (ComponentInstance componentInstance : componentInstanceList) {
1029 boolean validateParent = validateParent(containerComponent, componentInstance.getUniqueId());
1030 if (!validateParent) {
1031 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(),
1032 instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(),
1033 containerComponentId);
1038 lockComponent(containerComponent, "updateComponentInstance");
1041 List<ComponentInstance> updatedList = new ArrayList<>();
1042 List<ComponentInstance> instancesFromContainerComponent = containerComponent.getComponentInstances();
1043 List<ComponentInstance> listForUpdate = new ArrayList<>();
1044 if (instancesFromContainerComponent == null || instancesFromContainerComponent.isEmpty())
1045 containerComponent.setComponentInstances(componentInstanceList);
1047 Iterator<ComponentInstance> iterator = instancesFromContainerComponent.iterator();
1048 while (iterator.hasNext()) {
1049 ComponentInstance origInst = iterator.next();
1050 Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getUniqueId().equals(origInst.getUniqueId())).findAny();
1051 if (op.isPresent()) {
1052 ComponentInstance updatedCi = op.get();
1053 updatedCi = buildComponentInstance(updatedCi, origInst);
1055 Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, origInst, updatedCi.getName());
1056 if (!isUniqueName) {
1057 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ", origInst.getName(), updatedCi.getName());
1058 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), origInst.getName()));
1060 listForUpdate.add(updatedCi);
1062 listForUpdate.add(origInst);
1064 containerComponent.setComponentInstances(listForUpdate);
1066 Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, componentFilter);
1067 if (updateStatus.isRight()) {
1068 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata belonging to container component {}. Status is {}. ", containerComponent.getName(), updateStatus.right().value());
1069 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateStatus.right().value(), true), "", null));
1072 for (ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()) {
1073 Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getName().equals(updatedInstance.getName())).findAny();
1074 if (op.isPresent()) {
1075 updatedList.add(updatedInstance);
1080 }catch (ComponentException e){
1085 unlockComponent(failed, containerComponent);
1090 private boolean validateParent(org.openecomp.sdc.be.model.Component containerComponent, String nodeTemplateId) {
1091 return containerComponent.getComponentInstances().stream().anyMatch(p -> p.getUniqueId().equals(nodeTemplateId));
1094 private ComponentTypeEnum getComponentType(ComponentTypeEnum containerComponentType) {
1095 if (ComponentTypeEnum.PRODUCT == containerComponentType) {
1096 return ComponentTypeEnum.SERVICE_INSTANCE;
1098 return ComponentTypeEnum.RESOURCE_INSTANCE;
1102 private ComponentInstance updateComponentInstanceMetadata(Component containerComponent, ComponentTypeEnum containerComponentType, org.openecomp.sdc.be.model.Component origComponent, String componentInstanceId,
1103 ComponentInstance componentInstance) {
1105 Optional<ComponentInstance> componentInstanceOptional;
1106 Either<ImmutablePair<Component, String>, StorageOperationStatus> updateRes = null;
1107 ComponentInstance oldComponentInstance = null;
1108 boolean isNameChanged = false;
1110 componentInstanceOptional = containerComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstance.getUniqueId())).findFirst();
1111 if (!componentInstanceOptional.isPresent()) {
1112 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find the component instance {} in container component {}. ", componentInstance.getName(), containerComponent.getName());
1113 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
1115 String oldComponentName;
1116 oldComponentInstance = componentInstanceOptional.get();
1117 oldComponentName = oldComponentInstance.getName();
1118 String newInstanceName = componentInstance.getName();
1119 if (oldComponentName != null && !oldComponentInstance.getName().equals(newInstanceName))
1120 isNameChanged = true;
1121 Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, oldComponentInstance, newInstanceName);
1122 if (!isUniqueName) {
1123 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ", oldComponentInstance.getName(), newInstanceName);
1124 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), componentInstance.getName());
1126 if(!DirectivesUtil.isValid(componentInstance.getDirectives())) {
1127 final String directivesStr =
1128 componentInstance.getDirectives().stream().collect(Collectors.joining(" , ", " [ ", " ] "));
1129 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
1130 "Failed to update the directives of the component instance {} to {}. Directives data {} is invalid. ",
1131 oldComponentInstance.getName(), newInstanceName ,
1133 throw new ByActionStatusComponentException(ActionStatus.DIRECTIVES_INVALID_VALUE, containerComponentType.getValue(), componentInstance.getName());
1135 updateRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, origComponent, updateComponentInstanceMetadata(oldComponentInstance, componentInstance));
1136 if (updateRes.isRight()) {
1137 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata of component instance {} belonging to container component {}. Status is {}. ", componentInstance.getName(), containerComponent.getName(),
1138 updateRes.right().value());
1139 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateRes.right().value(), true), "", null));
1141 // region - Update instance Groups
1142 if (isNameChanged) {
1143 Either<StorageOperationStatus, StorageOperationStatus> result =
1144 toscaOperationFacade.cleanAndAddGroupInstancesToComponentInstance(containerComponent, oldComponentInstance, componentInstanceId);
1145 if (result.isRight())
1146 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId, result.right().value());
1148 if (containerComponent instanceof Service){
1149 Either<ComponentInstance, ResponseFormat> renameEither =
1150 renameServiceFilter((Service) containerComponent, newInstanceName,
1151 oldComponentInstance.getName());
1152 if (renameEither.isRight()) {
1153 throw new ByResponseFormatComponentException(renameEither.right().value());
1156 updateForwardingPathDefinition(containerComponent, componentInstance, oldComponentName);
1161 String newInstanceId = updateRes.left().value().getRight();
1162 Optional<ComponentInstance> updatedInstanceOptional = updateRes.left().value().getLeft().getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(newInstanceId)).findFirst();
1164 if (!updatedInstanceOptional.isPresent()) {
1165 log.debug("Failed to update metadata of component instance {} of container component {}", componentInstance.getName(), containerComponent.getName());
1166 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
1169 return componentInstanceOptional.get();
1172 private void updateForwardingPathDefinition(Component containerComponent, ComponentInstance componentInstance, String oldComponentName) {
1173 Collection<ForwardingPathDataDefinition> forwardingPathDataDefinitions = getForwardingPathDataDefinitions(containerComponent.getUniqueId());
1174 Set<ForwardingPathDataDefinition> updated = new ForwardingPathUtils()
1175 .updateComponentInstanceName(forwardingPathDataDefinitions, oldComponentName,
1176 componentInstance.getName());
1177 updated.forEach(fp -> {
1178 Either<ForwardingPathDataDefinition, StorageOperationStatus> resultEither = forwardingPathOperation
1179 .updateForwardingPath(containerComponent.getUniqueId(), fp);
1180 if (resultEither.isRight()){
1181 CommonUtility.addRecordToLog(log, LogLevelEnum.ERROR, "Failed to rename forwarding path for container {}. error {} ",containerComponent.getName(), resultEither.right().value());
1187 public Either<ComponentInstance, ResponseFormat> renameServiceFilter(final Service containerComponent,
1188 final String newInstanceName,
1189 final String oldInstanceName) {
1191 Map<String, CINodeFilterDataDefinition> renamedNodesFilter =
1192 ServiceFilterUtils.getRenamedNodesFilter((Service) containerComponent,
1193 oldInstanceName, newInstanceName);
1194 for( Entry<String, CINodeFilterDataDefinition> entry : renamedNodesFilter.entrySet()){
1195 Either<CINodeFilterDataDefinition, StorageOperationStatus>
1196 renameEither = nodeFilterOperation.updateNodeFilter(
1197 containerComponent.getUniqueId(),entry.getKey(),entry.getValue());
1198 if (renameEither.isRight()){
1199 return Either.right(componentsUtils.getResponseFormatForResourceInstance(
1200 componentsUtils.convertFromStorageResponse(renameEither.right().value(), ComponentTypeEnum.SERVICE),
1201 containerComponent.getName(), null));
1205 return Either.left(null);
1210 * The normalized old vf name
1211 * @param newNormailzedPrefix-
1212 * The normalized new vf name
1213 * @param qualifiedGroupInstanceName-
1214 * old Group Instance Name
1216 // modify group names
1217 private String getNewGroupName(String oldPrefix, String newNormailzedPrefix, String qualifiedGroupInstanceName) {
1218 if (qualifiedGroupInstanceName == null) {
1219 log.info("CANNOT change group name ");
1222 if (qualifiedGroupInstanceName.startsWith(oldPrefix) || qualifiedGroupInstanceName.startsWith(ValidationUtils.normalizeComponentInstanceName(oldPrefix)))
1223 return qualifiedGroupInstanceName.replaceFirst(oldPrefix, newNormailzedPrefix);
1224 return qualifiedGroupInstanceName;
1227 private ComponentInstance updateComponentInstanceMetadata(ComponentInstance oldComponentInstance, ComponentInstance newComponentInstance) {
1228 oldComponentInstance.setName(newComponentInstance.getName());
1229 oldComponentInstance.setModificationTime(System.currentTimeMillis());
1230 oldComponentInstance.setCustomizationUUID(UUID.randomUUID().toString());
1231 oldComponentInstance.setDirectives(newComponentInstance.getDirectives());
1232 if (oldComponentInstance.getGroupInstances() != null)
1233 oldComponentInstance.getGroupInstances().forEach(group -> group.setName(getNewGroupName(oldComponentInstance.getNormalizedName(), ValidationUtils.normalizeComponentInstanceName(newComponentInstance.getName()), group.getName())));
1234 return oldComponentInstance;
1237 public ComponentInstance deleteComponentInstance(final String containerComponentParam,
1238 final String containerComponentId,
1239 final String componentInstanceId, String userId)
1240 throws BusinessLogicException {
1242 validateUserExists(userId);
1243 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1245 final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
1246 validateCanWorkOnComponent(containerComponent, userId);
1248 boolean failed = false;
1249 final Optional<ComponentInstance> componentInstanceOptional = containerComponent.getComponentInstanceById(componentInstanceId);
1250 if (!componentInstanceOptional.isPresent()) {
1251 throw new BusinessLogicException(componentsUtils
1252 .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND));
1254 ComponentInstance componentInstance = componentInstanceOptional.get();
1257 if (containerComponent instanceof Service || containerComponent instanceof Resource) {
1258 final Either<String, StorageOperationStatus> deleteServiceFilterEither =
1259 nodeFilterOperation.deleteNodeFilter(containerComponent, componentInstanceId);
1260 if (deleteServiceFilterEither.isRight()) {
1261 final ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
1262 containerComponentType);
1263 janusGraphDao.rollback();
1264 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(status, componentInstanceId));
1266 final Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance(
1267 containerComponent, componentInstance, containerComponentType, userId);
1268 if (resultOp.isRight()) {
1269 janusGraphDao.rollback();
1270 throw new ByResponseFormatComponentException(resultOp.right().value());
1273 lockComponent(containerComponent, "deleteComponentInstance");
1274 final ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
1276 componentInstance = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
1277 containerComponentType, deletedCompInstance);
1278 final ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
1279 if (ActionStatus.OK != onDeleteOperationsStatus) {
1280 throw new ByActionStatusComponentException(onDeleteOperationsStatus);
1282 } catch (final ComponentException e) {
1287 unlockComponent(failed, containerComponent);
1289 return componentInstance;
1293 * Try to modify the delete and return two cases
1295 * @param containerComponentParam
1296 * @param containerComponentId
1297 * @param componentInstanceId
1301 public Either<ComponentInstance, ResponseFormat> deleteAbstractComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
1302 log.debug("enter deleteAbstractComponentInstance");
1303 validateUserExists(userId);
1305 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
1307 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
1308 validateCanWorkOnComponent(containerComponent, userId);
1310 boolean failed = false;
1311 ComponentInstance deletedRelatedInst;
1313 if (containerComponent instanceof Service) {
1314 ComponentInstance componentInstance = containerComponent.getComponentInstanceById(componentInstanceId).get();
1315 Either<String, StorageOperationStatus> deleteServiceFilterEither =
1316 nodeFilterOperation.deleteNodeFilter((Service) containerComponent, componentInstanceId);
1317 if (deleteServiceFilterEither.isRight()) {
1318 log.debug("enter deleteAbstractComponentInstance:deleteServiceFilterEither is right, filed");
1319 ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
1320 containerComponentType);
1321 janusGraphDao.rollback();
1322 return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
1324 Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance((Service) containerComponent,
1325 componentInstance, ComponentTypeEnum.SERVICE, userId);
1326 if (resultOp.isRight()) {
1327 log.debug("enter deleteAbstractComponentInstance:resultOp is right, filed");
1328 janusGraphDao.rollback();
1332 log.debug("enter deleteAbstractComponentInstance:");
1333 lockComponent(containerComponent, "deleteComponentInstance");
1334 ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
1336 deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
1337 containerComponentType, deletedCompInstance);
1338 ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
1339 log.debug("enter deleteAbstractComponentInstance,get onDeleteOperationsStatus:{}",onDeleteOperationsStatus);
1340 if (ActionStatus.OK != onDeleteOperationsStatus) {
1341 throw new ByActionStatusComponentException(onDeleteOperationsStatus);
1343 } catch (ComponentException e) {
1347 unlockComponent(failed, containerComponent);
1349 log.debug("enter deleteAbstractComponentInstance,deleted RelatedInst success");
1350 return Either.left(deletedRelatedInst);
1353 public Either<ComponentInstance, ResponseFormat> deleteNodeFiltersFromComponentInstance(
1354 final Component component,
1355 final ComponentInstance componentInstance,
1356 final ComponentTypeEnum containerComponentType,
1357 final String userId) {
1359 final Set<String> componentFiltersIDsToBeDeleted =
1360 getComponentFiltersRelatedToComponentInstance(component.getUniqueId(), componentInstance);
1361 if (!componentFiltersIDsToBeDeleted.isEmpty()) {
1362 final Set<String> ids = component.getComponentInstances().stream()
1363 .filter(ci -> componentFiltersIDsToBeDeleted.contains(ci.getName()))
1364 .map(ComponentInstance::getUniqueId).collect(Collectors.toSet());
1365 final Either<Set<String>, StorageOperationStatus> deleteComponentNodeFiltersEither =
1366 nodeFilterOperation.deleteNodeFilters(component, ids);
1367 if (deleteComponentNodeFiltersEither.isRight()) {
1368 final ActionStatus status = componentsUtils
1369 .convertFromStorageResponse(deleteComponentNodeFiltersEither.right().value(),
1370 containerComponentType);
1371 return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
1373 for (final String id : ids) {
1374 final Optional<ComponentInstance> componentInstanceById = component.getComponentInstanceById(id);
1375 if (!componentInstanceById.isPresent()) {
1376 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1378 final ComponentInstance componentInstanceToBeUpdated = componentInstanceById.get();
1379 final List<String> directives = componentInstanceToBeUpdated.getDirectives();
1380 componentInstanceToBeUpdated.setDirectives(Collections.emptyList());
1381 final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
1382 updateComponentInstanceMetadata(containerComponentType.getValue(), component.getUniqueId(),
1383 componentInstanceToBeUpdated.getUniqueId(), userId, componentInstanceToBeUpdated, true, false);
1384 if (componentInstanceResponseFormatEither.isRight()) {
1385 return componentInstanceResponseFormatEither;
1389 return Either.left(componentInstance);
1394 private Set<String> getComponentFiltersRelatedToComponentInstance(String containerComponentId,
1395 ComponentInstance componentInstance) {
1396 ComponentParametersView filter = new ComponentParametersView(true);
1397 filter.setIgnoreComponentInstances(false);
1398 Either<Component, StorageOperationStatus> componentFilterOrigin =
1399 toscaOperationFacade.getToscaElement(containerComponentId, filter);
1400 final Component component = componentFilterOrigin.left().value();
1401 final Set<String> nodesFiltersToBeDeleted = ComponentsUtils.getNodesFiltersToBeDeleted(component,
1403 return nodesFiltersToBeDeleted;
1407 ComponentInstance deleteForwardingPathsRelatedTobeDeletedComponentInstance(String containerComponentId,
1408 ComponentTypeEnum containerComponentType, ComponentInstance componentInstance) {
1409 if(containerComponentType == ComponentTypeEnum.SERVICE){
1410 List<String> pathIDsToBeDeleted = getForwardingPathsRelatedToComponentInstance(containerComponentId, componentInstance.getName());
1411 if (!pathIDsToBeDeleted.isEmpty()) {
1412 deleteForwardingPaths(containerComponentId, pathIDsToBeDeleted);
1415 return componentInstance;
1418 private void deleteForwardingPaths(String serviceId, List<String> pathIdsToDelete){
1420 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1421 if(storageStatus.isRight()) {
1422 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus.right().value()));
1424 Either<Set<String>, StorageOperationStatus> result = forwardingPathOperation.deleteForwardingPath(storageStatus.left().value(),
1425 Sets.newHashSet(pathIdsToDelete));
1427 if(result.isRight()) {
1428 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(result.right().value()));
1432 private List<String> getForwardingPathsRelatedToComponentInstance(String containerComponentId, String componentInstanceId){
1433 Collection<ForwardingPathDataDefinition> allPaths = getForwardingPathDataDefinitions(containerComponentId);
1434 List<String> pathIDsToBeDeleted = new ArrayList<>();
1436 allPaths.stream().filter(path -> isPathRelatedToComponent(path,componentInstanceId ))
1437 .forEach(path -> pathIDsToBeDeleted.add(path.getUniqueId()));
1439 return pathIDsToBeDeleted;
1442 private Collection<ForwardingPathDataDefinition> getForwardingPathDataDefinitions(String containerComponentId) {
1443 ComponentParametersView filter = new ComponentParametersView(true);
1444 filter.setIgnoreForwardingPath(false);
1445 Either<Service, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade
1446 .getToscaElement(containerComponentId, filter);
1447 return forwardingPathOrigin.left().value().getForwardingPaths().values();
1450 private boolean isPathRelatedToComponent(ForwardingPathDataDefinition pathDataDefinition,
1451 String componentInstanceId){
1452 return pathDataDefinition.getPathElements().getListToscaDataDefinition()
1453 .stream().anyMatch(elementDataDefinition -> elementDataDefinition.getFromNode().equalsIgnoreCase(componentInstanceId) ||
1454 elementDataDefinition.getToNode()
1455 .equalsIgnoreCase(componentInstanceId));
1459 private ComponentInstance deleteComponentInstance(Component containerComponent, String componentInstanceId, ComponentTypeEnum containerComponentType) {
1460 Either<ImmutablePair<Component, String>, StorageOperationStatus> deleteRes = toscaOperationFacade.deleteComponentInstanceFromTopologyTemplate(containerComponent, componentInstanceId);
1461 if (deleteRes.isRight()) {
1462 log.debug("Failed to delete entry on graph for resourceInstance {}", componentInstanceId);
1463 ActionStatus status = componentsUtils.convertFromStorageResponse(deleteRes.right().value(), containerComponentType);
1464 throw new ByActionStatusComponentException(status, componentInstanceId);
1466 log.debug("The component instance {} has been removed from container component {}. ", componentInstanceId, containerComponent);
1467 ComponentInstance deletedInstance = findAndRemoveComponentInstanceFromContainerComponent(componentInstanceId, containerComponent);
1469 if (CollectionUtils.isNotEmpty(containerComponent.getInputs())) {
1470 List<InputDefinition> inputsToDelete = containerComponent.getInputs().stream().filter(i -> i.getInstanceUniqueId() != null && i.getInstanceUniqueId().equals(componentInstanceId)).collect(Collectors.toList());
1471 if (CollectionUtils.isNotEmpty(inputsToDelete)) {
1472 StorageOperationStatus deleteInputsRes = toscaOperationFacade.deleteComponentInstanceInputsFromTopologyTemplate(containerComponent, inputsToDelete);
1473 if (deleteInputsRes != StorageOperationStatus.OK) {
1474 log.debug("Failed to delete inputs of the component instance {} from container component. ", componentInstanceId);
1475 throw new ByActionStatusComponentException(
1476 componentsUtils.convertFromStorageResponse(deleteInputsRes, containerComponentType), componentInstanceId);
1480 return deletedInstance;
1483 private ComponentInstance findAndRemoveComponentInstanceFromContainerComponent(String componentInstanceId, Component containerComponent) {
1484 ComponentInstance foundInstance = null;
1485 for (ComponentInstance instance : containerComponent.getComponentInstances()) {
1486 if (instance.getUniqueId().equals(componentInstanceId)) {
1487 foundInstance = instance;
1488 containerComponent.getComponentInstances().remove(instance);
1492 findAndRemoveComponentInstanceRelations(componentInstanceId, containerComponent);
1493 return foundInstance;
1496 private void findAndRemoveComponentInstanceRelations(String componentInstanceId, Component containerComponent) {
1497 if(CollectionUtils.isNotEmpty(containerComponent.getComponentInstancesRelations())){
1498 containerComponent.setComponentInstancesRelations(containerComponent.getComponentInstancesRelations().stream().filter(r -> isNotBelongingRelation(componentInstanceId, r)).collect(Collectors.toList()));
1502 private boolean isNotBelongingRelation(String componentInstanceId, RequirementCapabilityRelDef relation) {
1503 return !relation.getToNode().equals(componentInstanceId) && !relation.getFromNode().equals(componentInstanceId);
1506 public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
1507 return associateRIToRI(componentId, userId, requirementDef, componentTypeEnum, false, true);
1510 public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum, boolean inTransaction, boolean needLock) {
1512 validateUserExists(userId);
1514 RequirementCapabilityRelDef requirementCapabilityRelDef = null;
1516 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1518 validateCanWorkOnComponent(containerComponent, userId);
1519 boolean failed = false;
1522 lockComponent(containerComponent, "associateRIToRI");
1524 requirementCapabilityRelDef = associateRIToRIOnGraph(containerComponent, requirementDef);
1525 }catch (ComponentException e){
1530 unlockComponent(failed, containerComponent);
1532 return requirementCapabilityRelDef;
1535 public RequirementCapabilityRelDef associateRIToRIOnGraph(Component containerComponent, RequirementCapabilityRelDef requirementDef) {
1537 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
1539 Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.associateResourceInstances(null, containerComponent.getUniqueId(), requirementDef);
1541 if (result.isLeft()) {
1542 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
1543 RequirementCapabilityRelDef requirementCapabilityRelDef = result.left().value();
1544 return requirementCapabilityRelDef;
1547 log.debug("Failed to associate node: {} with node {}", requirementDef.getFromNode(), requirementDef.getToNode());
1548 String fromNameOrId = "";
1549 String toNameOrId = "";
1550 Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(containerComponent, requirementDef.getFromNode());
1551 Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(containerComponent, requirementDef.getToNode());
1553 toNameOrId = requirementDef.getFromNode();
1554 fromNameOrId = requirementDef.getFromNode();
1555 if (fromResult.isLeft()) {
1556 fromNameOrId = fromResult.left().value().getName();
1558 if (toResult.isLeft()) {
1559 toNameOrId = toResult.left().value().getName();
1562 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponseForResourceInstance
1563 (result.right().value(), true), fromNameOrId, toNameOrId,
1564 requirementDef.getRelationships().get(0).getRelation().getRequirement());
1570 * @param componentId
1572 * @param requirementDefList
1573 * @param componentTypeEnum
1576 public List<RequirementCapabilityRelDef> batchDissociateRIFromRI(
1579 List<RequirementCapabilityRelDef> requirementDefList,
1580 ComponentTypeEnum componentTypeEnum) {
1582 validateUserExists(userId);
1583 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1584 validateCanWorkOnComponent(containerComponent, userId);
1585 boolean failed = false;
1586 List<RequirementCapabilityRelDef> delOkResult = new ArrayList<>();
1588 lockComponent(containerComponent, "associateRIToRI");
1589 for (RequirementCapabilityRelDef requirementDef : requirementDefList) {
1590 RequirementCapabilityRelDef requirementCapabilityRelDef = dissociateRIFromRI(
1591 componentId, userId, requirementDef, containerComponent.getComponentType());
1592 delOkResult.add(requirementCapabilityRelDef);
1594 }catch (ComponentException e){
1598 unlockComponent(failed, containerComponent);
1604 public RequirementCapabilityRelDef dissociateRIFromRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
1605 validateUserExists(userId);
1607 Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
1608 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1610 validateCanWorkOnComponent(containerComponent, userId);
1611 boolean failed = false;
1613 lockComponent(containerComponent, "associateRIToRI");
1614 log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
1615 Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.dissociateResourceInstances(componentId, requirementDef);
1616 if (result.isLeft()) {
1617 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
1618 return result.left().value();
1621 log.debug("Failed to dissocaite node {} from node {}", requirementDef.getFromNode(), requirementDef.getToNode());
1622 String fromNameOrId = "";
1623 String toNameOrId = "";
1624 Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(containerComponent, requirementDef.getFromNode());
1625 Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(containerComponent, requirementDef.getToNode());
1627 toNameOrId = requirementDef.getFromNode();
1628 fromNameOrId = requirementDef.getFromNode();
1629 if (fromResult.isLeft()) {
1630 fromNameOrId = fromResult.left().value().getName();
1632 if (toResult.isLeft()) {
1633 toNameOrId = toResult.left().value().getName();
1636 throw new ByActionStatusComponentException(
1637 componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true),
1638 fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement());
1640 }catch (ComponentException e){
1644 unlockComponent(failed, containerComponent);
1648 * Allows to get relation contained in specified component according to received Id
1649 * @param componentId
1652 * @param componentTypeEnum
1655 public Either<RequirementCapabilityRelDef, ResponseFormat> getRelationById(String componentId, String relationId, String userId, ComponentTypeEnum componentTypeEnum) {
1657 Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
1659 org.openecomp.sdc.be.model.Component containerComponent = null;
1660 RequirementCapabilityRelDef foundRelation = null;
1662 validateUserExists(userId);
1663 containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
1664 List<RequirementCapabilityRelDef> requirementCapabilityRelations = containerComponent.getComponentInstancesRelations();
1665 foundRelation = findRelation(relationId, requirementCapabilityRelations);
1666 if(foundRelation == null){
1667 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RELATION_NOT_FOUND, relationId, componentId);
1668 log.debug("Relation with id {} was not found on the component", relationId, componentId);
1669 resultOp = Either.right(responseFormat);
1671 if(resultOp == null){
1672 resultOp = setRelatedCapability(foundRelation, containerComponent);
1674 if(resultOp.isLeft()){
1675 resultOp = setRelatedRequirement(foundRelation, containerComponent);
1677 } catch (Exception e) {
1678 log.error("The exception {} occured upon get relation {} of the component {} ", e, relationId, componentId);
1679 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1684 private RequirementCapabilityRelDef findRelation(String relationId, List<RequirementCapabilityRelDef> requirementCapabilityRelations) {
1685 for(RequirementCapabilityRelDef relationship : requirementCapabilityRelations){
1686 if(relationship.getRelationships().stream().filter(r -> r.getRelation().getId().equals(relationId)).findFirst().isPresent()){
1687 return relationship;
1693 private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedRequirement(RequirementCapabilityRelDef foundRelation, Component containerComponent) {
1694 Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
1695 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1696 String instanceId = foundRelation.getFromNode();
1697 Optional<RequirementDefinition> foundRequirement;
1698 Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
1699 if(!instance.isPresent()){
1700 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance", containerComponent.getComponentType().getValue(), containerComponent.getName());
1701 log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
1702 result = Either.right(responseFormat);
1705 for(List<RequirementDefinition> requirements : instance.get().getRequirements().values()){
1706 foundRequirement = requirements.stream().filter(r -> isBelongingCalcRequirement(relationshipInfo, r, containerComponent.getLifecycleState())).findFirst();
1707 if(foundRequirement.isPresent()){
1708 foundRelation.resolveSingleRelationship().setRequirement(foundRequirement.get());
1709 result = Either.left(foundRelation);
1714 Either<RequirementDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade.getFulfilledRequirementByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullRequirement);
1715 if(getfulfilledRequirementRes.isRight()){
1716 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.REQUIREMENT_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getRequirement(), instanceId, containerComponent.getUniqueId());
1717 log.debug("Requirement {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
1718 result = Either.right(responseFormat);
1720 foundRelation.resolveSingleRelationship().setRequirement(getfulfilledRequirementRes.left().value());
1724 result = Either.left(foundRelation);
1729 private boolean isBelongingFullRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req) {
1730 return req.getName().equals(relationshipInfo.getRequirement()) &&
1731 req.getUniqueId().equals(relationshipInfo.getRequirementUid()) &&
1732 req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
1735 private boolean isBelongingCalcRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req, LifecycleStateEnum state) {
1736 return nameMatches(relationshipInfo.getRequirement(), req.getName(), req.getPreviousName(), state) &&
1737 req.getUniqueId().equals(relationshipInfo.getRequirementUid()) &&
1738 req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
1741 private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedCapability(RequirementCapabilityRelDef foundRelation, Component containerComponent) {
1742 Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
1743 RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
1744 String instanceId = foundRelation.getToNode();
1745 Optional<CapabilityDefinition> foundCapability;
1746 Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
1747 if(!instance.isPresent()){
1748 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance", containerComponent.getComponentType().getValue(), containerComponent.getName());
1749 log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
1750 result = Either.right(responseFormat);
1753 for(List<CapabilityDefinition> capabilities : instance.get().getCapabilities().values()){
1754 foundCapability = capabilities.stream().filter(c -> isBelongingCalcCapability(relationshipInfo, c, containerComponent.getLifecycleState())).findFirst();
1755 if(foundCapability.isPresent()){
1756 foundRelation.resolveSingleRelationship().setCapability(foundCapability.get());
1757 result = Either.left(foundRelation);
1762 Either<CapabilityDataDefinition, StorageOperationStatus> getfulfilledRequirementRes =
1763 toscaOperationFacade.getFulfilledCapabilityByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullCapability);
1764 if(getfulfilledRequirementRes.isRight()){
1765 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
1766 log.debug("Capability {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
1767 result = Either.right(responseFormat);
1769 foundRelation.resolveSingleRelationship().setCapability(getfulfilledRequirementRes.left().value());
1773 result = Either.left(foundRelation);
1778 private boolean isBelongingFullCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap) {
1779 return cap.getName().equals(relationshipInfo.getCapability()) &&
1780 cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) &&
1781 cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
1784 private boolean isBelongingCalcCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap, LifecycleStateEnum state) {
1785 return nameMatches(relationshipInfo.getCapability(), cap.getName(), cap.getPreviousName(), state) &&
1786 cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) &&
1787 cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
1790 private boolean nameMatches(String nameFromRelationship, String currName, String previousName, LifecycleStateEnum state) {
1791 return state == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT ?
1792 currName.equals(nameFromRelationship):
1793 previousName!= null && previousName.equals(nameFromRelationship);
1796 private Either<ComponentInstanceProperty, ResponseFormat> updateAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
1797 Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation.updateAttributeValueInResourceInstance(attribute, resourceInstanceId, true);
1798 Either<ComponentInstanceProperty, ResponseFormat> result;
1799 if (eitherAttribute.isLeft()) {
1800 log.debug("Attribute value {} was updated on graph.", attribute.getValueUniqueUid());
1801 ComponentInstanceProperty instanceAttribute = eitherAttribute.left().value();
1803 result = Either.left(instanceAttribute);
1806 log.debug("Failed to update attribute value {} in resource instance {}", attribute, resourceInstanceId);
1808 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(eitherAttribute.right().value());
1810 result = Either.right(componentsUtils.getResponseFormat(actionStatus, ""));
1816 private Either<ComponentInstanceProperty, ResponseFormat> createAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
1818 Either<ComponentInstanceProperty, ResponseFormat> result;
1820 Wrapper<Integer> indexCounterWrapper = new Wrapper<>();
1821 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
1822 validateIncrementCounter(resourceInstanceId, GraphPropertiesDictionary.ATTRIBUTE_COUNTER, indexCounterWrapper, errorWrapper);
1824 if (!errorWrapper.isEmpty()) {
1825 result = Either.right(errorWrapper.getInnerElement());
1827 Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation.addAttributeValueToResourceInstance(attribute, resourceInstanceId, indexCounterWrapper.getInnerElement(), true);
1828 if (eitherAttribute.isLeft()) {
1829 log.debug("Attribute value was added to resource instance {}", resourceInstanceId);
1830 ComponentInstanceProperty instanceAttribute = eitherAttribute.left().value();
1831 result = Either.left(instanceAttribute);
1834 log.debug("Failed to add attribute value {} to resource instance {}", attribute, resourceInstanceId);
1836 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(eitherAttribute.right().value());
1837 result = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
1845 * Create Or Updates Attribute Instance
1847 * @param componentTypeEnum
1848 * @param componentId
1849 * @param resourceInstanceId
1854 public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateAttributeValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, ComponentInstanceProperty attribute, String userId) {
1855 Either<ComponentInstanceProperty, ResponseFormat> result = null;
1856 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
1858 validateUserExists(userId);
1859 if (errorWrapper.isEmpty()) {
1860 validateComponentTypeEnum(componentTypeEnum, "CreateOrUpdateAttributeValue", errorWrapper);
1862 if (errorWrapper.isEmpty()) {
1863 validateCanWorkOnComponent(componentId, componentTypeEnum, userId, errorWrapper);
1865 if (errorWrapper.isEmpty()) {
1866 validateComponentLock(componentId, componentTypeEnum, errorWrapper);
1870 if (errorWrapper.isEmpty()) {
1871 final boolean isCreate = Objects.isNull(attribute.getValueUniqueUid());
1873 result = createAttributeValue(attribute, resourceInstanceId);
1875 result = updateAttributeValue(attribute, resourceInstanceId);
1878 result = Either.right(errorWrapper.getInnerElement());
1884 if (result == null || result.isRight()) {
1885 janusGraphDao.rollback();
1887 janusGraphDao.commit();
1890 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
1894 public Either<List<ComponentInstanceProperty>, ResponseFormat> createOrUpdatePropertiesValues(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, List<ComponentInstanceProperty> properties, String userId) {
1896 Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
1898 /*-------------------------------Validations---------------------------------*/
1899 validateUserExists(userId);
1901 if (componentTypeEnum == null) {
1902 BeEcompErrorManager.getInstance().logInvalidInputError("CreateOrUpdatePropertiesValues", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
1903 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
1906 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
1908 if (getResourceResult.isRight()) {
1909 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
1910 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
1911 return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
1913 Component containerComponent = getResourceResult.left().value();
1915 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
1916 if (containerComponent.isArchived()) {
1917 log.info("Component is archived. Component id: {}", componentId);
1918 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
1920 log.info("Restricted operation for user: {} on service {}", userId, componentId);
1921 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
1924 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
1925 if (resourceInstanceStatus.isRight()) {
1926 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
1927 resourceInstanceId, "resource instance", "service", componentId));
1929 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
1932 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
1933 if (lockStatus != StorageOperationStatus.OK) {
1934 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
1935 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
1937 List <ComponentInstanceProperty> updatedProperties = new ArrayList<>();
1939 for (ComponentInstanceProperty property: properties) {
1940 validateMandatoryFields(property);
1941 ComponentInstanceProperty componentInstanceProperty = validatePropertyExistsOnComponent(property, containerComponent, foundResourceInstance);
1942 String propertyParentUniqueId = property.getParentUniqueId();
1943 Either<String, ResponseFormat> updatedPropertyValue = updatePropertyObjectValue(property, false);
1944 if (updatedPropertyValue.isRight()) {
1945 log.error("Failed to update property object value of property: {}",
1947 throw new ByResponseFormatComponentException(updatedPropertyValue.right().value());
1949 Optional<CapabilityDefinition>
1950 capPropDefinition = getPropertyCapabilityOfChildInstance(propertyParentUniqueId, foundResourceInstance.getCapabilities());
1951 if (capPropDefinition.isPresent()) {
1952 updatedPropertyValue
1953 .bimap(updatedValue -> updateCapabilityPropFromUpdateInstProp(property, updatedValue,
1954 containerComponent, foundResourceInstance, capPropDefinition.get().getType(),
1955 capPropDefinition.get().getName()), Either::right);
1957 updatedPropertyValue.bimap(
1959 componentInstanceProperty.setValue(updatedValue);
1960 return updatePropertyOnContainerComponent(property, updatedValue,
1961 containerComponent, foundResourceInstance);
1963 updatedProperties.add(componentInstanceProperty);
1967 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
1968 if (updateContainerRes.isRight()) {
1969 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
1970 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
1973 resultOp = Either.left(updatedProperties);
1977 if (resultOp == null || resultOp.isRight()) {
1978 janusGraphDao.rollback();
1980 janusGraphDao.commit();
1983 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
1987 private void validateMandatoryFields(PropertyDataDefinition property) {
1988 if (StringUtils.isEmpty(property.getName())) {
1989 throw new ByActionStatusComponentException (ActionStatus.MISSING_PROPERTY_NAME);
1993 private ComponentInstanceProperty validatePropertyExistsOnComponent(ComponentInstanceProperty property, Component containerComponent, ComponentInstance foundResourceInstance) {
1994 List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(foundResourceInstance.getUniqueId());
1995 Optional<ComponentInstanceProperty> instanceProperty = instanceProperties.stream().filter(p -> p.getName().equals(property.getName())).findAny();
1996 if (!instanceProperty.isPresent()) {
1997 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, property.getName());
1999 return instanceProperty.get();
2004 private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property,
2005 String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
2006 String capabilityType, String capabilityName) {
2007 String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
2008 ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
2009 foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
2010 if (actionStatus != null) {
2011 return actionStatus;
2014 return componentsUtils.getResponseFormat(ActionStatus.OK);
2017 private ResponseFormat updateCapabilityPropFromUpdateInstProp(ComponentInstanceProperty property,
2018 String newValue, Component containerComponent,
2019 ComponentInstance foundResourceInstance,
2020 String capabilityType, String capabilityName) {
2021 String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
2022 Either<Component, StorageOperationStatus> getComponentRes =
2023 toscaOperationFacade.getToscaFullElement(foundResourceInstance.getComponentUid());
2024 if(getComponentRes.isRight()) {
2025 return componentsUtils.getResponseFormat(getComponentRes.right().value());
2028 ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
2029 foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
2030 if (actionStatus != null) {
2031 return actionStatus;
2034 return componentsUtils.getResponseFormat(ActionStatus.OK);
2037 private ResponseFormat updateCapPropOnContainerComponent(ComponentInstanceProperty property, String newValue,
2038 Component containerComponent,
2039 ComponentInstance foundResourceInstance,
2040 String capabilityType, String capabilityName,
2041 String componentInstanceUniqueId) {
2042 Map<String, List<CapabilityDefinition>> capabilities =
2043 Optional.ofNullable(foundResourceInstance.getCapabilities()).orElse(Collections.emptyMap());
2044 List<CapabilityDefinition> capPerType =
2045 Optional.ofNullable(capabilities.get(capabilityType)).orElse(Collections.EMPTY_LIST);
2046 Optional<CapabilityDefinition> cap =
2047 capPerType.stream().filter(c -> c.getName().equals(capabilityName)).findAny();
2048 if (cap.isPresent()) {
2049 List<ComponentInstanceProperty> capProperties = cap.get().getProperties();
2050 if (capProperties != null) {
2051 Optional<ComponentInstanceProperty> instanceProperty =
2052 capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
2053 StorageOperationStatus status;
2054 if (instanceProperty.isPresent()) {
2055 String capKey = ModelConverter.buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName, componentInstanceUniqueId, cap.get());
2056 instanceProperty.get().setValue(newValue);
2057 List<String> path = new ArrayList<>();
2058 path.add(componentInstanceUniqueId);
2060 instanceProperty.get().setPath(path);
2061 status = toscaOperationFacade.updateComponentInstanceCapabiltyProperty(containerComponent,
2062 componentInstanceUniqueId, capKey, instanceProperty.get());
2063 if (status != StorageOperationStatus.OK) {
2064 ActionStatus actionStatus =
2065 componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2066 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2069 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2076 private ResponseFormat updatePropertyOnContainerComponent(ComponentInstanceProperty instanceProperty, String newValue, Component containerComponent, ComponentInstance foundResourceInstance) {
2077 StorageOperationStatus status;
2078 instanceProperty.setValue(newValue);
2079 status = toscaOperationFacade.updateComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(), instanceProperty);
2080 if (status != StorageOperationStatus.OK) {
2081 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2082 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2084 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2085 return componentsUtils.getResponseFormat(ActionStatus.OK);
2088 private <T extends PropertyDefinition> Either<String,ResponseFormat> validatePropertyObjectValue(T property, String newValue, boolean isInput) {
2089 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypesEither = dataTypeCache.getAll();
2090 if (allDataTypesEither.isRight()) {
2091 JanusGraphOperationStatus status = allDataTypesEither.right().value();
2092 BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance", "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
2093 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status))));
2095 Map<String, DataTypeDefinition> allDataTypes = allDataTypesEither.left().value();
2096 String propertyType = property.getType();
2097 String innerType = getInnerType(property);
2099 // Specific Update Logic
2100 Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(property.getType(), newValue, true, innerType, allDataTypes);
2101 if (isValid.isRight()) {
2102 Boolean res = isValid.right().value();
2104 log.error("Invalid value {} of property {} ", newValue, property.getName());
2105 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
2108 Object object = isValid.left().value();
2109 if (object != null) {
2110 newValue = object.toString();
2113 if (validateAndUpdateRules(property, isInput, allDataTypes, innerType, propertyType))
2114 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
2115 return Either.left(newValue);
2118 private <T extends PropertyDefinition> boolean validateAndUpdateRules(T property, boolean isInput, Map<String, DataTypeDefinition> allDataTypes, String innerType, String propertyType) {
2120 ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, ((ComponentInstanceProperty) property).getRules(), innerType, allDataTypes, true);
2121 if (pair.getRight() != null && !pair.getRight()) {
2122 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
2129 private <T extends PropertyDefinition> Either<String,ResponseFormat> updatePropertyObjectValue(T property, boolean isInput) {
2130 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypesEither = dataTypeCache.getAll();
2131 if (allDataTypesEither.isRight()) {
2132 JanusGraphOperationStatus status = allDataTypesEither.right().value();
2133 BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance", "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
2134 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status))));
2136 Map<String, DataTypeDefinition> allDataTypes = allDataTypesEither.left().value();
2137 String innerType = null;
2138 String propertyType = property.getType();
2139 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
2140 log.debug("The type of the property {} is {}", property.getUniqueId(), propertyType);
2142 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
2143 SchemaDefinition def = property.getSchema();
2145 log.debug("Schema doesn't exists for property of type {}", type);
2146 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2148 PropertyDataDefinition propDef = def.getProperty();
2149 if (propDef == null) {
2150 log.debug("Property in Schema Definition inside property of type {} doesn't exist", type);
2151 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
2153 innerType = propDef.getType();
2155 // Specific Update Logic
2156 Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(propertyType, property.getValue(), true, innerType, allDataTypes);
2157 String newValue = property.getValue();
2158 if (isValid.isRight()) {
2159 Boolean res = isValid.right().value();
2161 log.debug("validate and update property value has failed with value: {}", property.getValue());
2162 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
2165 Object object = isValid.left().value();
2166 if (object != null) {
2167 newValue = object.toString();
2171 ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, ((ComponentInstanceProperty) property).getRules(), innerType, allDataTypes, true);
2172 if (pair.getRight() != null && pair.getRight() == false) {
2173 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
2174 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
2177 return Either.left(newValue);
2180 private ResponseFormat updateInputOnContainerComponent(ComponentInstanceInput input, String newValue, Component containerComponent, ComponentInstance foundResourceInstance) {
2181 StorageOperationStatus status;
2182 input.setValue(newValue);
2183 status = toscaOperationFacade.updateComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), input);
2184 if (status != StorageOperationStatus.OK) {
2185 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2186 return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
2188 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
2189 return componentsUtils.getResponseFormat(ActionStatus.OK);
2192 public Either<List<ComponentInstanceInput>, ResponseFormat> createOrUpdateInstanceInputValues(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, List<ComponentInstanceInput> inputs, String userId) {
2194 Either<List<ComponentInstanceInput>, ResponseFormat> resultOp = null;
2196 validateUserExists(userId);
2198 if (componentTypeEnum == null) {
2199 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2200 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2203 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
2205 if (getResourceResult.isRight()) {
2206 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
2207 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
2208 return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
2210 Component containerComponent = getResourceResult.left().value();
2212 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
2213 if (containerComponent.isArchived()) {
2214 log.info("Component is archived. Component id: {}", componentId);
2215 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
2217 log.info("Restricted operation for user: {} on service {}", userId, componentId);
2218 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2221 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
2222 if (resourceInstanceStatus.isRight()) {
2223 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
2224 resourceInstanceId, "resource instance", "service", componentId));
2227 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
2230 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
2231 if (lockStatus != StorageOperationStatus.OK) {
2232 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
2233 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2235 List <ComponentInstanceInput> updatedInputs = new ArrayList<>();
2237 for (ComponentInstanceInput input: inputs) {
2238 validateMandatoryFields(input);
2239 ComponentInstanceInput componentInstanceInput = validateInputExistsOnComponent(input, containerComponent, foundResourceInstance);
2240 Either<String, ResponseFormat> validatedInputValue = validatePropertyObjectValue(componentInstanceInput, input.getValue(), true);
2241 if (validatedInputValue.isRight()){
2242 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT, input.getName());
2244 updateInputOnContainerComponent(componentInstanceInput, validatedInputValue.left().value(), containerComponent, foundResourceInstance);
2245 updatedInputs.add(componentInstanceInput);
2247 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
2248 if (updateContainerRes.isRight()) {
2249 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
2250 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2253 resultOp = Either.left(updatedInputs);
2257 if (resultOp == null || resultOp.isRight()) {
2258 janusGraphDao.rollback();
2260 janusGraphDao.commit();
2263 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2268 private ComponentInstanceInput validateInputExistsOnComponent(ComponentInstanceInput input, Component containerComponent, ComponentInstance foundResourceInstance) {
2269 List<ComponentInstanceInput> instanceProperties = containerComponent.getComponentInstancesInputs().get(foundResourceInstance.getUniqueId());
2270 Optional<ComponentInstanceInput> instanceInput = instanceProperties.stream().filter(p -> p.getName().equals(input.getName())).findAny();
2271 if (!instanceInput.isPresent()) {
2272 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, input.getName());
2274 return instanceInput.get();
2277 public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateGroupInstancePropertyValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, String groupInstanceId, ComponentInstanceProperty property, String userId) {
2279 Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
2281 validateUserExists(userId);
2283 if (componentTypeEnum == null) {
2284 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2285 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2289 if (!ComponentValidationUtils.canWorkOnComponent(componentId, toscaOperationFacade, userId)) {
2290 log.info("Restricted operation for user: {} on service: {}", userId, componentId);
2291 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2295 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
2296 if (lockStatus != StorageOperationStatus.OK) {
2297 log.debug(FAILED_TO_LOCK_SERVICE, componentId);
2298 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2302 String propertyValueUid = property.getValueUniqueUid();
2304 if (propertyValueUid == null) {
2306 Either<Integer, StorageOperationStatus> counterRes = groupInstanceOperation.increaseAndGetGroupInstancePropertyCounter(groupInstanceId);
2308 if (counterRes.isRight()) {
2309 log.debug("increaseAndGetResourcePropertyCounter failed resource instance: {} property: {}", resourceInstanceId, property);
2310 StorageOperationStatus status = counterRes.right().value();
2311 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2312 resultOp = Either.right(componentsUtils.getResponseFormat(actionStatus));
2314 Integer index = counterRes.left().value();
2315 Either<ComponentInstanceProperty, StorageOperationStatus> result = groupInstanceOperation.addPropertyValueToGroupInstance(property, resourceInstanceId, index, true);
2317 if (result.isLeft()) {
2318 log.trace("Property value was added to resource instance {}", resourceInstanceId);
2319 ComponentInstanceProperty instanceProperty = result.left().value();
2321 resultOp = Either.left(instanceProperty);
2324 log.debug("Failed to add property value: {} to resource instance {}", property, resourceInstanceId);
2326 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2328 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2332 Either<ComponentInstanceProperty, StorageOperationStatus> result = groupInstanceOperation.updatePropertyValueInGroupInstance(property, resourceInstanceId, true);
2334 if (result.isLeft()) {
2335 log.debug("Property value {} was updated on graph.", property.getValueUniqueUid());
2336 ComponentInstanceProperty instanceProperty = result.left().value();
2338 resultOp = Either.left(instanceProperty);
2341 log.debug("Failed to update property value: {}, in resource instance {}", property, resourceInstanceId);
2343 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2345 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2348 if (resultOp.isLeft()) {
2349 StorageOperationStatus updateCustomizationUUID = componentInstanceOperation.updateCustomizationUUID(resourceInstanceId);
2350 if (updateCustomizationUUID != StorageOperationStatus.OK) {
2351 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateCustomizationUUID);
2353 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2360 if (resultOp == null || resultOp.isRight()) {
2361 janusGraphDao.rollback();
2363 janusGraphDao.commit();
2366 graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
2371 public Either<ComponentInstanceProperty, ResponseFormat> deletePropertyValue(ComponentTypeEnum componentTypeEnum, String serviceId, String resourceInstanceId, String propertyValueId, String userId) {
2373 validateUserExists(userId);
2375 Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
2377 if (componentTypeEnum == null) {
2378 BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2379 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2383 if (!ComponentValidationUtils.canWorkOnComponent(serviceId, toscaOperationFacade, userId)) {
2384 log.info("Restricted operation for user {} on service {}", userId, serviceId);
2385 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2389 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(serviceId, componentTypeEnum.getNodeType());
2390 if (lockStatus != StorageOperationStatus.OK) {
2391 log.debug(FAILED_TO_LOCK_SERVICE, serviceId);
2392 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2396 Either<ComponentInstanceProperty, StorageOperationStatus> result = propertyOperation.removePropertyValueFromResourceInstance(propertyValueId, resourceInstanceId, true);
2398 if (result.isLeft()) {
2399 log.debug("Property value {} was removed from graph.", propertyValueId);
2400 ComponentInstanceProperty instanceProperty = result.left().value();
2402 resultOp = Either.left(instanceProperty);
2406 log.debug("Failed to remove property value {} in resource instance {}", propertyValueId, resourceInstanceId);
2408 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
2410 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2416 if (resultOp == null || resultOp.isRight()) {
2417 janusGraphDao.rollback();
2419 janusGraphDao.commit();
2422 graphLockOperation.unlockComponent(serviceId, componentTypeEnum.getNodeType());
2427 private Component getAndValidateOriginComponentOfComponentInstance(Component containerComponent, ComponentInstance componentInstance) {
2429 ComponentTypeEnum componentType = getComponentTypeByParentComponentType(containerComponent.getComponentType());
2430 Component component;
2431 Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaFullElement(componentInstance.getComponentUid());
2432 if (getComponentRes.isRight()) {
2433 log.debug("Failed to get the component with id {} for component instance {} creation. ", componentInstance.getComponentUid(), componentInstance.getName());
2434 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getComponentRes.right().value(), componentType);
2435 throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
2437 component = getComponentRes.left().value();
2438 LifecycleStateEnum resourceCurrState = component.getLifecycleState();
2439 if (resourceCurrState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
2440 ActionStatus actionStatus = ActionStatus.CONTAINER_CANNOT_CONTAIN_COMPONENT_IN_STATE;
2441 throw new ByActionStatusComponentException(actionStatus, containerComponent.getComponentType().toString(), resourceCurrState.toString());
2443 if (component.isArchived() == true){
2444 ActionStatus actionStatus = ActionStatus.COMPONENT_IS_ARCHIVED;
2445 throw new ByActionStatusComponentException(actionStatus, component.getName());
2450 public Either<Set<String>, ResponseFormat> forwardingPathOnVersionChange(String containerComponentParam,
2451 String containerComponentId,
2452 String componentInstanceId,
2453 ComponentInstance newComponentInstance) {
2454 Either<Set<String>, ResponseFormat> resultOp;
2455 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
2456 ComponentParametersView componentParametersView = getComponentParametersViewForForwardingPath();
2459 Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
2461 //Fetch current component instance
2462 Either<ComponentInstance, StorageOperationStatus> eitherResourceInstance =
2463 getResourceInstanceById(containerComponent, componentInstanceId);
2464 if (eitherResourceInstance.isRight()) {
2465 resultOp = Either.right(componentsUtils.getResponseFormat(
2466 ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId));
2469 ComponentInstance currentResourceInstance = eitherResourceInstance.left().value();
2471 //Check whether new componentInstance exists
2472 String resourceId = newComponentInstance.getComponentUid();
2473 Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade.validateComponentExists(resourceId);
2474 if (componentExistsRes.isRight()) {
2475 log.debug("Failed to find resource {}", resourceId);
2476 resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse
2477 (componentExistsRes.right().value()), resourceId));
2479 } else if (!componentExistsRes.left().value()) {
2480 log.debug("The resource {} not found ", resourceId);
2481 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
2485 //Fetch component using new component instance uid
2486 Component updatedContainerComponent=getOriginComponentFromComponentInstance(newComponentInstance);
2487 Set<String> toDeleteForwardingPaths = getForwardingPaths(containerComponent,
2488 currentResourceInstance, updatedContainerComponent);
2489 resultOp=Either.left(toDeleteForwardingPaths);
2494 private Set<String> getForwardingPaths(Component containerComponent, ComponentInstance currentResourceInstance,
2495 Component updatedContainerComponent) {
2496 DataForMergeHolder dataForMergeHolder=new DataForMergeHolder();
2497 dataForMergeHolder.setOrigComponentInstId(currentResourceInstance.getName());
2499 Service service = (Service) containerComponent;
2500 ForwardingPathUtils forwardingPathUtils = new ForwardingPathUtils();
2502 return forwardingPathUtils.
2503 getForwardingPathsToBeDeletedOnVersionChange(service,dataForMergeHolder,updatedContainerComponent);
2506 private ComponentParametersView getComponentParametersViewForForwardingPath() {
2507 ComponentParametersView componentParametersView = new ComponentParametersView();
2508 componentParametersView.setIgnoreCapabiltyProperties(false);
2509 componentParametersView.setIgnoreForwardingPath(false);
2510 return componentParametersView;
2513 public ComponentInstance changeComponentInstanceVersion(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance newComponentInstance) {
2515 User user = validateUserExists(userId);
2516 final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
2517 ComponentParametersView componentParametersView = new ComponentParametersView();
2518 componentParametersView.setIgnoreCapabiltyProperties(false);
2520 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
2522 validateCanWorkOnComponent(containerComponent, userId);
2524 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceId);
2525 if (resourceInstanceStatus.isRight()) {
2526 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId);
2529 ComponentInstance currentResourceInstance = resourceInstanceStatus.left().value();
2531 return changeInstanceVersion(containerComponent, currentResourceInstance, newComponentInstance, user, containerComponentType );
2534 public ComponentInstance changeInstanceVersion(org.openecomp.sdc.be.model.Component containerComponent,
2535 ComponentInstance currentResourceInstance,
2536 ComponentInstance newComponentInstance,
2538 final ComponentTypeEnum containerComponentType) {
2539 boolean failed = false;
2540 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus;
2543 lockComponent(containerComponent, "changeComponentInstanceVersion");
2544 String containerComponentId = containerComponent.getUniqueId();
2545 String componentInstanceId = currentResourceInstance.getUniqueId();
2546 if (currentResourceInstance.getComponentUid().equals(newComponentInstance.getComponentUid())) {
2547 return currentResourceInstance;
2549 String resourceId = newComponentInstance.getComponentUid();
2551 Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade
2552 .validateComponentExists(resourceId);
2553 if (componentExistsRes.isRight()) {
2554 StorageOperationStatus errorStatus = componentExistsRes.right().value();
2556 log.debug("Failed to validate existing of the component {}. Status is {} ", resourceId, errorStatus);
2557 throw new ByActionStatusComponentException(
2558 componentsUtils.convertFromStorageResponse(errorStatus), resourceId);
2559 } else if (!componentExistsRes.left().value()) {
2560 log.debug("The resource {} not found ", resourceId);
2561 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceId);
2564 Component eitherOriginComponent = getInstanceOriginNode(currentResourceInstance);
2566 DataForMergeHolder dataHolder = compInstMergeDataBL
2567 .saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent);
2568 ComponentInstance resResourceInfo = deleteComponentInstance(containerComponent, componentInstanceId,
2569 containerComponentType);
2571 if (resResourceInfo == null) {
2572 log.error("Calling `deleteComponentInstance` for the resource {} returned a null", resourceId);
2573 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceId);
2575 Component origComponent = null;
2576 OriginTypeEnum originType = currentResourceInstance.getOriginType();
2577 if (originType == OriginTypeEnum.ServiceProxy) {
2578 newComponentInstance.setOriginType(originType);
2579 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade
2580 .getLatestByName("serviceProxy");
2581 if (isServiceProxyOrigin(serviceProxyOrigin)) {
2582 throw new ByActionStatusComponentException(
2583 componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
2585 origComponent = serviceProxyOrigin.left().value();
2587 StorageOperationStatus fillProxyRes = fillInstanceData(newComponentInstance, origComponent);
2589 if (isFillProxyRes(fillProxyRes)) {
2590 throw new ByActionStatusComponentException(
2591 componentsUtils.convertFromStorageResponse(fillProxyRes));
2593 } else if (originType == OriginTypeEnum.ServiceSubstitution){
2594 newComponentInstance.setOriginType(originType);
2596 final Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade.getToscaFullElement(newComponentInstance.getComponentUid());
2597 if (getServiceResult.isRight()) {
2598 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
2600 final Component service = getServiceResult.left().value();
2602 final Either<Component, StorageOperationStatus> getServiceDerivedFromTypeResult = toscaOperationFacade.getLatestByToscaResourceName(service.getDerivedFromGenericType());
2603 if (getServiceDerivedFromTypeResult.isRight()) {
2604 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getServiceResult.right().value()));
2607 origComponent = getServiceDerivedFromTypeResult.left().value();
2609 final StorageOperationStatus fillProxyRes = fillInstanceData(newComponentInstance, origComponent);
2610 if (isFillProxyRes(fillProxyRes)) {
2611 throw new ByActionStatusComponentException(
2612 componentsUtils.convertFromStorageResponse(fillProxyRes));
2615 origComponent = getOriginComponentFromComponentInstance(newComponentInstance);
2616 newComponentInstance.setName(resResourceInfo.getName());
2619 newComponentInstance.setInvariantName(resResourceInfo.getInvariantName());
2620 newComponentInstance.setPosX(resResourceInfo.getPosX());
2621 newComponentInstance.setPosY(resResourceInfo.getPosY());
2622 newComponentInstance.setDescription(resResourceInfo.getDescription());
2624 ComponentInstance updatedComponentInstance = createComponentInstanceOnGraph(containerComponent,
2625 origComponent, newComponentInstance, user);
2626 dataHolder.setCurrInstanceNode(origComponent);
2627 Component mergeStatusEither = compInstMergeDataBL
2628 .mergeComponentUserOrigData(user, dataHolder, containerComponent, containerComponentId,
2629 newComponentInstance.getUniqueId());
2631 ActionStatus postChangeVersionResult = onChangeInstanceOperationOrchestrator
2632 .doPostChangeVersionOperations(containerComponent, currentResourceInstance, newComponentInstance);
2633 if (postChangeVersionResult != ActionStatus.OK) {
2634 throw new ByActionStatusComponentException(postChangeVersionResult);
2637 ComponentParametersView filter = new ComponentParametersView(true);
2638 filter.setIgnoreComponentInstances(false);
2639 Either<Component, StorageOperationStatus> updatedComponentRes = toscaOperationFacade
2640 .getToscaElement(containerComponentId, filter);
2641 if (updatedComponentRes.isRight()) {
2642 StorageOperationStatus storageOperationStatus = updatedComponentRes.right().value();
2643 ActionStatus actionStatus = componentsUtils
2644 .convertFromStorageResponse(storageOperationStatus, containerComponent.getComponentType());
2645 log.debug("Component with id {} was not found", containerComponentId);
2646 throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
2648 resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(),
2649 updatedComponentInstance.getUniqueId());
2650 if (resourceInstanceStatus.isRight()) {
2651 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse
2652 (resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId());
2654 return resourceInstanceStatus.left().value();
2656 } catch (ComponentException e) {
2660 unlockComponent(failed, containerComponent);
2664 private boolean isFillProxyRes(StorageOperationStatus fillProxyRes) {
2665 if (fillProxyRes != StorageOperationStatus.OK) {
2666 log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
2673 public List<ComponentInstanceProperty> getComponentInstancePropertiesById(String containerComponentTypeParam, String containerComponentId, String componentInstanceUniqueId, String userId) {
2674 Component containerComponent = null;
2676 boolean failed = false;
2678 validateUserExists(userId);
2679 validateComponentType(containerComponentTypeParam);
2681 Either<Component, StorageOperationStatus> validateContainerComponentExists = toscaOperationFacade.getToscaElement(containerComponentId);
2682 if (validateContainerComponentExists.isRight()) {
2683 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value()));
2685 containerComponent = validateContainerComponentExists.left().value();
2687 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
2688 if (resourceInstanceStatus.isRight()) {
2689 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId);
2692 List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(componentInstanceUniqueId);
2693 if (CollectionUtils.isEmpty(instanceProperties)) {
2694 instanceProperties = new ArrayList<>();
2696 return instanceProperties;
2697 }catch (ComponentException e){
2701 unlockComponent(failed, containerComponent);
2705 protected void validateIncrementCounter(String resourceInstanceId, GraphPropertiesDictionary counterType, Wrapper<Integer> instaceCounterWrapper, Wrapper<ResponseFormat> errorWrapper) {
2706 Either<Integer, StorageOperationStatus> counterRes = componentInstanceOperation.increaseAndGetResourceInstanceSpecificCounter(resourceInstanceId, counterType, true);
2708 if (counterRes.isRight()) {
2709 log.debug("increase And Get {} failed resource instance {}", counterType, resourceInstanceId);
2710 StorageOperationStatus status = counterRes.right().value();
2711 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
2712 errorWrapper.setInnerElement(componentsUtils.getResponseFormat(actionStatus));
2714 instaceCounterWrapper.setInnerElement(counterRes.left().value());
2720 * updates componentInstance modificationTime
2722 * @param componentInstance
2723 * @param componentInstanceType
2724 * @param modificationTime
2725 * @param inTransaction
2728 public Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceModificationTimeAndCustomizationUuid(ComponentInstance componentInstance, NodeTypeEnum componentInstanceType, Long modificationTime, boolean inTransaction) {
2729 Either<ComponentInstanceData, ResponseFormat> result;
2730 Either<ComponentInstanceData, StorageOperationStatus> updateComponentInstanceRes = componentInstanceOperation.updateComponentInstanceModificationTimeAndCustomizationUuidOnGraph(componentInstance, componentInstanceType, modificationTime,
2732 if (updateComponentInstanceRes.isRight()) {
2733 log.debug("Failed to update component instance {} with new last update date and mofifier. Status is {}. ", componentInstance.getName(), updateComponentInstanceRes.right().value());
2734 result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateComponentInstanceRes.right().value())));
2736 result = Either.left(updateComponentInstanceRes.left().value());
2741 public Either<ComponentInstance, ResponseFormat> deleteServiceProxy() {
2742 // TODO Add implementation
2743 return Either.left(new ComponentInstance());
2746 public Either<ComponentInstance, ResponseFormat> createServiceProxy() {
2747 // TODO Add implementation
2748 return Either.left(new ComponentInstance());
2751 public Either<ComponentInstance, ResponseFormat> changeServiceProxyVersion() {
2752 // TODO Add implementation
2753 return Either.left(new ComponentInstance());
2756 private Boolean validateInstanceNameUniquenessUponUpdate(Component containerComponent, ComponentInstance oldComponentInstance, String newInstanceName) {
2757 return ComponentValidations.validateNameIsUniqueInComponent(oldComponentInstance.getName(), newInstanceName, containerComponent);
2760 private Either<ComponentInstance, StorageOperationStatus> getResourceInstanceById(Component containerComponent, String instanceId) {
2762 Either<ComponentInstance, StorageOperationStatus> result = null;
2763 List<ComponentInstance> instances = containerComponent.getComponentInstances();
2764 Optional<ComponentInstance> foundInstance = null;
2765 if (CollectionUtils.isEmpty(instances)) {
2766 result = Either.right(StorageOperationStatus.NOT_FOUND);
2768 if (result == null) {
2769 foundInstance = instances.stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
2770 if (!foundInstance.isPresent()) {
2771 result = Either.right(StorageOperationStatus.NOT_FOUND);
2774 if (result == null) {
2775 result = Either.left(foundInstance.get());
2780 private ComponentInstance buildComponentInstance(ComponentInstance resourceInstanceForUpdate, ComponentInstance origInstanceForUpdate) {
2782 Long creationDate = origInstanceForUpdate.getCreationTime();
2784 Long modificationTime = System.currentTimeMillis();
2785 resourceInstanceForUpdate.setCreationTime(creationDate);
2786 resourceInstanceForUpdate.setModificationTime(modificationTime);
2788 resourceInstanceForUpdate.setCustomizationUUID(origInstanceForUpdate.getCustomizationUUID());
2790 if (StringUtils.isEmpty(resourceInstanceForUpdate.getName()) && StringUtils.isNotEmpty(origInstanceForUpdate.getName())) {
2791 resourceInstanceForUpdate.setName(origInstanceForUpdate.getName());
2794 resourceInstanceForUpdate.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(resourceInstanceForUpdate.getName()));
2796 if (StringUtils.isEmpty(resourceInstanceForUpdate.getIcon()))
2797 resourceInstanceForUpdate.setIcon(origInstanceForUpdate.getIcon());
2799 if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentVersion()))
2800 resourceInstanceForUpdate.setComponentVersion(origInstanceForUpdate.getComponentVersion());
2802 if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentName()))
2803 resourceInstanceForUpdate.setComponentName(origInstanceForUpdate.getComponentName());
2805 if (StringUtils.isEmpty(resourceInstanceForUpdate.getToscaComponentName()))
2806 resourceInstanceForUpdate.setToscaComponentName(origInstanceForUpdate.getToscaComponentName());
2808 if (resourceInstanceForUpdate.getOriginType() == null) {
2809 resourceInstanceForUpdate.setOriginType(origInstanceForUpdate.getOriginType());
2811 if(resourceInstanceForUpdate.getOriginType() == OriginTypeEnum.ServiceProxy)
2812 resourceInstanceForUpdate.setIsProxy(true);
2813 if (resourceInstanceForUpdate.getSourceModelInvariant() == null) {
2814 resourceInstanceForUpdate.setSourceModelInvariant(origInstanceForUpdate.getSourceModelInvariant());
2816 if (resourceInstanceForUpdate.getSourceModelName() == null) {
2817 resourceInstanceForUpdate.setSourceModelName(origInstanceForUpdate.getSourceModelName());
2819 if (resourceInstanceForUpdate.getSourceModelUuid() == null) {
2820 resourceInstanceForUpdate.setSourceModelUuid(origInstanceForUpdate.getSourceModelUuid());
2822 if (resourceInstanceForUpdate.getSourceModelUid() == null) {
2823 resourceInstanceForUpdate.setSourceModelUid(origInstanceForUpdate.getSourceModelUid());
2825 if (resourceInstanceForUpdate.getCreatedFrom() == null) {
2826 resourceInstanceForUpdate.setCreatedFrom(origInstanceForUpdate.getCreatedFrom());
2828 return resourceInstanceForUpdate;
2831 * Returns list of ComponentInstanceProperty belonging to component instance capability specified by name, type and ownerId
2832 * @param containerComponentType
2833 * @param containerComponentId
2834 * @param componentInstanceUniqueId
2835 * @param capabilityType
2836 * @param capabilityName
2841 public List<ComponentInstanceProperty> getComponentInstanceCapabilityPropertiesById(String containerComponentType, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId, String userId) {
2843 Component containerComponent = null;
2845 List<ComponentInstanceProperty> resultOp = null;
2847 validateUserExists(userId);
2848 validateComponentType(containerComponentType);
2849 containerComponent = toscaOperationFacade.getToscaFullElement(containerComponentId).left().on(this::componentException);
2850 ComponentInstance resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId).left().on(this::componentInstanceException);
2851 resultOp = findCapabilityOfInstance(containerComponentId, componentInstanceUniqueId, capabilityType, capabilityName, ownerId, resourceInstanceStatus.getCapabilities());
2852 } catch(StorageException e){
2853 unlockRollbackWithException(containerComponent, e);
2854 } catch (ComponentException e) {
2855 unlockRollbackWithException(containerComponent, e);
2856 } catch (Exception e){
2857 unlockRollbackWithException(containerComponent, new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR));
2859 unlockWithCommit(containerComponent);
2863 private List<ComponentInstanceProperty> findCapabilityOfInstance( String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId, Map<String, List<CapabilityDefinition>> instanceCapabilities) {
2864 CapabilityDefinition foundCapability;
2865 if (MapUtils.isNotEmpty(instanceCapabilities)) {
2866 List<CapabilityDefinition> capabilitiesPerType = instanceCapabilities.get(capabilityType);
2867 if (capabilitiesPerType != null) {
2868 Optional<CapabilityDefinition> capabilityOpt = capabilitiesPerType.stream().filter(c -> c.getName().equals(capabilityName) && c.getOwnerId().equals(ownerId)).findFirst();
2869 if (capabilityOpt.isPresent()) {
2870 foundCapability = capabilityOpt.get();
2871 return foundCapability.getProperties() == null ? new ArrayList<>() : foundCapability.getProperties();
2875 return fetchComponentInstanceCapabilityProperties(componentId, instanceId, capabilityType, capabilityName, ownerId);
2878 private List<ComponentInstanceProperty> fetchComponentInstanceCapabilityProperties(String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId) {
2880 return toscaOperationFacade.getComponentInstanceCapabilityProperties(componentId, instanceId, capabilityName, capabilityType, ownerId)
2882 .on(this::componentInstancePropertyListException);
2883 } catch(Exception e){
2884 log.debug("The exception {} occurred upon the component {} instance {} capability {} properties retrieving. ", componentId, instanceId, capabilityName, e);
2885 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
2889 public Either<RequirementDefinition, ResponseFormat> updateInstanceRequirement(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName,
2890 RequirementDefinition requirementDef, String userId) {
2892 Either<RequirementDefinition, ResponseFormat> resultOp = null;
2894 validateUserExists(userId);
2895 if (componentTypeEnum == null) {
2896 BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceRequirement", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2897 return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2899 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
2901 if (getResourceResult.isRight()) {
2902 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
2903 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2905 Component containerComponent = getResourceResult.left().value();
2907 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
2908 log.info("Restricted operation for user: {} on component {}", userId, containerComponentId);
2909 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2911 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
2912 if (resourceInstanceStatus.isRight()) {
2913 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
2916 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
2917 if (lockStatus != StorageOperationStatus.OK) {
2918 log.debug("Failed to lock component {}", containerComponentId);
2919 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2923 StorageOperationStatus updateRequirementStatus = toscaOperationFacade.updateComponentInstanceRequirement(containerComponentId, componentInstanceUniqueId, requirementDef);
2924 if (updateRequirementStatus != StorageOperationStatus.OK) {
2925 log.debug("Failed to update component instance requirement on instance {} in container {}", componentInstanceUniqueId, containerComponentId);
2926 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateRequirementStatus)));
2928 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
2930 if (updateContainerRes.isRight()) {
2931 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
2932 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2935 resultOp = Either.left(requirementDef);
2939 if (resultOp == null || resultOp.isRight()) {
2940 janusGraphDao.rollback();
2942 janusGraphDao.commit();
2945 graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
2949 public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName,
2950 List<ComponentInstanceProperty> properties, String userId) {
2951 Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
2953 validateUserExists(userId);
2954 if (componentTypeEnum == null) {
2955 BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
2956 return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
2958 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
2960 if (getResourceResult.isRight()) {
2961 log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
2962 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2964 Component containerComponent = getResourceResult.left().value();
2966 if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
2967 log.info("Restricted operation for user: {} on component {}", userId, containerComponentId);
2968 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2970 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
2971 if (resourceInstanceStatus.isRight()) {
2972 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
2974 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
2976 StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
2977 if (lockStatus != StorageOperationStatus.OK) {
2978 log.debug("Failed to lock component {}", containerComponentId);
2979 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
2983 for (ComponentInstanceProperty property : properties) {
2984 Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, property.getValue(), false);
2985 newPropertyValueEither.bimap(updatedValue ->
2986 updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName),
2989 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
2991 if (updateContainerRes.isRight()) {
2992 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
2993 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
2996 resultOp = Either.left(properties);
3000 if (resultOp == null || resultOp.isRight()) {
3001 janusGraphDao.rollback();
3003 janusGraphDao.commit();
3006 graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
3010 public Either<Map<String, ComponentInstance>, ResponseFormat> copyComponentInstance(ComponentInstance inputComponentInstance,
3011 String containerComponentId,
3012 String componentInstanceId,
3015 Map<String, ComponentInstance> resultMap = new HashMap<>();
3016 Either<Component, StorageOperationStatus> getOrigComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3017 if (getOrigComponent.isRight()) {
3018 log.error("Failed to get the original component information");
3019 return Either.right(componentsUtils.getResponseFormat(
3020 ActionStatus.USER_DEFINED, FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS));
3023 Component origComponent = getOrigComponent.left().value();
3026 lockComponent(origComponent, "copyComponentInstance");
3028 } catch (ComponentException e) {
3029 log.error("destComponentInstance's data is {}", origComponent.toString());
3030 return Either.right(componentsUtils.getResponseFormat(
3031 ActionStatus.USER_DEFINED, "Failed to lock component destComponentInstance's data is {}", origComponent.toString()));
3034 boolean failed = false;
3035 ComponentInstance actionResponse = null;
3038 actionResponse = createComponentInstance(
3039 "services", containerComponentId, userId, inputComponentInstance, false);
3041 } catch (ComponentException e) {
3046 // on failure of the create instance unlock the resource and rollback the transaction.
3047 if (null == actionResponse || failed) {
3048 janusGraphDao.rollback();
3049 log.error("Failed to copy the component instance to the canvas");
3051 unlockComponent(failed, origComponent);
3053 return Either.right(componentsUtils.getResponseFormat(
3054 ActionStatus.USER_DEFINED, "Failed to copy the component instance to the canvas"));
3058 Either<String, ResponseFormat> resultOp = null;
3061 ComponentInstance destComponentInstance = actionResponse;
3062 log.debug("destComponentInstance's data is {}", destComponentInstance.toString());
3065 resultOp = deepCopyComponentInstance(
3066 origComponent, containerComponentId, componentInstanceId, destComponentInstance, userId);
3068 resultMap.put("componentInstance", destComponentInstance);
3072 if (resultOp == null || resultOp.isRight()) {
3073 unlockComponent(true, origComponent);
3074 janusGraphDao.rollback();
3075 log.error("Failed to deep copy component instance");
3076 return Either.right(componentsUtils.getResponseFormat(
3077 ActionStatus.USER_DEFINED, "Failed to deep copy the component instance to the canvas"));
3079 unlockComponent(false, origComponent);
3080 janusGraphDao.commit();
3081 log.debug("Success trasaction commit");
3085 return Either.left(resultMap);
3088 private Either<String, ResponseFormat> deepCopyComponentInstance(
3089 Component sourceComponent, String containerComponentId, String sourceComponentInstanceId,
3090 ComponentInstance destComponentInstance, String userId) {
3092 Either<Component, StorageOperationStatus> getDestComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3093 if (getDestComponent.isRight()) {
3094 log.error("Failed to get the dest component information");
3095 return Either.right(componentsUtils.getResponseFormat(
3096 ActionStatus.USER_DEFINED, "Failed to copy the component instance to the canvas"));
3099 Component destComponent = getDestComponent.left().value();
3101 Either<String, ResponseFormat> copyComponentInstanceWithPropertiesAndInputs = copyComponentInstanceWithPropertiesAndInputs(
3102 sourceComponent, destComponent, sourceComponentInstanceId, destComponentInstance, userId);
3103 if (copyComponentInstanceWithPropertiesAndInputs.isRight()) {
3104 log.error("Failed to copy component instance with properties and inputs as part of deep copy");
3105 return Either.right(componentsUtils.getResponseFormat(
3106 ActionStatus.USER_DEFINED, "Failed to copy the component instance with properties and inputs as part of deep copy"));
3109 Either<String, ResponseFormat> copyComponentInstanceWithAttributes = copyComponentInstanceWithAttributes(
3110 sourceComponent, destComponent, sourceComponentInstanceId, destComponentInstance, userId);
3111 if (copyComponentInstanceWithAttributes.isRight()) {
3112 log.error("Failed to copy component instance with attributes as part of deep copy");
3113 return Either.right(componentsUtils.getResponseFormat(
3114 ActionStatus.USER_DEFINED, "Failed to copy the component instance with attributes as part of deep copy"));
3116 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3119 private Either<String, ResponseFormat> copyComponentInstanceWithPropertiesAndInputs(
3120 Component sourceComponent, Component destComponent, String sourceComponentInstanceId,
3121 ComponentInstance destComponentInstance, String userId) {
3122 log.debug("start to copy ComponentInstance with properties and inputs");
3124 List<ComponentInstanceProperty> sourcePropList = null;
3125 if (sourceComponent.getComponentInstancesProperties() != null
3126 && sourceComponent.getComponentInstancesProperties().get(sourceComponentInstanceId) != null) {
3127 sourcePropList = sourceComponent.getComponentInstancesProperties().get(sourceComponentInstanceId);
3128 log.debug("sourcePropList");
3131 List<ComponentInstanceProperty> destPropList = null;
3132 String destComponentInstanceId = destComponentInstance.getUniqueId();
3133 log.debug("destComponentInstanceId: {}", destComponentInstance.getUniqueId());
3134 if (destComponent.getComponentInstancesProperties() != null
3135 && destComponent.getComponentInstancesProperties().get(destComponentInstanceId) != null) {
3136 destPropList = destComponent.getComponentInstancesProperties().get(destComponentInstanceId);
3137 log.debug("destPropList {}");
3140 List<ComponentInstancePropInput> componentInstancePropInputList = new ArrayList<>();
3142 if (null != destPropList && null != sourcePropList) {
3143 log.debug("start to set property and attribute");
3144 for (ComponentInstanceProperty destProp : destPropList) {
3145 String destPropertyName = destProp.getName();
3146 for (ComponentInstanceProperty sourceProp : sourcePropList) {
3147 if (!destPropertyName.equals(sourceProp.getName())) {
3150 log.debug("now set property");
3151 if (sourceProp.getGetInputValues() == null && !StringUtils.isEmpty(sourceProp.getValue())
3152 && (destProp.getValue() == null || !destProp.getValue().equals(sourceProp.getValue()))) {
3153 log.debug("Now starting to copy the property {} in value {}", destPropertyName, sourceProp.getValue());
3155 destProp.setValue(sourceProp.getValue());
3156 Either<String, ResponseFormat> updatePropertyValueEither = updateComponentInstanceProperty(
3157 destComponent.getUniqueId(), destComponentInstanceId, destProp);
3158 if (updatePropertyValueEither.isRight()) {
3159 log.error("Failed to copy the property {}", destPropertyName);
3160 return Either.right(componentsUtils.getResponseFormat(
3161 ActionStatus.INVALID_CONTENT_PARAM, "Failed to paste component instance to the canvas, property copy"));
3166 log.debug("Now start to update inputs");
3168 if (sourceProp.getGetInputValues() != null) {
3169 if (sourceProp.getGetInputValues().size() < 1) {
3170 log.debug("property is return from input, set by man");
3173 log.debug("Now starting to copy the {} property", destPropertyName);
3175 Either<String, ResponseFormat> getSourceInputDefaultValue = getInputListDefaultValue(
3176 sourceComponent, sourceProp.getGetInputValues().get(0).getInputId());
3177 if (getSourceInputDefaultValue.isRight()) {
3178 return Either.right(getSourceInputDefaultValue.right().value());
3180 componentInstancePropInputList.add(new ComponentInstancePropInput(destProp));
3185 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3188 private Either<String, ResponseFormat> copyComponentInstanceWithAttributes(Component sourceComponent,
3189 Component destComponent,
3190 String sourceComponentInstanceId,
3191 ComponentInstance destComponentInstance,
3193 String destComponentInstanceId = destComponentInstance.getUniqueId();
3195 log.info("start to copy component instance with attributes");
3197 List<ComponentInstanceAttribute> sourceAttributeList = null;
3198 if (sourceComponent.getComponentInstancesAttributes() != null
3199 && sourceComponent.getComponentInstancesAttributes().get(sourceComponentInstanceId) != null) {
3200 sourceAttributeList = sourceComponent.getComponentInstancesAttributes().get(sourceComponentInstanceId);
3201 log.info("sourceAttributes {}");
3204 List<ComponentInstanceAttribute> destAttributeList = null;
3205 if (destComponent.getComponentInstancesAttributes() != null
3206 && destComponent.getComponentInstancesAttributes().get(destComponentInstanceId) != null) {
3207 destAttributeList = destComponent.getComponentInstancesAttributes().get(destComponentInstanceId);
3208 log.info("destAttributeList {}");
3210 if (null != sourceAttributeList && null != destAttributeList) {
3211 log.info("set attribute");
3213 for (ComponentInstanceAttribute sourceAttribute : sourceAttributeList) {
3214 String sourceAttributeName = sourceAttribute.getName();
3215 for (ComponentInstanceAttribute destAttribute : destAttributeList) {
3216 if (sourceAttributeName.equals(destAttribute.getName())) {
3217 // if (sourceAttribute.getValue() != null && !sourceAttribute.getValue().isEmpty()) {
3218 log.debug("Start to copy the attribute exists {}", sourceAttributeName);
3220 sourceAttribute.setUniqueId(
3221 UniqueIdBuilder.buildResourceInstanceUniuqeId(
3222 "attribute" , destComponentInstanceId.split("\\.")[1] , sourceAttributeName));
3224 Either<ComponentInstanceAttribute, ResponseFormat> updateAttributeValueEither =
3225 createOrUpdateAttributeValueForCopyPaste(ComponentTypeEnum.SERVICE,
3226 destComponent.getUniqueId(), destComponentInstanceId, sourceAttribute,
3228 if (updateAttributeValueEither.isRight()) {
3229 log.error("Failed to copy the attribute");
3230 return Either.right(componentsUtils
3231 .getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM,
3232 "Failed to paste component instance to the canvas, attribute copy"));
3241 return Either.left(COPY_COMPONENT_INSTANCE_OK);
3244 private Either<ComponentInstanceAttribute, ResponseFormat> createOrUpdateAttributeValueForCopyPaste(ComponentTypeEnum componentTypeEnum,
3246 String resourceInstanceId,
3247 ComponentInstanceAttribute attribute,
3250 Either<ComponentInstanceAttribute, ResponseFormat> resultOp = null;
3252 validateUserExists(userId);
3254 if (componentTypeEnum == null) {
3255 BeEcompErrorManager.getInstance().logInvalidInputError(
3256 "createOrUpdateAttributeValue", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
3257 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
3261 Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
3263 if (getResourceResult.isRight()) {
3264 log.info("Failed to retrieve component id {}", componentId);
3265 resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
3269 Component containerComponent = getResourceResult.left().value();
3271 Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
3273 if (resourceInstanceStatus.isRight()) {
3274 resultOp = Either.right(componentsUtils.getResponseFormat(
3275 ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, resourceInstanceId, componentId));
3279 ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
3282 String propertyType = attribute.getType();
3283 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
3284 log.info("The type of attribute id{},is {} ", attribute.getUniqueId(), propertyType);
3286 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
3287 SchemaDefinition def = attribute.getSchema();
3289 log.info("Schema doesn't exists for attribute of type {}", type);
3290 return Either.right(componentsUtils.getResponseFormat(
3291 componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
3293 PropertyDataDefinition propDef = def.getProperty();
3294 if (propDef == null) {
3295 log.info("Attribute in Schema Definition inside attribute of type {} doesn't exist", type);
3296 return Either.right(componentsUtils.getResponseFormat(
3297 componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
3301 List<ComponentInstanceAttribute> instanceAttributes = containerComponent.getComponentInstancesAttributes().get(resourceInstanceId);
3302 Optional<ComponentInstanceAttribute> instanceAttribute = instanceAttributes.stream().filter(p -> p.getUniqueId().equals(attribute.getUniqueId())).findAny();
3303 StorageOperationStatus status;
3305 if (instanceAttribute.isPresent()) {
3306 log.info("updateComponentInstanceAttribute");
3307 status = toscaOperationFacade.updateComponentInstanceAttribute(containerComponent, foundResourceInstance.getUniqueId(), attribute);
3309 log.info("addComponentInstanceAttribute");
3310 status = toscaOperationFacade.addComponentInstanceAttribute(containerComponent, foundResourceInstance.getUniqueId(), attribute);
3312 if (status != StorageOperationStatus.OK) {
3313 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
3314 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3317 List<String> path = new ArrayList<>();
3318 path.add(foundResourceInstance.getUniqueId());
3319 attribute.setPath(path);
3321 foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
3322 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.
3323 updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3325 if (updateContainerRes.isRight()) {
3326 ActionStatus actionStatus = componentsUtils.
3327 convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3328 resultOp = Either.right(componentsUtils.
3329 getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3332 resultOp = Either.left(attribute);
3336 private Either<String, ResponseFormat> updateComponentInstanceProperty(String containerComponentId,
3337 String componentInstanceId,
3338 ComponentInstanceProperty property) {
3339 Either<String, ResponseFormat> resultOp;
3340 Either<Component, StorageOperationStatus> getComponent = toscaOperationFacade.getToscaElement(containerComponentId);
3342 if (getComponent.isRight()) {
3343 log.error("Failed to get the component information");
3344 return Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(
3345 ActionStatus.INVALID_CONTENT_PARAM, "Failed to get the component information"));
3348 Component containerComponent = getComponent.left().value();
3350 StorageOperationStatus status = toscaOperationFacade.updateComponentInstanceProperty(
3351 containerComponent, componentInstanceId, property);
3352 if (status != StorageOperationStatus.OK) {
3353 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
3354 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3358 Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.
3359 updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
3361 if (updateContainerRes.isRight()) {
3362 ActionStatus actionStatus = componentsUtils.
3363 convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
3364 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
3368 return Either.left("Update OK");
3371 private Either<String, ResponseFormat> getInputListDefaultValue(Component component, String inputId) {
3372 List<InputDefinition> inputList = component.getInputs();
3373 for (InputDefinition input : inputList) {
3374 if (input.getUniqueId().equals(inputId)) {
3375 if (input.getDefaultValue() == null) {
3376 log.debug("The input's default value is null");
3377 return Either.left(null);
3379 return Either.left(input.getDefaultValue());
3382 log.error("The input's default value with id {} is not found", inputId);
3383 return Either.right(componentsUtils.getResponseFormat(
3384 ActionStatus.USER_DEFINED, "Failed to paste component instance to the canvas"));
3388 * Method to delete selected nodes and edges on composition page
3389 * @param containerComponentType
3390 * @param componentId
3391 * @param componentInstanceIdList
3395 public Map<String, List<String>> batchDeleteComponentInstance(String containerComponentType,
3397 List<String> componentInstanceIdList,
3400 List<String> deleteErrorIds = new ArrayList<>();
3401 Map<String, List<String>> deleteErrorMap = new HashMap<>();
3402 validateUserExists(userId);
3403 org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, ComponentTypeEnum.findByParamName(containerComponentType), null);
3405 boolean failed = false;
3407 lockComponent(containerComponent, "batchDeleteComponentInstance");
3408 for (String eachInstanceId : componentInstanceIdList) {
3409 Either<ComponentInstance, ResponseFormat> actionResponse = batchDeleteComponentInstance(
3410 containerComponent, containerComponentType, componentId, eachInstanceId);
3411 log.debug("batchDeleteResourceInstances actionResponse is {}", actionResponse);
3412 if (actionResponse.isRight()) {
3413 log.error("Failed to delete ComponentInstance [{}]", eachInstanceId);
3414 deleteErrorIds.add(eachInstanceId);
3417 //sending the ids of the error nodes that were not deleted to UI
3418 deleteErrorMap.put("deleteFailedIds", deleteErrorIds);
3419 return deleteErrorMap;
3420 }catch (ComponentException e){
3424 unlockComponent(failed, containerComponent);
3428 private Either<ComponentInstance, ResponseFormat> batchDeleteComponentInstance(Component containerComponent,
3429 String containerComponentType,
3430 String containerComponentId,
3431 String componentInstanceId) {
3433 ComponentInstance resultOp;
3434 final ComponentTypeEnum containerComponentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
3436 boolean failed = false;
3438 resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentTypeEnum);
3439 log.info("Successfully deleted instance with id {}", componentInstanceId);
3440 return Either.left(resultOp);
3442 catch (ComponentException e){
3443 log.error("Failed to deleteComponentInstance with instanceId[{}]", componentInstanceId);
3444 return Either.right(new ResponseFormat());
3448 public void validateUser(final String userId) {
3449 final User user = userValidations.validateUserExists(userId);
3450 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));