aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java972
1 files changed, 725 insertions, 247 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
index 66d8668fea..b86b28a6c5 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
@@ -21,6 +21,8 @@
package org.openecomp.sdc.be.components.impl;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -32,23 +34,28 @@ import java.util.UUID;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.merge.instance.ComponentInstanceMergeDataBusinessLogic;
+import org.openecomp.sdc.be.components.merge.instance.DataForMergeHolder;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
-import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.CapabilityDefinition;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.ComponentInstanceInput;
@@ -59,7 +66,10 @@ import org.openecomp.sdc.be.model.GroupDefinition;
import org.openecomp.sdc.be.model.InputDefinition;
import org.openecomp.sdc.be.model.LifecycleStateEnum;
import org.openecomp.sdc.be.model.PropertyDefinition.PropertyNames;
+import org.openecomp.sdc.be.model.RelationshipInfo;
import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+import org.openecomp.sdc.be.model.RequirementDefinition;
+import org.openecomp.sdc.be.model.Resource;
import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
@@ -95,7 +105,10 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
private ArtifactsBusinessLogic artifactBusinessLogic;
@Autowired
private ApplicationDataTypeCache dataTypeCache;
-
+
+ @Autowired
+ private ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
+
public static final String VF_MODULE = "org.openecomp.groups.VfModule";
public ComponentInstanceBusinessLogic() {
@@ -112,8 +125,8 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
User user = null;
org.openecomp.sdc.be.model.Component containerComponent = null;
ComponentTypeEnum containerComponentType;
-
- try{
+
+ try {
Either<User, ResponseFormat> resp = validateUserExists(userId, "create Component Instance", inTransaction);
if (resp.isRight()) {
return Either.right(resp.right().value());
@@ -125,37 +138,56 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
if (validateValidJson.isRight()) {
return Either.right(validateValidJson.right().value());
}
-
+
Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
if (validateComponentType.isRight()) {
return Either.right(validateComponentType.right().value());
} else {
containerComponentType = validateComponentType.left().value();
}
-
+
Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, null);
if (validateComponentExists.isRight()) {
return Either.right(validateComponentExists.right().value());
} else {
containerComponent = validateComponentExists.left().value();
}
-
+
if (ModelConverter.isAtomicComponent(containerComponent)) {
log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType()));
}
-
+
Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
if (validateCanWorkOnComponent.isRight()) {
return Either.right(validateCanWorkOnComponent.right().value());
}
-
+
if (resourceInstance != null && containerComponentType != null) {
- Either<Component, ResponseFormat> getOriginComponentRes = getAndValidateOriginComponentOfComponentInstance(containerComponentType, resourceInstance);
- if (getOriginComponentRes.isRight()) {
- return Either.right(getOriginComponentRes.right().value());
+ OriginTypeEnum originType = resourceInstance.getOriginType();
+ if (originType == OriginTypeEnum.ServiceProxy) {
+ Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
+ if (serviceProxyOrigin.isRight()) {
+ log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value())));
+ }
+ origComponent = serviceProxyOrigin.left().value();
+
+ StorageOperationStatus fillProxyRes = fillProxyInstanceData(resourceInstance, origComponent);
+ if (fillProxyRes != StorageOperationStatus.OK) {
+ log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(fillProxyRes)));
+
+ }
+
} else {
- origComponent = getOriginComponentRes.left().value();
+ Either<Component, ResponseFormat> getOriginComponentRes = getAndValidateOriginComponentOfComponentInstance(containerComponentType, resourceInstance);
+
+ if (getOriginComponentRes.isRight()) {
+ return Either.right(getOriginComponentRes.right().value());
+ } else {
+ origComponent = getOriginComponentRes.left().value();
+ }
}
}
if (needLock) {
@@ -174,6 +206,43 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
}
+ private StorageOperationStatus fillProxyInstanceData(ComponentInstance resourceInstance, Component proxyTemplate) {
+ resourceInstance.setIsProxy(true);
+ ComponentParametersView filter = new ComponentParametersView(true);
+ filter.setIgnoreCapabilities(false);
+ filter.setIgnoreCapabiltyProperties(false);
+ filter.setIgnoreComponentInstances(false);
+ filter.setIgnoreRequirements(false);
+ Either<Component, StorageOperationStatus> serviceRes = toscaOperationFacade.getToscaElement(resourceInstance.getComponentUid(), filter);
+ if (serviceRes.isRight()) {
+ return serviceRes.right().value();
+ }
+ Component service = serviceRes.left().value();
+ Map<String, List<CapabilityDefinition>> capabilities = service.getCapabilities();
+ resourceInstance.setCapabilities(capabilities);
+ Map<String, List<RequirementDefinition>> req = service.getRequirements();
+ resourceInstance.setRequirements(req);
+
+ String name = service.getNormalizedName() + ToscaOperationFacade.PROXY_SUFFIX;
+ String toscaResourceName = ((Resource) proxyTemplate).getToscaResourceName();
+ int lastIndexOf = toscaResourceName.lastIndexOf('.');
+ if (lastIndexOf != -1) {
+ String proxyToscaName = toscaResourceName.substring(0, lastIndexOf + 1) + name;
+ resourceInstance.setToscaComponentName(proxyToscaName);
+ }
+ resourceInstance.setName(name);
+ resourceInstance.setIsProxy(true);
+ resourceInstance.setSourceModelInvariant(service.getInvariantUUID());
+ resourceInstance.setSourceModelName(service.getName());
+ resourceInstance.setSourceModelUuid(service.getUUID());
+ resourceInstance.setSourceModelUid(service.getUniqueId());
+ resourceInstance.setComponentUid(proxyTemplate.getUniqueId());
+ resourceInstance.setDescription("A Proxy for Service " + service.getName());
+ resourceInstance.setComponentVersion(service.getVersion());
+
+ return StorageOperationStatus.OK;
+ }
+
public Either<CreateAndAssotiateInfo, ResponseFormat> createAndAssociateRIToRI(String containerComponentParam, String containerComponentId, String userId, CreateAndAssotiateInfo createAndAssotiateInfo) {
Either<CreateAndAssotiateInfo, ResponseFormat> resultOp = null;
@@ -216,7 +285,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
try {
log.debug("Try to create entry on graph");
- Either<Component, ResponseFormat> eitherResourceName = getOriginComponentNameFromComponentInstance(resourceInstance, true);
+ Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(resourceInstance, true);
if (eitherResourceName.isRight()) {
resultOp = Either.right(eitherResourceName.right().value());
@@ -260,7 +329,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
}
- private Either<Component, ResponseFormat> getOriginComponentNameFromComponentInstance(ComponentInstance componentInstance, boolean inTransaction) {
+ private Either<Component, ResponseFormat> getOriginComponentFromComponentInstance(ComponentInstance componentInstance, boolean inTransaction) {
Either<Component, ResponseFormat> eitherResponse;
Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaFullElement(componentInstance.getComponentUid());
if (eitherComponent.isRight()) {
@@ -286,7 +355,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
log.debug("Entity on graph is created.");
Component updatedComponent = result.left().value().getLeft();
Map<String, String> existingEnvVersions = new HashMap<>();
- //TODO existingEnvVersions ??
+ // TODO existingEnvVersions ??
Either<ActionStatus, ResponseFormat> addComponentInstanceArtifacts = addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
if (addComponentInstanceArtifacts.isRight()) {
log.debug("Failed to create component instance {}", componentInstance.getName());
@@ -304,19 +373,17 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return resultOp;
}
- /**
- * addResourceInstanceArtifacts - add artifacts (HEAT_ENV) to resource instance The instance artifacts are generated from the resource's artifacts
- *
- * @param componentInstance
- * @param userId
- * @param existingEnvVersions
- * TODO
- * @param containerComponentId
- *
- * @return
- */
- protected Either<ActionStatus, ResponseFormat> addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance, org.openecomp.sdc.be.model.Component originComponent, User user,
- Map<String, String> existingEnvVersions) {
+/**
+ * addResourceInstanceArtifacts - add artifacts (HEAT_ENV) to resource instance The instance artifacts are generated from the resource's artifacts
+ * @param containerComponent
+ * @param componentInstance
+ * @param originComponent
+ * @param user
+ * @param existingEnvVersions
+ * @return
+ */
+ protected Either<ActionStatus, ResponseFormat> addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance, org.openecomp.sdc.be.model.Component originComponent, User user, Map<String, String> existingEnvVersions) {
+
log.debug("add artifacts to resource instance");
List<GroupDefinition> filteredGroups = null;
ActionStatus status = setResourceArtifactsOnResourceInstance(componentInstance);
@@ -324,80 +391,72 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
ResponseFormat resultOp = componentsUtils.getResponseFormatForResourceInstance(status, "", null);
return Either.right(resultOp);
}
-
+ StorageOperationStatus artStatus;
// generate heat_env if necessary
Map<String, ArtifactDefinition> componentDeploymentArtifacts = componentInstance.getDeploymentArtifacts();
- if (componentDeploymentArtifacts == null) {
- return Either.left(ActionStatus.OK);
- }
- Map<String, ArtifactDefinition> finalDeploymentArtifacts = new HashMap<String, ArtifactDefinition>();
-
- Map<String, List<ArtifactDefinition>> groupInstancesArtifacts = new HashMap<>();
-
- for (ArtifactDefinition artifact : componentDeploymentArtifacts.values()) {
- String type = artifact.getArtifactType();
+ if (MapUtils.isNotEmpty(componentDeploymentArtifacts)) {
- if ( !type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType()) ){
- finalDeploymentArtifacts.put(artifact.getArtifactLabel(), artifact);
- }
-
- if (!(type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()))) {
- continue;
- }
+ Map<String, ArtifactDefinition> finalDeploymentArtifacts = new HashMap<String, ArtifactDefinition>();
+ Map<String, List<ArtifactDefinition>> groupInstancesArtifacts = new HashMap<>();
- if (artifact.checkEsIdExist()) {
- Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactBusinessLogic.createHeatEnvPlaceHolder(artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(), NodeTypeEnum.ResourceInstance,
- componentInstance.getName(), user, containerComponent, existingEnvVersions);
- if (createHeatEnvPlaceHolder.isRight()) {
- return Either.right(createHeatEnvPlaceHolder.right().value());
+ for (ArtifactDefinition artifact : componentDeploymentArtifacts.values()) {
+ String type = artifact.getArtifactType();
+ if (!type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())) {
+ finalDeploymentArtifacts.put(artifact.getArtifactLabel(), artifact);
}
- ArtifactDefinition artifactDefinition = createHeatEnvPlaceHolder.left().value();
-
- //put env
- finalDeploymentArtifacts.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
-
- if(CollectionUtils.isNotEmpty(originComponent.getGroups())){
- filteredGroups = originComponent.getGroups().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
+ if (!(type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()))) {
+ continue;
}
- if (CollectionUtils.isNotEmpty(filteredGroups)) {
- for (GroupDefinition groupInstance : filteredGroups) {
- Optional<String> op = groupInstance.getArtifacts().stream().filter(p -> p.equals(artifactDefinition.getGeneratedFromId())).findAny();
- if (op.isPresent()) {
- List<ArtifactDefinition> artifactsUid;
- if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
- artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
- } else {
- artifactsUid = new ArrayList<>();
+ if (artifact.checkEsIdExist()) {
+ Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactBusinessLogic.createHeatEnvPlaceHolder(artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(), NodeTypeEnum.ResourceInstance,
+ componentInstance.getName(), user, containerComponent, existingEnvVersions);
+ if (createHeatEnvPlaceHolder.isRight()) {
+ return Either.right(createHeatEnvPlaceHolder.right().value());
+ }
+ ArtifactDefinition artifactDefinition = createHeatEnvPlaceHolder.left().value();
+ // put env
+ finalDeploymentArtifacts.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
+
+ if (CollectionUtils.isNotEmpty(originComponent.getGroups())) {
+ filteredGroups = originComponent.getGroups().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
+ }
+ if (CollectionUtils.isNotEmpty(filteredGroups)) {
+ for (GroupDefinition groupInstance : filteredGroups) {
+ Optional<String> op = groupInstance.getArtifacts().stream().filter(p -> p.equals(artifactDefinition.getGeneratedFromId())).findAny();
+ if (op.isPresent()) {
+ List<ArtifactDefinition> artifactsUid;
+ if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
+ artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
+ } else {
+ artifactsUid = new ArrayList<>();
+ }
+ artifactsUid.add(artifactDefinition);
+ groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
+ break;
}
- artifactsUid.add(artifactDefinition);
- groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
- break;
}
}
-
}
}
+ artStatus = toscaOperationFacade.addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, finalDeploymentArtifacts);
+ if (artStatus != StorageOperationStatus.OK) {
+ log.debug("Failed to add instance deployment artifacts for instance {} in conatiner {} error {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
+
+ }
+ StorageOperationStatus result = toscaOperationFacade.addGroupInstancesToComponentInstance(containerComponent, componentInstance, filteredGroups, groupInstancesArtifacts);
+ if (result != StorageOperationStatus.OK) {
+ log.debug("failed to update group instance for component instance {}", componentInstance.getUniqueId());
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
+ }
+ componentInstance.setDeploymentArtifacts(finalDeploymentArtifacts);
}
- StorageOperationStatus artStatus = toscaOperationFacade.addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, finalDeploymentArtifacts);
- if ( artStatus != StorageOperationStatus.OK){
- log.debug("Failed to add instance deployment artifacts for instance {} in conatiner {} error {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
-
- }
- StorageOperationStatus result = toscaOperationFacade
- .addGroupInstancesToComponentInstance(containerComponent, componentInstance, filteredGroups, groupInstancesArtifacts);
- if (result != StorageOperationStatus.OK) {
- log.debug("failed to update group instance for component instance {}", componentInstance.getUniqueId());
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
- }
- componentInstance.setDeploymentArtifacts(finalDeploymentArtifacts);
-
-
+
artStatus = toscaOperationFacade.addInformationalArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, originComponent.getArtifacts());
- if ( artStatus != StorageOperationStatus.OK){
+ if (artStatus != StorageOperationStatus.OK) {
log.debug("Failed to add informational artifacts to the instance {} belonging to the conatiner {}. Status is {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
-
+
}
componentInstance.setArtifacts(originComponent.getArtifacts());
return Either.left(ActionStatus.OK);
@@ -483,7 +542,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
try {
- Either<Component, ResponseFormat> eitherResourceName = getOriginComponentNameFromComponentInstance(componentInstance, inTransaction);
+ Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(componentInstance, inTransaction);
if (eitherResourceName.isRight()) {
resultOp = Either.right(eitherResourceName.right().value());
@@ -557,42 +616,40 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
List<ComponentInstance> updatedList = new ArrayList<>();
List<ComponentInstance> instancesFromContainerComponent = containerComponent.getComponentInstances();
List<ComponentInstance> listForUpdate = new ArrayList<>();
- if(instancesFromContainerComponent == null || instancesFromContainerComponent.isEmpty())
+ if (instancesFromContainerComponent == null || instancesFromContainerComponent.isEmpty())
containerComponent.setComponentInstances(componentInstanceList);
- else{
+ else {
Iterator<ComponentInstance> iterator = instancesFromContainerComponent.iterator();
- while(iterator.hasNext()){
+ while (iterator.hasNext()) {
ComponentInstance origInst = iterator.next();
Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getUniqueId().equals(origInst.getUniqueId())).findAny();
- if(op.isPresent()){
- ComponentInstance updatedCi = op.get();
+ if (op.isPresent()) {
+ ComponentInstance updatedCi = op.get();
updatedCi = buildComponentInstance(updatedCi, origInst);
-
+
Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, origInst, updatedCi.getName());
- if(!isUniqueName){
- 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());
+ if (!isUniqueName) {
+ 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());
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), origInst.getName()));
return resultOp;
}
-
+
listForUpdate.add(updatedCi);
- }
- else
+ } else
listForUpdate.add(origInst);
}
containerComponent.setComponentInstances(listForUpdate);
-
- if(resultOp == null){
- Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
- if(updateStatus.isRight()){
+
+ if (resultOp == null) {
+ Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, componentFilter);
+ if (updateStatus.isRight()) {
CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata belonging to container component {}. Status is {}. ", containerComponent.getName(), updateStatus.right().value());
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateStatus.right().value(), true), "", null));
return resultOp;
}
- for(ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()){
+ for (ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()) {
Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getName().equals(updatedInstance.getName())).findAny();
- if(op.isPresent()){
+ if (op.isPresent()) {
updatedList.add(updatedInstance);
}
}
@@ -640,8 +697,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
if (resultOp == null) {
oldComponentInstance = componentInstanceOptional.get();
String newInstanceName = componentInstance.getName();
- if ( oldComponentInstance!=null && oldComponentInstance.getName() != null
- && !oldComponentInstance.getName().equals( newInstanceName ) )
+ if (oldComponentInstance != null && oldComponentInstance.getName() != null && !oldComponentInstance.getName().equals(newInstanceName))
isNameChanged = true;
Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, oldComponentInstance, newInstanceName);
if (!isUniqueName) {
@@ -655,14 +711,14 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata of component instance {} belonging to container component {}. Status is {}. ", componentInstance.getName(), containerComponent.getName(),
updateRes.right().value());
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateRes.right().value(), true), "", null));
- }else{
- //region - Update instance Groups
- if ( isNameChanged ){
- Either result = toscaOperationFacade.cleanAndAddGroupInstancesToComponentInstance( containerComponent ,oldComponentInstance ,componentInstanceId );
- if ( result.isRight() )
- CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId ,result.right().value() );
+ } else {
+ // region - Update instance Groups
+ if (isNameChanged) {
+ Either result = toscaOperationFacade.cleanAndAddGroupInstancesToComponentInstance(containerComponent, oldComponentInstance, componentInstanceId);
+ if (result.isRight())
+ CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId, result.right().value());
}
- //endregion
+ // endregion
}
}
if (resultOp == null) {
@@ -672,24 +728,28 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
if (!updatedInstanceOptional.isPresent()) {
log.debug("Failed to update metadata of component instance {} of container component {}", componentInstance.getName(), containerComponent.getName());
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
- }else{
+ } else {
resultOp = Either.left(updatedInstanceOptional.get());
}
-
+
}
if (resultOp == null) {
resultOp = Either.left(componentInstanceOptional.get());
}
return resultOp;
}
+
/**
- * @param oldPrefix- The normalized old vf name
- * @param newNormailzedPrefix- The normalized new vf name
- * @param qualifiedGroupInstanceName- old Group Instance Name
+ * @param oldPrefix-
+ * The normalized old vf name
+ * @param newNormailzedPrefix-
+ * The normalized new vf name
+ * @param qualifiedGroupInstanceName-
+ * old Group Instance Name
**/
- //modify group names
- private String getNewGroupName( String oldPrefix ,String newNormailzedPrefix , String qualifiedGroupInstanceName){
- if (qualifiedGroupInstanceName == null){
+ // modify group names
+ private String getNewGroupName(String oldPrefix, String newNormailzedPrefix, String qualifiedGroupInstanceName) {
+ if (qualifiedGroupInstanceName == null) {
log.info("CANNOT change group name ");
return null;
}
@@ -702,9 +762,8 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
oldComponentInstance.setName(newComponentInstance.getName());
oldComponentInstance.setModificationTime(System.currentTimeMillis());
oldComponentInstance.setCustomizationUUID(UUID.randomUUID().toString());
- if ( oldComponentInstance.getGroupInstances() != null )
- oldComponentInstance.getGroupInstances().forEach( group ->
- group.setName( getNewGroupName( oldComponentInstance.getNormalizedName() , ValidationUtils.normalizeComponentInstanceName( newComponentInstance.getName() ) , group.getName() ) ) );
+ if (oldComponentInstance.getGroupInstances() != null)
+ oldComponentInstance.getGroupInstances().forEach(group -> group.setName(getNewGroupName(oldComponentInstance.getNormalizedName(), ValidationUtils.normalizeComponentInstanceName(newComponentInstance.getName()), group.getName())));
return oldComponentInstance;
}
@@ -772,26 +831,25 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
if (resultOp.isLeft() && CollectionUtils.isNotEmpty(containerComponent.getGroups())) {
List<GroupDataDefinition> groupsToUpdate = new ArrayList<>();
- for(GroupDataDefinition currGroup : containerComponent.getGroups()){
- if(currGroup.getMembers().containsKey(deletedInstance.getName())){
- currGroup.getMembers().remove(deletedInstance.getName());
+ for (GroupDataDefinition currGroup : containerComponent.getGroups()) {
+ Map<String, String> members = currGroup.getMembers();
+ if (members != null && members.containsKey(deletedInstance.getName())) {
+ members.remove(deletedInstance.getName());
groupsToUpdate.add(currGroup);
}
}
- Either<List<GroupDefinition>, StorageOperationStatus> updateGroupsRes =
- toscaOperationFacade.updateGroupsOnComponent(containerComponent, containerComponent.getComponentType(), groupsToUpdate);
+ Either<List<GroupDefinition>, StorageOperationStatus> updateGroupsRes = toscaOperationFacade.updateGroupsOnComponent(containerComponent, containerComponent.getComponentType(), groupsToUpdate);
if (updateGroupsRes.isRight()) {
log.debug("Failed to delete component instance {} from group members. ", componentInstanceId);
ActionStatus status = componentsUtils.convertFromStorageResponse(updateGroupsRes.right().value(), containerComponentType);
resultOp = Either.right(componentsUtils.getResponseFormat(status, componentInstanceId));
}
}
- if(resultOp.isLeft() && CollectionUtils.isNotEmpty(containerComponent.getInputs())){
+ if (resultOp.isLeft() && CollectionUtils.isNotEmpty(containerComponent.getInputs())) {
List<InputDefinition> inputsToDelete = containerComponent.getInputs().stream().filter(i -> i.getInstanceUniqueId() != null && i.getInstanceUniqueId().equals(componentInstanceId)).collect(Collectors.toList());
- if(CollectionUtils.isNotEmpty(inputsToDelete)){
- StorageOperationStatus deleteInputsRes =
- toscaOperationFacade.deleteComponentInstanceInputsFromTopologyTemplate(containerComponent, containerComponent.getComponentType(), inputsToDelete);
- if(deleteInputsRes != StorageOperationStatus.OK){
+ if (CollectionUtils.isNotEmpty(inputsToDelete)) {
+ StorageOperationStatus deleteInputsRes = toscaOperationFacade.deleteComponentInstanceInputsFromTopologyTemplate(containerComponent, containerComponent.getComponentType(), inputsToDelete);
+ if (deleteInputsRes != StorageOperationStatus.OK) {
log.debug("Failed to delete inputs of the component instance {} from container component. ", componentInstanceId);
resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deleteInputsRes, containerComponentType), componentInstanceId));
}
@@ -802,8 +860,8 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
private ComponentInstance findAndRemoveComponentInstanceFromContainerComponent(String componentInstanceId, Component containerComponent) {
ComponentInstance foundInstance = null;
- for(ComponentInstance instance : containerComponent.getComponentInstances()){
- if(instance.getUniqueId().equals(componentInstanceId)){
+ for (ComponentInstance instance : containerComponent.getComponentInstances()) {
+ if (instance.getUniqueId().equals(componentInstanceId)) {
foundInstance = instance;
containerComponent.getComponentInstances().remove(instance);
break;
@@ -885,7 +943,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
toNameOrId = toResult.left().value().getName();
}
- resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRequirement()));
+ resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement()));
return resultOp;
}
@@ -941,13 +999,156 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
resultOp = Either
- .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRequirement()));
+ .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement()));
return resultOp;
}
} finally {
unlockComponent(resultOp, containerComponent);
}
}
+ /**
+ * Allows to get relation contained in specified component according to received Id
+ * @param componentId
+ * @param relationId
+ * @param userId
+ * @param componentTypeEnum
+ * @return
+ */
+ public Either<RequirementCapabilityRelDef, ResponseFormat> getRelationById(String componentId, String relationId, String userId, ComponentTypeEnum componentTypeEnum) {
+
+ Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
+ try {
+ org.openecomp.sdc.be.model.Component containerComponent = null;
+ Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = null;
+ RequirementCapabilityRelDef foundRelation = null;
+
+ Either<User, ResponseFormat> validateUserRes = validateUserExists(userId, "get relation by Id", false);
+ if (validateUserRes.isRight()) {
+ resultOp = Either.right(validateUserRes.right().value());
+ }
+ if(resultOp == null){
+ validateComponentExists = validateComponentExists(componentId, componentTypeEnum, null);
+ if (validateComponentExists.isRight()) {
+ resultOp = Either.right(validateComponentExists.right().value());
+ }
+ }
+ if(resultOp == null){
+ containerComponent = validateComponentExists.left().value();
+ List<RequirementCapabilityRelDef> requirementCapabilityRelations = containerComponent.getComponentInstancesRelations();
+ foundRelation = findRelation(relationId, requirementCapabilityRelations);
+ if(foundRelation == null){
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RELATION_NOT_FOUND, relationId, componentId);
+ log.debug("Relation with id {} was not found on the component", relationId, componentId);
+ resultOp = Either.right(responseFormat);
+ }
+ }
+ if(resultOp == null){
+ resultOp = setRelatedCapability(foundRelation, containerComponent);
+ }
+ if(resultOp.isLeft()){
+ resultOp = setRelatedRequirement(foundRelation, containerComponent);
+ }
+ } catch (Exception e) {
+ log.error("The exception {} occured upon get relation {} of the component {} ", e, relationId, componentId);
+ resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+ return resultOp;
+ }
+
+ private RequirementCapabilityRelDef findRelation(String relationId, List<RequirementCapabilityRelDef> requirementCapabilityRelations) {
+ for(RequirementCapabilityRelDef relationship : requirementCapabilityRelations){
+ if(relationship.getRelationships().stream().filter(r -> r.getRelation().getId().equals(relationId)).findFirst().isPresent()){
+ return relationship;
+ }
+ }
+ return null;
+ }
+
+ private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedRequirement(RequirementCapabilityRelDef foundRelation, Component containerComponent) {
+ Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
+ RelationshipInfo relationshipInfo = foundRelation.getSingleRelationship().getRelation();
+ String instanceId = foundRelation.getFromNode();
+ Optional<RequirementDefinition> foundRequirement;
+ Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
+ if(!instance.isPresent()){
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance", containerComponent.getComponentType().getValue(), containerComponent.getName());
+ log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
+ result = Either.right(responseFormat);
+ }
+ if(result == null){
+ for(List<RequirementDefinition> requirements : instance.get().getRequirements().values()){
+ foundRequirement = requirements.stream().filter(r -> isBelongingRequirement(relationshipInfo, r)).findFirst();
+ if(foundRequirement.isPresent()){
+ foundRelation.getSingleRelationship().setRequirement(foundRequirement.get());
+ result = Either.left(foundRelation);
+ }
+ }
+ }
+ if(result == null){
+ Either<RequirementDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade.getFulfilledRequirementByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, (rel, req)->isBelongingRequirement(rel, req));
+ if(getfulfilledRequirementRes.isRight()){
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.REQUIREMENT_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getRequirement(), instanceId, containerComponent.getUniqueId());
+ log.debug("Requirement {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
+ result = Either.right(responseFormat);
+ } else {
+ foundRelation.getSingleRelationship().setRequirement(getfulfilledRequirementRes.left().value());
+ }
+ }
+ if(result == null){
+ result = Either.left(foundRelation);
+ }
+ return result;
+ }
+
+ private boolean isBelongingRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req) {
+ return req.getRelationship().equals(relationshipInfo.getRelationship().getType()) &&
+ req.getName().equals(relationshipInfo.getRequirement()) &&
+ req.getUniqueId().equals(relationshipInfo.getRequirementUid()) &&
+ req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
+ }
+
+ private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedCapability(RequirementCapabilityRelDef foundRelation, Component containerComponent) {
+ Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
+ RelationshipInfo relationshipInfo = foundRelation.getSingleRelationship().getRelation();
+ String instanceId = foundRelation.getToNode();
+ Optional<CapabilityDefinition> foundCapability;
+ Optional<ComponentInstance> instance = containerComponent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
+ if(!instance.isPresent()){
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "instance", containerComponent.getComponentType().getValue(), containerComponent.getName());
+ log.debug("Component instance with id {} was not found on the component", instanceId, containerComponent.getUniqueId());
+ result = Either.right(responseFormat);
+ }
+ if(result == null){
+ for(List<CapabilityDefinition> capabilities : instance.get().getCapabilities().values()){
+ foundCapability = capabilities.stream().filter(c -> isBelongingCapability(relationshipInfo, c)).findFirst();
+ if(foundCapability.isPresent()){
+ foundRelation.getSingleRelationship().setCapability(foundCapability.get());
+ result = Either.left(foundRelation);
+ }
+ }
+ }
+ if(result == null){
+ Either<CapabilityDataDefinition, StorageOperationStatus> getfulfilledRequirementRes =
+ toscaOperationFacade.getFulfilledCapabilityByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, (rel, cap)->isBelongingCapability(rel, cap));
+ if(getfulfilledRequirementRes.isRight()){
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
+ log.debug("Capability {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
+ result = Either.right(responseFormat);
+ } else {
+ foundRelation.getSingleRelationship().setCapability(getfulfilledRequirementRes.left().value());
+ }
+ }
+ if(result == null){
+ result = Either.left(foundRelation);
+ }
+ return result;
+ }
+
+ private boolean isBelongingCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap) {
+ return cap.getName().equals(relationshipInfo.getCapability()) &&
+ cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) &&
+ cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
+ }
private Either<ComponentInstanceProperty, ResponseFormat> updateAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation.updateAttributeValueInResourceInstance(attribute, resourceInstanceId, true);
@@ -999,7 +1200,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
/**
* Create Or Updates Attribute Instance
- *
+ *
* @param componentTypeEnum
* @param componentId
* @param resourceInstanceId
@@ -1047,28 +1248,82 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
}
- // US833308 VLI in service - specific network_role property value logic
+ private boolean isNetworkRoleServiceProperty(ComponentInstanceProperty property, ComponentTypeEnum componentTypeEnum) {
+ return StringUtils.isNotEmpty(property.getValue())
+ && PropertyNames.NETWORK_ROLE.getPropertyName().equalsIgnoreCase(property.getName())
+ && ComponentTypeEnum.SERVICE == componentTypeEnum;
+ }
+
private StorageOperationStatus concatServiceNameToVLINetworkRolePropertyValue(ToscaOperationFacade toscaOperationFacade, ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, ComponentInstanceProperty property) {
- if (StringUtils.isNotEmpty(property.getValue()) && PropertyNames.NETWORK_ROLE.getPropertyName().equalsIgnoreCase(property.getName()) && ComponentTypeEnum.SERVICE == componentTypeEnum) {
- ComponentParametersView componentParametersView = new ComponentParametersView();
- componentParametersView.disableAll();
- componentParametersView.setIgnoreComponentInstances(false);
- Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade.getToscaElement(componentId, componentParametersView);
- if (getServiceResult.isRight()) {
- return getServiceResult.right().value();
+ return concatServiceNameToVLINetworkRolePropertiesValues(toscaOperationFacade, componentTypeEnum, componentId, resourceInstanceId, Arrays.asList(property));
+ }
+
+ // US833308 VLI in service - specific network_role property value logic
+ private StorageOperationStatus concatServiceNameToVLINetworkRolePropertiesValues(ToscaOperationFacade toscaOperationFacade, ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, List<ComponentInstanceProperty> properties) {
+ for (ComponentInstanceProperty property: properties) {
+ if (isNetworkRoleServiceProperty(property, componentTypeEnum)) {
+ ComponentParametersView componentParametersView = new ComponentParametersView();
+ componentParametersView.disableAll();
+ componentParametersView.setIgnoreComponentInstances(false);
+ Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade.getToscaElement(componentId, componentParametersView);
+ if (getServiceResult.isRight()) {
+ return getServiceResult.right().value();
+ }
+ Component service = getServiceResult.left().value();
+ Optional<ComponentInstance> getInstance = service.getComponentInstances().stream().filter(p -> p.getUniqueId().equals(resourceInstanceId)).findAny();
+ if (!getInstance.isPresent()) {
+ return StorageOperationStatus.NOT_FOUND;
+ }
+ String prefix = service.getSystemName() + ".";
+ String value = property.getValue();
+ if (OriginTypeEnum.VL == getInstance.get().getOriginType() && (!value.startsWith(prefix) || value.equalsIgnoreCase(prefix))) {
+ property.setValue(prefix + value);
+ }
+ }
+ }
+ return StorageOperationStatus.OK;
+ }
+
+ private Either<String,ResponseFormat> updatePropertyObjectValue(ComponentInstanceProperty property, Map<String, DataTypeDefinition> allDataTypes) {
+ String innerType = null;
+ String propertyType = property.getType();
+ ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
+ log.debug("The type of the property {} is {}", property.getUniqueId(), propertyType);
+
+ if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
+ SchemaDefinition def = property.getSchema();
+ if (def == null) {
+ log.debug("Schema doesn't exists for property of type {}", type);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
}
- Component service = getServiceResult.left().value();
- Optional<ComponentInstance> getInstance = service.getComponentInstances().stream().filter(p -> p.getUniqueId().equals(resourceInstanceId)).findAny();
- if (!getInstance.isPresent()) {
- return StorageOperationStatus.NOT_FOUND;
+ PropertyDataDefinition propDef = def.getProperty();
+ if (propDef == null) {
+ log.debug("Property in Schema Definition inside property of type {} doesn't exist", type);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE)));
}
- String prefix = service.getSystemName() + ".";
- String value = property.getValue();
- if (OriginTypeEnum.VL == getInstance.get().getOriginType() && (!value.startsWith(prefix) || value.equalsIgnoreCase(prefix))) {
- property.setValue(prefix + value);
+ innerType = propDef.getType();
+ }
+ // Specific Update Logic
+ Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(propertyType, property.getValue(), true, innerType, allDataTypes);
+ String newValue = property.getValue();
+ if (isValid.isRight()) {
+ Boolean res = isValid.right().value();
+ if (res == false) {
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertTitanStatusToStorageStatus(TitanOperationStatus.ILLEGAL_ARGUMENT))));
+ }
+ } else {
+ Object object = isValid.left().value();
+ if (object != null) {
+ newValue = object.toString();
}
}
- return StorageOperationStatus.OK;
+
+ ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, property.getRules(), innerType, allDataTypes, true);
+ if (pair.getRight() != null && pair.getRight() == false) {
+ BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertTitanStatusToStorageStatus(TitanOperationStatus.ILLEGAL_ARGUMENT))));
+ }
+ return Either.left(newValue);
}
public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdatePropertyValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, ComponentInstanceProperty property, String userId) {
@@ -1156,7 +1411,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
if (object != null) {
newValue = object.toString();
}
- }
+ }
ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, property.getRules(), innerType, allDataTypes.left().value(), true);
if (pair.getRight() != null && pair.getRight() == false) {
@@ -1169,12 +1424,12 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
Optional<ComponentInstanceProperty> instanceProperty = instanceProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
StorageOperationStatus status;
instanceProperty.get().setValue(newValue);
- if(instanceProperty.isPresent()){
+ if (instanceProperty.isPresent()) {
status = toscaOperationFacade.updateComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(), property);
} else {
status = toscaOperationFacade.addComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(), property);
}
- if(status != StorageOperationStatus.OK){
+ if (status != StorageOperationStatus.OK) {
ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
return resultOp;
@@ -1182,17 +1437,17 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
List<String> path = new ArrayList<>();
path.add(foundResourceInstance.getUniqueId());
property.setPath(path);
-
+
foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
-
+
if (updateContainerRes.isRight()) {
ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
return resultOp;
}
- resultOp = Either.left(property);
- return resultOp;
+ resultOp = Either.left(property);
+ return resultOp;
} finally {
if (resultOp == null || resultOp.isRight()) {
@@ -1205,7 +1460,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
}
-
+
public Either<ComponentInstanceInput, ResponseFormat> createOrUpdateInstanceInputValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, ComponentInstanceInput property, String userId) {
Either<ComponentInstanceInput, ResponseFormat> resultOp = null;
@@ -1239,9 +1494,9 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, resourceInstanceId, componentId));
return resultOp;
}
-
+
ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
-
+
// lock resource
StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
if (lockStatus != StorageOperationStatus.OK) {
@@ -1276,44 +1531,38 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(propertyType, property.getValue(), true, innerType, allDataTypes.left().value());
- String newValue = property.getValue();
if (isValid.isRight()) {
Boolean res = isValid.right().value();
- if (res == false) {
+ if (!res) {
return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertTitanStatusToStorageStatus(TitanOperationStatus.ILLEGAL_ARGUMENT))));
}
- } else {
- Object object = isValid.left().value();
- if (object != null) {
- newValue = object.toString();
- }
- }
+ }
try {
List<ComponentInstanceInput> instanceProperties = containerComponent.getComponentInstancesInputs().get(resourceInstanceId);
Optional<ComponentInstanceInput> instanceProperty = instanceProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
StorageOperationStatus status;
- if(instanceProperty.isPresent()){
+ if (instanceProperty.isPresent()) {
instanceProperty.get().setValue(property.getValue());
status = toscaOperationFacade.updateComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), property);
} else {
status = toscaOperationFacade.addComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), property);
}
- if(status != StorageOperationStatus.OK){
+ if (status != StorageOperationStatus.OK) {
ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
return resultOp;
}
foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
-
+
if (updateContainerRes.isRight()) {
ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
return resultOp;
}
- resultOp = Either.left(property);
- return resultOp;
+ resultOp = Either.left(property);
+ return resultOp;
} finally {
if (resultOp == null || resultOp.isRight()) {
@@ -1577,7 +1826,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
private Either<Component, ResponseFormat> getAndValidateOriginComponentOfComponentInstance(ComponentTypeEnum containerComponentType, ComponentInstance componentInstance) {
-
+
Either<Component, ResponseFormat> eitherResponse = null;
ComponentTypeEnum componentType = getComponentTypeByParentComponentType(containerComponentType);
Component component;
@@ -1589,16 +1838,16 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
errorResponse = componentsUtils.getResponseFormat(actionStatus, Constants.EMPTY_STRING);
eitherResponse = Either.right(errorResponse);
}
- if(eitherResponse == null) {
+ if (eitherResponse == null) {
component = getComponentRes.left().value();
LifecycleStateEnum resourceCurrState = component.getLifecycleState();
if (resourceCurrState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
ActionStatus actionStatus = ActionStatus.ILLEGAL_COMPONENT_STATE;
errorResponse = componentsUtils.getResponseFormat(actionStatus, component.getComponentType().toString(), component.getName(), resourceCurrState.toString());
- eitherResponse = Either.right(errorResponse);
+ eitherResponse = Either.right(errorResponse);
}
}
- if(eitherResponse == null) {
+ if (eitherResponse == null) {
eitherResponse = Either.left(getComponentRes.left().value());
}
return eitherResponse;
@@ -1632,7 +1881,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return Either.right(validateCanWorkOnComponent.right().value());
}
- Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent,componentInstanceId);
+ Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceId);
if (resourceInstanceStatus.isRight()) {
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId));
return resultOp;
@@ -1646,48 +1895,79 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
try {
+
+
if (currentResourceInstance.getComponentUid().equals(newComponentInstance.getComponentUid())) {
resultOp = Either.left(currentResourceInstance);
return resultOp;
}
String resourceId = newComponentInstance.getComponentUid();
+
+
+
Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade.validateComponentExists(resourceId);
- if(componentExistsRes.isRight()){
+ if (componentExistsRes.isRight()) {
log.debug("Failed to validate existing of the component {}. Status is {} ", resourceId);
resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(componentExistsRes.right().value()), resourceId));
return resultOp;
- }
- else if (!componentExistsRes.left().value()) {
+ } else if (!componentExistsRes.left().value()) {
log.debug("The resource {} not found ", resourceId);
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
return resultOp;
}
- // List<GroupInstance> groupInstances = currentResourceInstance.getGroupInstances();
- Map<String, ArtifactDefinition> deploymentArtifacts = currentResourceInstance.getDeploymentArtifacts();
+ Either<Component, ResponseFormat> eitherOriginComponent = getOriginComponentFromComponentInstance(currentResourceInstance, true);
+
+ if (eitherOriginComponent.isRight()) {
+ resultOp = Either.right(eitherOriginComponent.right().value());
+ return resultOp;
+ }
+ DataForMergeHolder dataHolder = compInstMergeDataBL.saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent.left().value());
resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
if (resultOp.isRight()) {
log.debug("failed to delete resource instance {}", resourceId);
return resultOp;
}
+ ComponentInstance resResourceInfo = resultOp.left().value();
+ Component origComponent = null;
+ OriginTypeEnum originType = currentResourceInstance.getOriginType();
+ if (originType == OriginTypeEnum.ServiceProxy) {
+ Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
+ if (serviceProxyOrigin.isRight()) {
+ log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value())));
+ }
+ origComponent = serviceProxyOrigin.left().value();
- Either<Component, ResponseFormat> eitherResourceName = getOriginComponentNameFromComponentInstance(newComponentInstance, true);
+ StorageOperationStatus fillProxyRes = fillProxyInstanceData(newComponentInstance, origComponent);
- if (eitherResourceName.isRight()) {
- resultOp = Either.right(eitherResourceName.right().value());
- return resultOp;
- }
+ if (fillProxyRes != StorageOperationStatus.OK) {
+ log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(fillProxyRes)));
- Component origComponent = eitherResourceName.left().value();
+ }
+ newComponentInstance.setOriginType(originType);
+ }else{
+
+
+ Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(newComponentInstance, true);
+
+ if (eitherResourceName.isRight()) {
+ resultOp = Either.right(eitherResourceName.right().value());
+ return resultOp;
+ }
+
+ origComponent = eitherResourceName.left().value();
+
+ newComponentInstance.setName(resResourceInfo.getName());
+ //newComponentInstance.setToscaComponentName(((ResourceMetadataDataDefinition) origComponent.getComponentMetadataDefinition().getMetadataDataDefinition()).getToscaResourceName());
+ }
- ComponentInstance resResourceInfo = resultOp.left().value();
- newComponentInstance.setName(resResourceInfo.getName());
newComponentInstance.setInvariantName(resResourceInfo.getInvariantName());
newComponentInstance.setPosX(resResourceInfo.getPosX());
newComponentInstance.setPosY(resResourceInfo.getPosY());
newComponentInstance.setDescription(resResourceInfo.getDescription());
- newComponentInstance.setToscaComponentName(((ResourceMetadataDataDefinition)origComponent.getComponentMetadataDefinition().getMetadataDataDefinition()).getToscaResourceName());
resultOp = createComponentInstanceOnGraph(containerComponent, origComponent, newComponentInstance, user);
@@ -1702,29 +1982,25 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return resultOp;
}
- /* if (CollectionUtils.isNotEmpty(groupInstances)) {
- StorageOperationStatus addGroupsToComponentInstance = toscaOperationFacade.addGroupInstancesToComponentInstance(containerComponent, updatedComponentInstance, groupInstances);
- if (addGroupsToComponentInstance != StorageOperationStatus.OK) {
- BeEcompErrorManager.getInstance().logInternalFlowError("ChangeComponentInstanceVersion", "Failed to associate groups to new component instance", ErrorSeverity.ERROR);
- resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- return resultOp;
- }
-
-
+ Either<Component, ResponseFormat> mergeStatusEither = compInstMergeDataBL.mergeComponentUserOrigData(user, dataHolder, containerComponent, containerComponentId, newComponentInstance.getUniqueId());
+ if (mergeStatusEither.isRight()) {
+ return Either.right(mergeStatusEither.right().value());
}
- if (MapUtils.isNotEmpty(deploymentArtifacts)) {
- StorageOperationStatus addDeploymentArtifactsToComponentInstance = toscaOperationFacade.addDeploymentArtifactsToComponentInstance(containerComponent, updatedComponentInstance, deploymentArtifacts);
- if (addDeploymentArtifactsToComponentInstance != StorageOperationStatus.OK) {
- BeEcompErrorManager.getInstance().logInternalFlowError("ChangeComponentInstanceVersion", "Failed to associate groups to new component instance", ErrorSeverity.ERROR);
- resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- return resultOp;
- }
- }*/
-
+ /*
+ * if (CollectionUtils.isNotEmpty(groupInstances)) { StorageOperationStatus addGroupsToComponentInstance = toscaOperationFacade.addGroupInstancesToComponentInstance( containerComponent, updatedComponentInstance, groupInstances); if
+ * (addGroupsToComponentInstance != StorageOperationStatus.OK) { BeEcompErrorManager.getInstance().logInternalFlowError( "ChangeComponentInstanceVersion", "Failed to associate groups to new component instance", ErrorSeverity.ERROR);
+ * resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus. GENERAL_ERROR)); return resultOp; }
+ *
+ *
+ * } if (MapUtils.isNotEmpty(deploymentArtifacts)) { StorageOperationStatus addDeploymentArtifactsToComponentInstance = toscaOperationFacade.addDeploymentArtifactsToComponentInstance( containerComponent, updatedComponentInstance,
+ * deploymentArtifacts); if (addDeploymentArtifactsToComponentInstance != StorageOperationStatus.OK) { BeEcompErrorManager.getInstance().logInternalFlowError( "ChangeComponentInstanceVersion",
+ * "Failed to associate groups to new component instance", ErrorSeverity.ERROR); resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus. GENERAL_ERROR)); return resultOp; } }
+ */
+
ComponentParametersView filter = new ComponentParametersView(true);
filter.setIgnoreComponentInstances(false);
- Either<Component, StorageOperationStatus> updatedComponentRes = toscaOperationFacade.getToscaElement(containerComponentId, filter);
+ Either<Component, StorageOperationStatus> updatedComponentRes = toscaOperationFacade.getToscaElement(containerComponentId, filter);
if (updatedComponentRes.isRight()) {
StorageOperationStatus storageOperationStatus = updatedComponentRes.right().value();
ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(storageOperationStatus, containerComponent.getComponentType());
@@ -1732,7 +2008,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
log.debug("Component with id {} was not found", containerComponentId);
return Either.right(responseFormat);
}
- resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(),updatedComponentInstance.getUniqueId());
+ resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(), updatedComponentInstance.getUniqueId());
if (resourceInstanceStatus.isRight()) {
resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId()));
return resultOp;
@@ -1780,9 +2056,9 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
return resultOp;
}
-
+
List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(componentInstanceUniqueId);
- if(CollectionUtils.isEmpty(instanceProperties)){
+ if (CollectionUtils.isEmpty(instanceProperties)) {
instanceProperties = new ArrayList<>();
}
resultOp = Either.left(instanceProperties);
@@ -1808,7 +2084,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
/**
* updates componentInstance modificationTime
- *
+ *
* @param componentInstance
* @param componentInstanceType
* @param modificationTime
@@ -1827,7 +2103,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
return result;
}
-
+
public Either<ComponentInstance, ResponseFormat> deleteServiceProxy(String containerComponentType, String containerComponentId, String serviceProxyId, String userId) {
// TODO Add implementation
Either<ComponentInstance, ResponseFormat> result = Either.left(new ComponentInstance());
@@ -1845,7 +2121,7 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
Either<ComponentInstance, ResponseFormat> result = Either.left(new ComponentInstance());
return result;
}
-
+
private Boolean validateInstanceNameUniquenessUponUpdate(Component containerComponent, ComponentInstance oldComponentInstance, String newInstanceName) {
Boolean isUnique = true;
String newInstanceNormalizedName = ValidationUtils.normalizeComponentInstanceName(newInstanceName);
@@ -1859,57 +2135,259 @@ public abstract class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
private Either<ComponentInstance, StorageOperationStatus> getResourceInstanceById(Component containerComponent, String instanceId) {
-
+
Either<ComponentInstance, StorageOperationStatus> result = null;
List<ComponentInstance> instances = containerComponent.getComponentInstances();
Optional<ComponentInstance> foundInstance = null;
- if(CollectionUtils.isEmpty(instances)){
+ if (CollectionUtils.isEmpty(instances)) {
result = Either.right(StorageOperationStatus.NOT_FOUND);
}
- if(result == null){
+ if (result == null) {
foundInstance = instances.stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
- if(!foundInstance.isPresent()){
+ if (!foundInstance.isPresent()) {
result = Either.right(StorageOperationStatus.NOT_FOUND);
}
}
- if(result == null){
+ if (result == null) {
result = Either.left(foundInstance.get());
}
return result;
}
-
- private ComponentInstance buildComponentInstance(ComponentInstance resourceInstanceForUpdate, ComponentInstance origInstanceForUpdate) {
- Long creationDate = origInstanceForUpdate.getCreationTime();
-
+ private ComponentInstance buildComponentInstance(ComponentInstance resourceInstanceForUpdate, ComponentInstance origInstanceForUpdate) {
+
+ Long creationDate = origInstanceForUpdate.getCreationTime();
+
Long modificationTime = System.currentTimeMillis();
resourceInstanceForUpdate.setCreationTime(creationDate);
resourceInstanceForUpdate.setModificationTime(modificationTime);
-
+
resourceInstanceForUpdate.setCustomizationUUID(origInstanceForUpdate.getCustomizationUUID());
-
+
if (StringUtils.isEmpty(resourceInstanceForUpdate.getName()) && StringUtils.isNotEmpty(origInstanceForUpdate.getName())) {
resourceInstanceForUpdate.setName(origInstanceForUpdate.getName());
}
-
+
resourceInstanceForUpdate.setNormalizedName(ValidationUtils.normalizeComponentInstanceName(resourceInstanceForUpdate.getName()));
-
+
if (StringUtils.isEmpty(resourceInstanceForUpdate.getIcon()))
- resourceInstanceForUpdate.setIcon(origInstanceForUpdate.getIcon());
-
-
+ resourceInstanceForUpdate.setIcon(origInstanceForUpdate.getIcon());
+
if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentVersion()))
resourceInstanceForUpdate.setComponentVersion(origInstanceForUpdate.getComponentVersion());
-
+
if (StringUtils.isEmpty(resourceInstanceForUpdate.getComponentName()))
resourceInstanceForUpdate.setComponentName(origInstanceForUpdate.getComponentName());
-
+
if (StringUtils.isEmpty(resourceInstanceForUpdate.getToscaComponentName()))
- resourceInstanceForUpdate.setToscaComponentName(origInstanceForUpdate.getToscaComponentName());
-
- if (resourceInstanceForUpdate.getOriginType() == null) {
+ resourceInstanceForUpdate.setToscaComponentName(origInstanceForUpdate.getToscaComponentName());
+
+ if (resourceInstanceForUpdate.getOriginType() == null) {
resourceInstanceForUpdate.setOriginType(origInstanceForUpdate.getOriginType());
}
+ if(resourceInstanceForUpdate.getOriginType() == OriginTypeEnum.ServiceProxy)
+ resourceInstanceForUpdate.setIsProxy(true);
+ if (resourceInstanceForUpdate.getSourceModelInvariant() == null) {
+ resourceInstanceForUpdate.setSourceModelInvariant(origInstanceForUpdate.getSourceModelInvariant());
+ }
+ if (resourceInstanceForUpdate.getSourceModelName() == null) {
+ resourceInstanceForUpdate.setSourceModelName(origInstanceForUpdate.getSourceModelName());
+ }
+ if (resourceInstanceForUpdate.getSourceModelUuid() == null) {
+ resourceInstanceForUpdate.setSourceModelUuid(origInstanceForUpdate.getSourceModelUuid());
+ }
+ if (resourceInstanceForUpdate.getSourceModelUid() == null) {
+ resourceInstanceForUpdate.setSourceModelUid(origInstanceForUpdate.getSourceModelUid());
+ }
return resourceInstanceForUpdate;
}
+ /**
+ * Returns list of ComponentInstanceProperty belonging to component instance capability specified by name and type
+ * @param containerComponentType
+ * @param containerComponentId
+ * @param componentInstanceUniqueId
+ * @param capabilityType
+ * @param capabilityName
+ * @param userId
+ * @return
+ */
+ public Either<List<ComponentInstanceProperty>, ResponseFormat> getComponentInstanceCapabilityPropertiesById(String containerComponentType, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String userId) {
+
+ Component containerComponent = null;
+
+ Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+ try {
+ Either<User, ResponseFormat> validateUserExists = validateUserExists(userId, "Get Component Instance Properties By Id", false);
+ if (validateUserExists.isRight()) {
+ resultOp = Either.right(validateUserExists.right().value());
+ }
+ if(resultOp == null){
+ Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentType);
+ if (validateComponentType.isRight()) {
+ resultOp = Either.right(validateComponentType.right().value());
+ }
+ }
+ if(resultOp == null){
+ Either<Component, StorageOperationStatus> validateContainerComponentExists = toscaOperationFacade.getToscaFullElement(containerComponentId);
+ if (validateContainerComponentExists.isRight()) {
+ resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value())));
+ } else {
+ containerComponent = validateContainerComponentExists.left().value();
+ }
+ }
+ if(resultOp == null){
+ Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
+ if (resourceInstanceStatus.isRight()) {
+ resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
+ } else {
+ resultOp = findCapabilityOfInstance(containerComponentId, componentInstanceUniqueId, capabilityType, capabilityName, resourceInstanceStatus.left().value().getCapabilities());
+ }
+ }
+ return resultOp;
+ } finally {
+ unlockComponent(resultOp, containerComponent);
+ }
+ }
+
+ private Either<List<ComponentInstanceProperty>, ResponseFormat> findCapabilityOfInstance( String componentId, String instanceId, String capabilityType, String capabilityName, Map<String, List<CapabilityDefinition>> instanceCapabilities) {
+ Either<List<ComponentInstanceProperty>, ResponseFormat> result = null;
+ CapabilityDefinition foundCapability;
+ if (MapUtils.isNotEmpty(instanceCapabilities)) {
+ List<CapabilityDefinition> capabilitiesPerType = instanceCapabilities.get(capabilityType);
+ if (capabilitiesPerType != null) {
+ Optional<CapabilityDefinition> capabilityOpt = capabilitiesPerType.stream().filter(c -> c.getName().equals(capabilityName)).findFirst();
+ if (capabilityOpt.isPresent()) {
+ foundCapability = capabilityOpt.get();
+ result = Either.left(foundCapability.getProperties() == null ? new ArrayList<>() : foundCapability.getProperties());
+ }
+ }
+ }
+ if (result == null) {
+ result = fetchComponentInstanceCapabilityProperties(componentId, instanceId, capabilityType, capabilityName);
+ }
+ return result;
+ }
+
+ private Either<List<ComponentInstanceProperty>, ResponseFormat> fetchComponentInstanceCapabilityProperties(String componentId, String instanceId, String capabilityType, String capabilityName) {
+ Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+ try {
+ Either<List<ComponentInstanceProperty>, StorageOperationStatus> getComponentInstanceCapabilityProperties = toscaOperationFacade.getComponentInstanceCapabilityProperties(componentId, instanceId, capabilityName, capabilityType);
+ if(getComponentInstanceCapabilityProperties.isRight()){
+ resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentInstanceCapabilityProperties.right().value()), capabilityType, instanceId, componentId));
+ } else {
+ resultOp = Either.left(getComponentInstanceCapabilityProperties.left().value());
+ }
+ } catch(Exception e){
+ log.error("The exception {} occurred upon the component {} instance {} capability {} properties retrieving. ", componentId, instanceId, capabilityName, e);
+ resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+ return resultOp;
+ }
+
+ private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property, String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
+ String capabilityType, String capabilityName) {
+ String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
+ StringBuilder sb = new StringBuilder(componentInstanceUniqueId);
+ sb.append(ModelConverter.CAP_PROP_DELIM).append(property.getOwnerId()).append(ModelConverter.CAP_PROP_DELIM).append(capabilityType).append(ModelConverter.CAP_PROP_DELIM).append(capabilityName);
+ String capKey = sb.toString();
+
+ Map<String, List<CapabilityDefinition>> capabilities = Optional.ofNullable(foundResourceInstance.getCapabilities())
+ .orElse(Collections.emptyMap());
+ List<CapabilityDefinition> capPerType = Optional.ofNullable(capabilities.get(capabilityType)).orElse(Collections.emptyList());
+ Optional<CapabilityDefinition> cap = capPerType.stream().filter(c -> c.getName().equals(capabilityName)).findAny();
+ if (cap.isPresent()) {
+ List<ComponentInstanceProperty> capProperties = cap.get().getProperties();
+ if (capProperties != null) {
+ Optional<ComponentInstanceProperty> instanceProperty = capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
+ StorageOperationStatus status;
+ if (instanceProperty.isPresent()) {
+ instanceProperty.get().setValue(newValue);
+ List<String> path = new ArrayList<>();
+ path.add(componentInstanceUniqueId);
+ path.add(capKey);
+ instanceProperty.get().setPath(path);
+ status = toscaOperationFacade.updateComponentInstanceCapabiltyProperty(containerComponent, componentInstanceUniqueId, capKey, instanceProperty.get());
+ if (status != StorageOperationStatus.OK) {
+ ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
+ return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
+
+ }
+ foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
+ }
+ }
+ }
+ return componentsUtils.getResponseFormat(ActionStatus.OK);
+ }
+
+ public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName,
+ List<ComponentInstanceProperty> properties, String userId) {
+ Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+
+ Either<User, ResponseFormat> resp = validateUserExists(userId, "update instance capability property", false);
+ if (resp.isRight()) {
+ return Either.right(resp.right().value());
+ }
+
+ if (componentTypeEnum == null) {
+ BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", "invalid component type", ErrorSeverity.INFO);
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
+ }
+ Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
+
+ if (getResourceResult.isRight()) {
+ log.debug("Failed to retrieve component, component id {}", containerComponentId);
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
+ }
+ Component containerComponent = getResourceResult.left().value();
+
+ if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
+ log.info("Restricted operation for user: {} on component {}", userId, containerComponentId);
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
+ }
+ Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
+ if (resourceInstanceStatus.isRight()) {
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
+ }
+ ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
+ // lock resource
+ StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
+ if (lockStatus != StorageOperationStatus.OK) {
+ log.debug("Failed to lock component {}", containerComponentId);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
+ }
+
+ Either<Map<String, DataTypeDefinition>, TitanOperationStatus> allDataTypes = dataTypeCache.getAll();
+ if (allDataTypes.isRight()) {
+ TitanOperationStatus status = allDataTypes.right().value();
+ BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance", "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
+ return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertTitanStatusToStorageStatus(status))));
+ }
+
+ try {
+ for (ComponentInstanceProperty property : properties) {
+ Either<String, ResponseFormat> newPropertyValueEither = updatePropertyObjectValue(property, allDataTypes.left().value());
+ newPropertyValueEither.bimap(updatedValue ->
+ updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName),
+ responseFormat -> Either.right(responseFormat));
+ }
+ Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
+
+ if (updateContainerRes.isRight()) {
+ ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
+ resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
+ return resultOp;
+ }
+ resultOp = Either.left(properties);
+ return resultOp;
+
+ } finally {
+ if (resultOp == null || resultOp.isRight()) {
+ titanDao.rollback();
+ } else {
+ titanDao.commit();
+ }
+ // unlock resource
+ graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
+ }
+ }
}