summaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactResolverImpl.java14
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java515
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AttributeBusinessLogic.java1
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java55
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CassandraHealthCheck.java2
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java3
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java137
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java972
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java2
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java2
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DistributionMonitoringBusinessLogic.java9
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ElementBusinessLogic.java42
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupBusinessLogic.java12
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupTypeImportManager.java18
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java232
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java10
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InformationDeployedArtifactsBusinessLogic.java25
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java27
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeImportManager.java12
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductComponentInstanceBusinessLogic.java3
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PropertyBusinessLogic.java31
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java295
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java54
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResponseFormatManager.java3
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java39
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/VFComponentInstanceBusinessLogic.java7
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/generic/GenericTypeBusinessLogic.java91
27 files changed, 1685 insertions, 928 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactResolverImpl.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactResolverImpl.java
index 141ed95575..1c5a35453b 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactResolverImpl.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactResolverImpl.java
@@ -20,13 +20,6 @@
package org.openecomp.sdc.be.components.impl;
-import org.openecomp.sdc.be.components.ArtifactsResolver;
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.model.ArtifactDefinition;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.ComponentInstance;
-import org.openecomp.sdc.be.model.Service;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -34,6 +27,13 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.openecomp.sdc.be.components.ArtifactsResolver;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.Service;
+
@org.springframework.stereotype.Component("artifact-resolver")
public class ArtifactResolverImpl implements ArtifactsResolver {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java
index b7344e9911..bd7f61444d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java
@@ -63,6 +63,7 @@ import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
import org.openecomp.sdc.be.model.ArtifactDefinition;
import org.openecomp.sdc.be.model.ArtifactType;
import org.openecomp.sdc.be.model.Component;
@@ -111,12 +112,19 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.xml.sax.*;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
import org.yaml.snakeyaml.Yaml;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import com.sun.org.apache.xerces.internal.parsers.SAXParser;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
import fj.data.Either;
@@ -142,7 +150,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
// private static final Integer NON_HEAT_TIMEOUT = 0;
private static Logger log = LoggerFactory.getLogger(ArtifactsBusinessLogic.class.getName());
private Gson gson = new GsonBuilder().setPrettyPrinting().create();
-
+ private static XMLReader parser;
@javax.annotation.Resource
private IInterfaceLifecycleOperation interfaceLifecycleOperation;
@javax.annotation.Resource
@@ -198,7 +206,30 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
+
+ //SAX XML Parser initialization
+ static {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ SAXParser newSAXParser = null;
+
+ try {
+ newSAXParser = spf.newSAXParser();
+ parser = newSAXParser.getXMLReader();
+ } catch (ParserConfigurationException | SAXException e1) {
+ log.debug("SAX XML Parser could not been initialized", e1);
+ }
+
+ try {
+ parser.setFeature("http://apache.org/xml/features/validation/schema", false);
+ } catch (SAXNotRecognizedException e) {
+ log.debug("SAX Xml parser couldn't set feature: \"http://apache.org/xml/features/validation/schema\", false", e.getMessage(), e);
+
+ } catch (SAXNotSupportedException e) {
+ log.debug("SAX Xml parser couldn't set feature: \"http://apache.org/xml/features/validation/schema\", false", e.getMessage(), e);
+ }
+ }
+
public class ArtifactOperationInfo {
private ArtifactOperationEnum artifactOperationEnum;
@@ -438,8 +469,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
return result;
- case Create:
- return handleCreate(componentId, artifactInfo, operation, auditingAction, user, componentType, parent, origMd5, originData, interfaceName, operationName, shouldLock, inTransaction);
+ case Create:
+ return handleCreate(componentId, artifactInfo, operation, auditingAction, user, componentType, parent, origMd5, originData, interfaceName, operationName, shouldLock, inTransaction);
+ case Link:
+ return handleLink(componentId, artifactInfo, operation, auditingAction, user, componentType, parent, origMd5, originData, interfaceName, operationName, shouldLock, inTransaction);
}
return null;
}
@@ -603,16 +636,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
- /**
- *
- * @param componentId
- * @param artifactId
- * @param userId
- * @param componentType
- * @param parentId
- * @return
- */
-
public Either<ImmutablePair<String, byte[]>, ResponseFormat> handleDownloadToscaModelRequest(Component component, ArtifactDefinition csarArtifact) {
if (artifactGenerationRequired(component, csarArtifact)) {
Either<byte[], ResponseFormat> generated = csarUtils.createCsar(component, false, false);
@@ -839,6 +862,30 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
+ private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleLink(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, User user, ComponentTypeEnum componentType,
+ org.openecomp.sdc.be.model.Component parent, String origMd5, String originData, String interfaceType, String operationName, boolean shouldLock, boolean inTransaction) {
+
+ if (shouldLock) {
+ Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, "Upload Artifact - lock ");
+ if (lockComponent.isRight()) {
+ handleAuditing(auditingAction, parent, componentId, user, null, null, null, lockComponent.right().value(), componentType, null);
+ return Either.right(lockComponent.right().value());
+ }
+ }
+ Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
+
+ try {
+ resultOp = createAndLinkArtifact(parent, componentId, artifactInfo, user, componentType, auditingAction);
+ return resultOp;
+ } finally {
+ if (shouldLock) {
+ unlockComponent(resultOp, parent, inTransaction);
+ }
+
+ }
+
+ }
+
private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> lockComponentAndUpdateArtifact(String parentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user,
ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component parent, byte[] decodedPayload, String interfaceType, String operationName, boolean shouldLock, boolean inTransaction) {
@@ -920,9 +967,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
public void handleAuditing(AuditingActionEnum auditingActionEnum, Component component, String componentId, User user, ArtifactDefinition artifactDefinition, String prevArtifactUuid, String currentArtifactUuid, ResponseFormat responseFormat,
ComponentTypeEnum componentTypeEnum, String resourceInstanceName) {
- if (auditingActionEnum.getAuditingEsType().equals(AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE)) {
+ if (auditingActionEnum != null && auditingActionEnum.getAuditingEsType().equals(AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE)) {
return;
- }
+ }
EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = createArtifactAuditingFields(artifactDefinition, prevArtifactUuid, currentArtifactUuid);
@@ -1019,9 +1066,11 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_MD5));
}
} else {
- if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create) {
- log.debug("Missing md5 header during artifact create");
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_MD5));
+ if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
+ if (payload!=null && payload.length != 0) {
+ log.debug("Missing md5 header during artifact create");
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_MD5));
+ }
}
// Update metadata
if (payload != null && payload.length != 0) {
@@ -1061,7 +1110,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
// This is a patch to block possibility of updating service api fields
// through other artifacts flow
- if (operation.getArtifactOperationEnum() != ArtifactOperationEnum.Create) {
+ if (!ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
checkAndSetUnUpdatableFields(user, artifactInfo, currentArtifactInfo, (operationName != null ? ArtifactGroupTypeEnum.LIFE_CYCLE : ArtifactGroupTypeEnum.INFORMATIONAL));
} else {
checkCreateFields(user, artifactInfo, (operationName != null ? ArtifactGroupTypeEnum.LIFE_CYCLE : ArtifactGroupTypeEnum.INFORMATIONAL));
@@ -1073,7 +1122,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
// artifactGroupType is not allowed to be updated
- if (operation.getArtifactOperationEnum() != ArtifactOperationEnum.Create) {
+ if (!ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
Either<ArtifactDefinition, ResponseFormat> validateGroupType = validateOrSetArtifactGroupType(artifactInfo, currentArtifactInfo);
if (validateGroupType.isRight()) {
return Either.right(validateGroupType.right().value());
@@ -1083,7 +1132,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
NodeTypeEnum parentType = convertParentType(componentType);
// TODO TEMP !!!
- boolean isCreate = operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create;
+ boolean isCreate = ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum());
if (isDeploymentArtifact(artifactInfo)) {
Either<Boolean, ResponseFormat> deploymentValidationResult = validateDeploymentArtifact(parentComponent, componentId, user.getUserId(), isCreate, artifactInfo, currentArtifactInfo, parentType);
@@ -1159,11 +1208,11 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
if (StringUtils.isNotEmpty(artifactId)) {
foundArtifact = findArtifact(parentComponent, componentType, parentId, artifactId);
}
- if (foundArtifact != null && operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create) {
+ if (foundArtifact != null && ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
log.debug("Artifact {} already exist", artifactId);
result = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_EXIST, foundArtifact.getArtifactLabel()));
}
- if (foundArtifact == null && operation.getArtifactOperationEnum() != ArtifactOperationEnum.Create) {
+ if (foundArtifact == null && !ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
log.debug("The artifact {} was not found on parent {}. ", artifactId, parentId);
result = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ""));
}
@@ -1272,7 +1321,22 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
resultOp = Either.right(responseFormat);
}
}
+ boolean isNeedToDeleteArtifactFromDB = true;
if (resultOp == null) {
+
+ if(componentType == ComponentTypeEnum.RESOURCE_INSTANCE){
+ String instanceId = parentId;
+ Either<Boolean, ActionStatus> isOnlyResourceInstanceArtifact = isArtifactOnlyResourceInstanceArtifact(foundArtifact, fetchedContainerComponent, instanceId);
+
+ if (isOnlyResourceInstanceArtifact.isRight()) {
+ log.debug("Failed to delete or update the artifact {}. Parent uniqueId is {}", artifactId, parentId);
+ responseFormat = componentsUtils.getResponseFormatByArtifactId(isOnlyResourceInstanceArtifact.right().value(), foundArtifact.getArtifactDisplayName());
+ handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
+ resultOp = Either.right(responseFormat);
+ }
+ isNeedToDeleteArtifactFromDB = isOnlyResourceInstanceArtifact.left().value();
+ }
+
Either<ArtifactDataDefinition, StorageOperationStatus> updatedArtifactRes = deleteOrUpdateArtifactOnGraph(parent, parentId, artifactId, parentType, foundArtifact, needCloneRes.left().value());
if (updatedArtifactRes.isRight()) {
log.debug("Failed to delete or update the artifact {}. Parent uniqueId is {}", artifactId, parentId);
@@ -1285,13 +1349,16 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
if (resultOp == null && (!needCloneRes.left().value() && !isDuplicated)) {
- log.debug("Going to delete the artifact {} from the database. ", artifactId);
- CassandraOperationStatus cassandraStatus = artifactCassandraDao.deleteArtifact(esId);
- if (cassandraStatus != CassandraOperationStatus.OK) {
- log.debug("Failed to delete the artifact {} from the database. ", artifactId);
- responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(convertToStorageOperationStatus(cassandraStatus)), foundArtifact.getArtifactDisplayName());
- handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
- resultOp = Either.right(responseFormat);
+
+ if(isNeedToDeleteArtifactFromDB){
+ log.debug("Going to delete the artifact {} from the database. ", artifactId);
+ CassandraOperationStatus cassandraStatus = artifactCassandraDao.deleteArtifact(esId);
+ if (cassandraStatus != CassandraOperationStatus.OK) {
+ log.debug("Failed to delete the artifact {} from the database. ", artifactId);
+ responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(convertToStorageOperationStatus(cassandraStatus)), foundArtifact.getArtifactDisplayName());
+ handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
+ resultOp = Either.right(responseFormat);
+ }
}
}
if (resultOp == null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
@@ -1340,6 +1407,40 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
+ private Either<Boolean, ActionStatus> isArtifactOnlyResourceInstanceArtifact( ArtifactDefinition foundArtifact, Component parent, String instanceId) {
+ Either<Boolean, ActionStatus> result = Either.left(true);
+ ComponentInstance foundInstance = null;
+ Optional<ComponentInstance> componentInstanceOpt = parent.getComponentInstances().stream().filter(i -> i.getUniqueId().equals(instanceId)).findFirst();
+ if (!componentInstanceOpt.isPresent()) {
+ result = Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER);
+ } else {
+ foundInstance = componentInstanceOpt.get();
+ String componentUid = foundInstance.getComponentUid();
+ Either<Component, StorageOperationStatus> getContainerRes = toscaOperationFacade.getToscaElement(parent.getUniqueId());
+ if (getContainerRes.isRight()) {
+ log.debug("Failed to fetch the container component {}. ", componentUid);
+ result = Either.right(componentsUtils.convertFromStorageResponse(getContainerRes.right().value()));
+ }
+ Component origComponent = getContainerRes.left().value();
+ Map<String, ArtifactDefinition> deploymentArtifacts = origComponent.getDeploymentArtifacts();
+ if( deploymentArtifacts!= null && !deploymentArtifacts.isEmpty()){
+ Optional<String> op = deploymentArtifacts.keySet().stream().filter(a -> a.equals(foundArtifact.getArtifactLabel())).findAny();
+ if(op.isPresent()){
+ return Either.left(false);
+ }
+ }
+ Map<String, ArtifactDefinition> artifacts = origComponent.getArtifacts();
+ if( artifacts!= null && !artifacts.isEmpty()){
+ Optional<String> op = artifacts.keySet().stream().filter(a -> a.equals(foundArtifact.getArtifactLabel())).findAny();
+ if(op.isPresent()){
+ return Either.left(false);
+ }
+ }
+
+ }
+ return result;
+ }
+
private List<GroupDataDefinition> getUpdatedGroups(String artifactId, ArtifactDefinition foundArtifact, List<GroupDefinition> groups) {
List<GroupDataDefinition> updatedGroups = new ArrayList<>();
boolean isUpdated = false;
@@ -1393,7 +1494,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
if (isMandatory) {
log.debug("Going to update mandatory artifact {} from the component {}", artifactId, parentId);
resetMandatoryArtifactFields(foundArtifact);
- result = artifactToscaOperation.updateArtifactOnGraph(componentId, foundArtifact, parentType, artifactId, instanceId, true);
+ result = artifactToscaOperation.updateArtifactOnGraph(componentId, foundArtifact, parentType, artifactId, instanceId, true, true);
} else if (cloneIsNeeded) {
log.debug("Going to clone artifacts and to delete the artifact {} from the component {}", artifactId, parentId);
result = artifactToscaOperation.deleteArtifactWithClonnigOnGraph(componentId, foundArtifact, parentType, instanceId, false);
@@ -1540,13 +1641,13 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
private Either<ArtifactDefinition, ResponseFormat> fetchCurrentArtifact(String parentId, ArtifactOperationInfo operation, String artifactId) {
Either<ArtifactDefinition, StorageOperationStatus> artifactById = artifactToscaOperation.getArtifactById(parentId, artifactId);
- if (!(operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create) && artifactById.isRight()) {
+ if (!(ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) && artifactById.isRight()) {
// in case of update artifact must be
BeEcompErrorManager.getInstance().logBeArtifactMissingError("Artifact Update / Upload", artifactId);
log.debug("Failed to fetch artifact {}. error: {}", artifactId, artifactById.right().value());
return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(artifactById.right().value()), artifactId));
}
- if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create && artifactById.isLeft()) {
+ if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && artifactById.isLeft()) {
log.debug("Artifact {} already exist", artifactId);
return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_EXIST, artifactById.left().value().getArtifactLabel()));
}
@@ -1567,7 +1668,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
log.debug("missing artifact logical name for component {}", componentId);
return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_DATA, ARTIFACT_LABEL));
}
- if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create && !artifactInfo.getMandatory()) {
+ if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && !artifactInfo.getMandatory()) {
if (operationName != null) {
if (artifactInfo.getArtifactLabel() != null && !operationName.equals(artifactInfo.getArtifactLabel())) {
@@ -1647,6 +1748,52 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
// ***************************************************************
+ private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createAndLinkArtifact(org.openecomp.sdc.be.model.Component parent, String parentId, ArtifactDefinition artifactInfo, User user,
+ ComponentTypeEnum componentTypeEnum, AuditingActionEnum auditingActionEnum) {
+ Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
+ Either<ArtifactDefinition, Operation> insideEither = null;
+ ComponentInstance foundInstance = findComponentInstance(parentId, parent);
+ String instanceId = null;
+ String instanceName = null;
+ if (foundInstance != null) {
+ instanceId = foundInstance.getUniqueId();
+ instanceName = foundInstance.getName();
+ }
+ boolean isLeft = false;
+ String artifactUniqueId = null;
+ StorageOperationStatus error = null;
+ // information/deployment/api aritfacts
+ log.trace("Try to create entry on graph");
+ NodeTypeEnum nodeType = convertParentType(componentTypeEnum);
+ Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.addArifactToComponent(artifactInfo, parent.getUniqueId(), nodeType, true, instanceId);
+
+ isLeft = result.isLeft();
+ if (isLeft) {
+ artifactUniqueId = result.left().value().getUniqueId();
+ result.left().value();
+
+ insideEither = Either.left(result.left().value());
+ resultOp = Either.left(insideEither);
+
+ error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentTypeEnum);
+ if (error != StorageOperationStatus.OK) {
+ isLeft = false;
+ }
+
+ } if (isLeft) {
+ ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
+ handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, artifactUniqueId, artifactUniqueId, responseFormat, componentTypeEnum, instanceName);
+ return resultOp;
+ } else{
+ log.debug("Failed to create entry on graph for artifact {}", artifactInfo.getArtifactName());
+ ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(error), artifactInfo.getArtifactDisplayName());
+ handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, null, responseFormat, componentTypeEnum, instanceName);
+ resultOp = Either.right(responseFormat);
+ return resultOp;
+
+ }
+ }
+
private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createArtifact(org.openecomp.sdc.be.model.Component parent, String parentId, ArtifactDefinition artifactInfo, byte[] decodedPayload, User user,
ComponentTypeEnum componentTypeEnum, AuditingActionEnum auditingActionEnum, String interfaceType, String operationName) {
@@ -2039,27 +2186,20 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
- @SuppressWarnings("restriction")
public boolean isValidXml(byte[] xmlToParse) {
- XMLReader parser = new SAXParser();
- try {
- parser.setFeature("http://apache.org/xml/features/validation/schema", false);
- } catch (SAXNotRecognizedException e) {
- e.printStackTrace();
- log.debug("Xml parser couldn't set feature: \"http://apache.org/xml/features/validation/schema\", false", e.getMessage(), e);
-
- } catch (SAXNotSupportedException e) {
- e.printStackTrace();
- log.debug("Xml parser couldn't set feature: \"http://apache.org/xml/features/validation/schema\", false", e.getMessage(), e);
-
+ if(parser == null) {
+ log.debug("SAX XML Parser have not been initialized");
+ return false;
}
boolean isXmlValid = true;
+
try {
parser.parse(new InputSource(new ByteArrayInputStream(xmlToParse)));
} catch (IOException | SAXException e) {
log.debug("Xml is invalid : {}", e.getMessage(), e);
isXmlValid = false;
}
+
return isXmlValid;
}
@@ -2898,22 +3038,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
- public StorageOperationStatus deleteAllComponentArtifactsIfNotOnGraph(List<ArtifactDefinition> artifacts) {
-
- if (artifacts != null && !artifacts.isEmpty()) {
- for (ArtifactDefinition artifactDefinition : artifacts) {
- String esId = artifactDefinition.getEsId();
- if (esId != null && !esId.isEmpty()) {
- StorageOperationStatus deleteIfNotOnGraph = deleteIfNotOnGraph(artifactDefinition.getUniqueId(), esId, false);
- if (!deleteIfNotOnGraph.equals(StorageOperationStatus.OK)) {
- return deleteIfNotOnGraph;
- }
- }
- }
- }
- return StorageOperationStatus.OK;
- }
-
private Operation convertToOperation(ArtifactDefinition artifactInfo, String operationName) {
Operation op = new Operation();
long time = System.currentTimeMillis();
@@ -2933,31 +3057,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return newArtifactName;
}
- public StorageOperationStatus deleteIfNotOnGraph(String artifactId, String artifactEsId, boolean deleteOnlyPayload) {
- log.debug("deleteIfNotOnGraph: delete only payload = {}", deleteOnlyPayload);
- // Either<ArtifactData, TitanOperationStatus> checkArtifactNode = titanDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.ArtifactRef), artifactId, ArtifactData.class);
- // if ((artifactEsId != null && !artifactEsId.isEmpty())) {
- // boolean isNotExistOnGraph = checkArtifactNode.isRight() && checkArtifactNode.right().value().equals(TitanOperationStatus.NOT_FOUND);
- //
- // if ((isNotExistOnGraph) || (checkArtifactNode.left().value().getArtifactDataDefinition().getMandatory() && deleteOnlyPayload)
- // || (ArtifactGroupTypeEnum.SERVICE_API.equals(checkArtifactNode.left().value().getArtifactDataDefinition().getArtifactGroupType()) && deleteOnlyPayload)) {
- // // last one. need to delete in ES
- // log.debug("Entry on graph is deleted. Delete artifact in ES for id = {}", artifactEsId);
- // artifactCassandraDao.deleteArtifact(artifactEsId);
- // return StorageOperationStatus.OK;
- // // return
- // // componentsUtils.getResponseFormatByResourceId(ActionStatus.OK,
- // // resourceId);
- //
- // } else {
- // log.debug("Entry on graph is deleted. Exist more connections on this artifact. Don't delete artifact in ES for id = {}", artifactEsId);
- // return StorageOperationStatus.OK;
- // }
- //
- // }
- return StorageOperationStatus.OK;
- }
-
// download by MSO
public Either<byte[], ResponseFormat> downloadRsrcArtifactByNames(String serviceName, String serviceVersion, String resourceName, String resourceVersion, String artifactName) {
@@ -3512,35 +3611,46 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
String payload = generateHeatEnvPayload(artifactDefinition);
String prevUUID = artifactDefinition.getArtifactUUID();
ArtifactDefinition clonedBeforeGenerate = new ArtifactDefinition(artifactDefinition);
- Either<ArtifactDefinition, ResponseFormat> generateResult = generateAndSaveHeatEnvArtifact(artifactDefinition, payload, componentType, component, resourceInstanceName, modifier, shouldLock, instanceId);
- if (generateResult.isLeft()) {
- ArtifactDefinition updatedArtDef = generateResult.left().value();
- if (!prevUUID.equals(updatedArtDef.getArtifactUUID())) {
- List<ComponentInstance> componentInstances = component.getComponentInstances();
- if (componentInstances != null) {
- Optional<ComponentInstance> findFirst = componentInstances.stream().filter(ci -> ci.getUniqueId().equals(instanceId)).findFirst();
- if (findFirst.isPresent()) {
- ComponentInstance relevantInst = findFirst.get();
- List<GroupInstance> updatedGroupInstances = getUpdatedGroupInstances(updatedArtDef.getUniqueId(), clonedBeforeGenerate, relevantInst.getGroupInstances());
-
- if (CollectionUtils.isNotEmpty(updatedGroupInstances)) {
- updatedGroupInstances.forEach(gi -> {
- gi.getGroupInstanceArtifacts().add(updatedArtDef.getUniqueId());
- gi.getGroupInstanceArtifactsUuid().add(updatedArtDef.getArtifactUUID());
- });
- Either<List<GroupInstance>, StorageOperationStatus> status = toscaOperationFacade.updateGroupInstancesOnComponent(component, componentType, instanceId, updatedGroupInstances);
- if (status.isRight()) {
- log.debug("Failed to update groups of the component {}. ", component.getUniqueId());
- ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(status.right().value()), clonedBeforeGenerate.getArtifactDisplayName());
- return Either.right(responseFormat);
- }
- }
- }
- }
- }
- }
+ return generateAndSaveHeatEnvArtifact(artifactDefinition, payload, componentType, component, resourceInstanceName, modifier, shouldLock, instanceId)
+ .left()
+ .bind(artifactDef -> updateArtifactOnGroupInstance(componentType, component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
+ }
- return generateResult;
+ public Either<ArtifactDefinition, ResponseFormat> forceGenerateHeatEnvArtifact(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName, User modifier,
+ boolean shouldLock, String instanceId) {
+ String payload = generateHeatEnvPayload(artifactDefinition);
+ String prevUUID = artifactDefinition.getArtifactUUID();
+ ArtifactDefinition clonedBeforeGenerate = new ArtifactDefinition(artifactDefinition);
+ return forceGenerateAndSaveHeatEnvArtifact(artifactDefinition, payload, componentType, component, resourceInstanceName, modifier, shouldLock, instanceId)
+ .left()
+ .bind(artifactDef -> updateArtifactOnGroupInstance(componentType, component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
+ }
+
+ private Either<ArtifactDefinition, ResponseFormat> updateArtifactOnGroupInstance(ComponentTypeEnum componentType, Component component, String instanceId, String prevUUID, ArtifactDefinition clonedBeforeGenerate, ArtifactDefinition updatedArtDef) {
+ if (!prevUUID.equals(updatedArtDef.getArtifactUUID())) {
+ List<ComponentInstance> componentInstances = component.getComponentInstances();
+ if (componentInstances != null) {
+ Optional<ComponentInstance> findFirst = componentInstances.stream().filter(ci -> ci.getUniqueId().equals(instanceId)).findFirst();
+ if (findFirst.isPresent()) {
+ ComponentInstance relevantInst = findFirst.get();
+ List<GroupInstance> updatedGroupInstances = getUpdatedGroupInstances(updatedArtDef.getUniqueId(), clonedBeforeGenerate, relevantInst.getGroupInstances());
+
+ if (CollectionUtils.isNotEmpty(updatedGroupInstances)) {
+ updatedGroupInstances.forEach(gi -> {
+ gi.getGroupInstanceArtifacts().add(updatedArtDef.getUniqueId());
+ gi.getGroupInstanceArtifactsUuid().add(updatedArtDef.getArtifactUUID());
+ });
+ Either<List<GroupInstance>, StorageOperationStatus> status = toscaOperationFacade.updateGroupInstancesOnComponent(component, componentType, instanceId, updatedGroupInstances);
+ if (status.isRight()) {
+ log.debug("Failed to update groups of the component {}. ", component.getUniqueId());
+ ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(status.right().value()), clonedBeforeGenerate.getArtifactDisplayName());
+ return Either.right(responseFormat);
+ }
+ }
+ }
+ }
+ }
+ return Either.left(updatedArtDef);
}
private String generateHeatEnvPayload(ArtifactDefinition artifactDefinition) {
@@ -3628,6 +3738,13 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
+ public Either<ArtifactDefinition, ResponseFormat> forceGenerateAndSaveHeatEnvArtifact(ArtifactDefinition artifactDefinition, String payload, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName,
+ User modifier, boolean shouldLock, String instanceId) {
+ return generateArtifactPayload(artifactDefinition, componentType, component, resourceInstanceName, modifier, shouldLock, System::currentTimeMillis,
+ () -> createEsHeatEnvArtifactDataFromString(artifactDefinition, payload), instanceId);
+
+ }
+
protected Either<ArtifactDefinition, ResponseFormat> generateArtifactPayload(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName, User modifier,
boolean shouldLock, Supplier<Long> payloadUpdateDateGen, Supplier<Either<ESArtifactData, ResponseFormat>> esDataCreator, String instanceId) {
@@ -3743,6 +3860,57 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return Either.left(artifactDefinition);
}
+
+ public Map<String, Object> buildJsonForUpdateArtifact(ArtifactDefinition artifactDef, ArtifactGroupTypeEnum artifactGroupType, List<ArtifactTemplateInfo> updatedRequiredArtifacts) {
+ return this.buildJsonForUpdateArtifact(artifactDef.getUniqueId(), artifactDef.getArtifactName(), artifactDef.getArtifactType(), artifactGroupType, artifactDef.getArtifactLabel(), artifactDef.getArtifactDisplayName(),
+ artifactDef.getDescription(), artifactDef.getPayloadData(), updatedRequiredArtifacts, artifactDef.getListHeatParameters());
+
+ }
+
+ public Map<String, Object> buildJsonForUpdateArtifact(String artifactId, String artifactName, String artifactType, ArtifactGroupTypeEnum artifactGroupType, String label, String displayName, String description, byte[] artifactContent,
+ List<ArtifactTemplateInfo> updatedRequiredArtifacts, List<HeatParameterDefinition> heatParameters) {
+
+ Map<String, Object> json = new HashMap<String, Object>();
+ if (artifactId != null && !artifactId.isEmpty())
+ json.put(Constants.ARTIFACT_ID, artifactId);
+
+ json.put(Constants.ARTIFACT_NAME, artifactName);
+ json.put(Constants.ARTIFACT_TYPE, artifactType);
+ json.put(Constants.ARTIFACT_DESCRIPTION, description);
+
+ if (artifactContent != null) {
+ String encodedPayload = new String(artifactContent);
+
+ // boolean isEncoded = GeneralUtility.isBase64Encoded(artifactContentent);
+ // if (!isEncoded) {
+ log.debug("payload is encoded. perform decode");
+ encodedPayload = Base64.encodeBase64String(artifactContent);
+ json.put(Constants.ARTIFACT_PAYLOAD_DATA, encodedPayload);
+ }
+ // }
+ json.put(Constants.ARTIFACT_DISPLAY_NAME, displayName);
+ json.put(Constants.ARTIFACT_LABEL, label);
+ json.put(Constants.ARTIFACT_GROUP_TYPE, artifactGroupType.getType());
+ json.put(Constants.REQUIRED_ARTIFACTS, (updatedRequiredArtifacts == null || updatedRequiredArtifacts.isEmpty()) ? new ArrayList<>()
+ : updatedRequiredArtifacts.stream().filter(e -> e.getType().equals(ArtifactTypeEnum.HEAT_ARTIFACT.getType()) || e.getType().equals(ArtifactTypeEnum.HEAT_NESTED.getType())).map(e -> e.getFileName()).collect(Collectors.toList()));
+ json.put(Constants.ARTIFACT_HEAT_PARAMS, (heatParameters == null || heatParameters.isEmpty()) ? new ArrayList<>()
+ : heatParameters);
+ return json;
+ }
+
+ public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateResourceInstanceArtifactNoContent(String resourceId, Component containerComponent, User user, Map<String, Object> json, ArtifactOperationInfo operation, ArtifactDefinition artifactInfo) {
+
+ String jsonStr = gson.toJson(json);
+ ArtifactDefinition artifactDefinitionFromJson = artifactInfo == null? RepresentationUtils.convertJsonToArtifactDefinition(jsonStr, ArtifactDefinition.class) : artifactInfo;
+ String artifactUniqueId = artifactDefinitionFromJson == null ? null : artifactDefinitionFromJson.getUniqueId();
+ Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = validateAndHandleArtifact(resourceId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactUniqueId,
+ artifactDefinitionFromJson, null, jsonStr, null, null, null, user, containerComponent, false, false, true);
+ if (uploadArtifactToService.isRight())
+ return Either.right(uploadArtifactToService.right().value());
+
+ return Either.left(uploadArtifactToService.left().value());
+ }
+
private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleUpdateHeatEnv(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user, ComponentTypeEnum componentType,
org.openecomp.sdc.be.model.Component parent, String originData, String origMd5, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction) {
convertParentType(componentType);
@@ -3789,7 +3957,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
try {
- resultOp = updateHeatEnvParams(componentId, artifactId, artifactInfo, user, auditingAction, parent, componentType, currArtifact, origMd5, inTransaction);
+ resultOp = updateHeatEnvParams(componentId, artifactId, artifactInfo, user, auditingAction, parent, componentType, origMd5);
return resultOp;
} finally {
@@ -3812,7 +3980,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateHeatEnvParams(String componentId, String artifactId, ArtifactDefinition artifactInfo, User user, AuditingActionEnum auditingAction, Component parent,
- ComponentTypeEnum componentType, ArtifactDefinition currArtifact1, String origMd5, boolean inTransaction) {
+ ComponentTypeEnum componentType, String origMd5) {
Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
Either<ArtifactDefinition, Operation> insideEither = null;
@@ -3859,22 +4027,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
if (updatedHeatEnvParams != null && !updatedHeatEnvParams.isEmpty()) {
- String paramName;
// fill reduced heat env parameters List for updating
- for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
- paramName = heatEnvParam.getName();
- for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
- if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
- String updatedParamValue = heatEnvParam.getCurrentValue();
- if (updatedParamValue != null && updatedParamValue.equals("")) { // reset
- currHeatParam.setCurrentValue(heatEnvParam.getDefaultValue());
- } else if (updatedParamValue != null) {
- currHeatParam.setCurrentValue(updatedParamValue);
- }
- }
- }
- }
- //currArtifact.setHeatParamsUpdateDate(System.currentTimeMillis());
+ replaceCurrHeatValueWithUpdatedValue(currentHeatEnvParams, updatedHeatEnvParams);
+ currArtifact.setHeatParamsUpdateDate(System.currentTimeMillis());
currArtifact.setListHeatParameters(currentHeatEnvParams);
Either<ArtifactDefinition, StorageOperationStatus> updateArifactRes = artifactToscaOperation.updateArifactOnResource(currArtifact, parent.getUniqueId(), currArtifact.getUniqueId(), componentType.getNodeType(), componentId);
@@ -3899,8 +4054,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
}
- // }
-
insideEither = Either.left(currArtifact);
resultOp = Either.left(insideEither);
ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
@@ -3908,6 +4061,18 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return resultOp;
}
+ private void replaceCurrHeatValueWithUpdatedValue(List<HeatParameterDefinition> currentHeatEnvParams, List<HeatParameterDefinition> updatedHeatEnvParams) {
+ for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
+ String paramName = heatEnvParam.getName();
+ for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
+ if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
+ String updatedParamValue = heatEnvParam.getCurrentValue();
+ currHeatParam.setCurrentValue(updatedParamValue);
+ }
+ }
+ }
+ }
+
private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateHeatParams(String componentId, String artifactId, ArtifactDefinition artifactEnvInfo, User user, AuditingActionEnum auditingAction, Component parent,
ComponentTypeEnum componentType, ArtifactDefinition currHeatArtifact, String origMd5, boolean needToUpdateGroup) {
@@ -3929,9 +4094,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
}
ESArtifactData esArtifactData = artifactfromES.left().value();
- byte[] data = esArtifactData.getDataAsArray();
-
-
ArtifactDefinition updatedHeatArt = currHeatArtifact;
List<HeatParameterDefinition> updatedHeatEnvParams = artifactEnvInfo.getListHeatParameters();
@@ -4149,7 +4311,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
*
* @param componentType
* @param componentUuid
- * @param resourceName
+ * @param resourceInstanceName
* @param artifactUUID
* @param auditAdditionalParam
* @return
@@ -4574,15 +4736,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return artifactId;
}
- public Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder(ArtifactDefinition artifact, String envType, String parentId, NodeTypeEnum parentType, String parentName, User user, Component component,
- Map<String, String> existingEnvVersions) {
- return createHeatEnvPlaceHolder(artifact, envType, parentId, parentType, parentName, user, component, existingEnvVersions, true);
-
- }
-
@SuppressWarnings("unchecked")
- public Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder(ArtifactDefinition artifact, String envType, String parentId, NodeTypeEnum parentType, String parentName, User user, Component component,
- Map<String, String> existingEnvVersions, boolean overrideId) {
+ public Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder(ArtifactDefinition heatArtifact, String envType, String parentId, NodeTypeEnum parentType, String parentName, User user, Component component,
+ Map<String, String> existingEnvVersions) {
Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getDeploymentResourceInstanceArtifacts();
if (deploymentResourceArtifacts == null) {
log.debug("no deployment artifacts are configured for generated artifacts");
@@ -4594,64 +4750,55 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
}
- String envLabel = (artifact.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
- String parentIdParam = parentId;
- if (!overrideId) {
- parentIdParam = null;
- }
- Either<ArtifactDefinition, ResponseFormat> createArtifactPlaceHolder = createArtifactPlaceHolderInfo(parentIdParam, envLabel, placeHolderData, user.getUserId(), ArtifactGroupTypeEnum.DEPLOYMENT, true);
+ String envLabel = (heatArtifact.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
+ Either<ArtifactDefinition, ResponseFormat> createArtifactPlaceHolder = createArtifactPlaceHolderInfo(parentId, envLabel, placeHolderData, user.getUserId(), ArtifactGroupTypeEnum.DEPLOYMENT, true);
if (createArtifactPlaceHolder.isRight()) {
return Either.right(createArtifactPlaceHolder.right().value());
}
ArtifactDefinition artifactHeatEnv = createArtifactPlaceHolder.left().value();
- if (!overrideId) {
- // fix for migration only!!!! create heat env placeholder according to heat id.
- artifactHeatEnv.setUniqueId(artifact.getUniqueId() + HEAT_ENV_SUFFIX);
- }
-
- artifactHeatEnv.setGeneratedFromId(artifact.getUniqueId());
+ artifactHeatEnv.setGeneratedFromId(heatArtifact.getUniqueId());
artifactHeatEnv.setHeatParamsUpdateDate(System.currentTimeMillis());
artifactHeatEnv.setTimeout(0);
- buildHeatEnvFileName(artifact, artifactHeatEnv, placeHolderData);
+ buildHeatEnvFileName(heatArtifact, artifactHeatEnv, placeHolderData);
// rbetzer - keep env artifactVersion - changeComponentInstanceVersion flow
handleEnvArtifactVersion(artifactHeatEnv, existingEnvVersions);
- // clone heat parameters in case of heat env only not VF heat env
- if (envType.equals(HEAT_ENV_NAME)) {
- artifactHeatEnv.setHeatParameters(artifact.getHeatParameters());
- }
- ArtifactDefinition artifactDefinition;
+ ArtifactDefinition heatEnvPlaceholder;
// Evg : for resource instance artifact will be added later as block with other env artifacts from BL
if (parentType != NodeTypeEnum.ResourceInstance) {
- Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact = addHeatEnvArtifact(artifactHeatEnv, artifact, component.getUniqueId(), parentType, parentId);
+ Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact = addHeatEnvArtifact(artifactHeatEnv, heatArtifact, component.getUniqueId(), parentType, parentId);
if (addHeatEnvArtifact.isRight()) {
log.debug("failed to create heat env artifact on resource instance");
return Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(addHeatEnvArtifact.right().value(), false), "", null));
}
- artifactDefinition = createArtifactPlaceHolder.left().value();
+ heatEnvPlaceholder = createArtifactPlaceHolder.left().value();
} else {
- artifactDefinition = artifactHeatEnv;
- artifactToscaOperation.generateUUID(artifactDefinition, artifactDefinition.getArtifactVersion());
- }
-
- if (artifact.getHeatParameters() != null) {
- List<HeatParameterDefinition> heatEnvParameters = new ArrayList<HeatParameterDefinition>();
- for (HeatParameterDefinition parameter : artifact.getListHeatParameters()) {
- HeatParameterDefinition heatEnvParameter = new HeatParameterDefinition(parameter);
- heatEnvParameter.setDefaultValue(parameter.getCurrentValue());
- heatEnvParameters.add(heatEnvParameter);
- }
- artifactDefinition.setListHeatParameters(heatEnvParameters);
+ heatEnvPlaceholder = artifactHeatEnv;
+ artifactToscaOperation.generateUUID(heatEnvPlaceholder, heatEnvPlaceholder.getArtifactVersion());
+ setHeatCurrentValuesOnHeatEnvDefaultValues(heatArtifact, heatEnvPlaceholder);
}
-
// audit
- EnumMap<AuditingFieldsKeysEnum, Object> artifactAuditingFields = createArtifactAuditingFields(artifactDefinition, "", artifactDefinition.getUniqueId());
+ EnumMap<AuditingFieldsKeysEnum, Object> artifactAuditingFields = createArtifactAuditingFields(heatEnvPlaceholder, "", heatEnvPlaceholder.getUniqueId());
artifactAuditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, parentName);
ComponentTypeEnum componentType = component.getComponentType();
if (parentType == NodeTypeEnum.ResourceInstance) {
componentType = ComponentTypeEnum.RESOURCE_INSTANCE;
}
componentsUtils.auditComponent(componentsUtils.getResponseFormat(ActionStatus.OK), user, component, "", "", AuditingActionEnum.ARTIFACT_UPLOAD, componentType, artifactAuditingFields);
- return Either.left(artifactDefinition);
+ return Either.left(heatEnvPlaceholder);
+ }
+
+ private void setHeatCurrentValuesOnHeatEnvDefaultValues(ArtifactDefinition artifact, ArtifactDefinition artifactDefinition) {
+ if (artifact.getListHeatParameters() == null) {
+ return;
+ }
+ List<HeatParameterDefinition> heatEnvParameters = new ArrayList<>();
+ for (HeatParameterDefinition parameter : artifact.getListHeatParameters()) {
+ HeatParameterDefinition heatEnvParameter = new HeatParameterDefinition(parameter);
+ heatEnvParameter.setDefaultValue(parameter.getCurrentValue());
+ heatEnvParameter.setCurrentValue(null);
+ heatEnvParameters.add(heatEnvParameter);
+ }
+ artifactDefinition.setListHeatParameters(heatEnvParameters);
}
private void buildHeatEnvFileName(ArtifactDefinition heatArtifact, ArtifactDefinition heatEnvArtifact, Map<String, Object> placeHolderData) {
@@ -4707,7 +4854,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
if (actionResult.isRight()) {
log.debug("Failed to upload artifact to component with type {} and name {}. Status is {}. ", componentType, component.getName(), actionResult.right().value());
errorWrapper.setInnerElement(actionResult.right().value());
- if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create) {
+ if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
vfcsNewCreatedArtifacts.addAll(uploadedArtifacts);
}
break;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AttributeBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AttributeBusinessLogic.java
index 5b8a10a03e..2e14028338 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AttributeBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AttributeBusinessLogic.java
@@ -34,7 +34,6 @@ import org.openecomp.sdc.be.model.Resource;
import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
-
import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
index 5a4961b24f..14c451a3b0 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
@@ -20,8 +20,12 @@
package org.openecomp.sdc.be.components.impl;
-import com.google.gson.JsonElement;
-import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -36,7 +40,16 @@ 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.impl.ComponentsUtils;
-import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstanceInput;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.GroupProperty;
+import org.openecomp.sdc.be.model.IComplexDefaultValue;
+import org.openecomp.sdc.be.model.IPropertyInputCommon;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
import org.openecomp.sdc.be.model.jsontitan.operations.ArtifactsOperations;
import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
@@ -65,11 +78,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
+import com.google.gson.JsonElement;
+
+import fj.data.Either;
public abstract class BaseBusinessLogic {
@@ -287,34 +298,6 @@ public abstract class BaseBusinessLogic {
return Either.left(componentFound.left().value());
}
-// protected Either<? extends org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists(String componentId, ComponentTypeEnum componentType, ComponentParametersView componentParametersView, String userId,
-// AuditingActionEnum auditingAction, User user) {
-//
-// ComponentOperation componentOperation = getComponentOperation(componentType);
-//
-// if (componentOperation == null) {
-// ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-// log.debug("addGroup - not supported component type {}", componentType);
-// return Either.right(responseFormat);
-// }
-// Either<? extends org.openecomp.sdc.be.model.Component, StorageOperationStatus> componentResult = componentOperation.getComponent(componentId, componentParametersView, true);
-//
-// if (componentResult.isRight()) {
-// ActionStatus status = (componentType.equals(ComponentTypeEnum.RESOURCE)) ? ActionStatus.RESOURCE_NOT_FOUND : ActionStatus.SERVICE_NOT_FOUND;
-//
-// ResponseFormat responseFormat = componentsUtils.getResponseFormat(status, componentId);
-//
-// log.debug("Service not found, serviceId {}", componentId);
-// // ComponentTypeEnum componentForAudit =
-// // (componentType.equals(ComponentTypeEnum.RESOURCE)) ?
-// // ComponentTypeEnum.RESOURCE : ComponentTypeEnum.SERVICE;
-// // handleAuditing(auditingAction, null, componentId, user, null,
-// // null, artifactId, responseFormat, componentForAudit, null);
-// return Either.right(responseFormat);
-// }
-// return Either.left(componentResult.left().value());
-// }
-
public Either<Boolean, ResponseFormat> validateCanWorkOnComponent(Component component, String userId) {
Either<Boolean, ResponseFormat> canWork = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
if (component.getLifecycleState() != LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CassandraHealthCheck.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CassandraHealthCheck.java
index 237ec6d5fe..1f5770856b 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CassandraHealthCheck.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CassandraHealthCheck.java
@@ -1,8 +1,6 @@
package org.openecomp.sdc.be.components.impl;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java
index f97b4cf3f1..31c665686e 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java
@@ -31,8 +31,6 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
-import jersey.repackaged.com.google.common.base.Function;
-
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -52,6 +50,7 @@ import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;
import fj.data.Either;
+import jersey.repackaged.com.google.common.base.Function;
@Component("commonImportManager")
public class CommonImportManager {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java
index 108e03c274..40e67aa876 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java
@@ -31,14 +31,21 @@ import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.config.ConfigurationManager;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
+import org.openecomp.sdc.be.dao.utils.MapUtil;
import org.openecomp.sdc.be.datamodel.api.HighestFilterEnum;
import org.openecomp.sdc.be.datatypes.components.ServiceMetadataDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
-import org.openecomp.sdc.be.datatypes.enums.*;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.FilterKeyEnum;
+import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
import org.openecomp.sdc.be.model.ArtifactDefinition;
import org.openecomp.sdc.be.model.CapReqDef;
@@ -82,6 +89,12 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
@Autowired
protected ComponentCache componentCache;
+ @Autowired
+ private GenericTypeBusinessLogic genericTypeBusinessLogic;
+
+ public void setGenericTypeBusinessLogic(GenericTypeBusinessLogic genericTypeBusinessLogic) {
+ this.genericTypeBusinessLogic = genericTypeBusinessLogic;
+ }
private static Logger log = LoggerFactory.getLogger(ComponentBusinessLogic.class.getName());
@@ -116,7 +129,6 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
componentsUtils.auditComponentAdmin(responseFormat, user, component, "", "", auditAction, component.getComponentType());
return Either.right(responseFormat);
}
- user = userResult.left().value();
return userResult;
}
@@ -502,17 +514,6 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
return Either.left(true);
}
- /***
- * Fetches Component From the DB
- *
- * @param componentId
- * @param componentTypeEnum
- * @return
- */
- public <R extends Component> Either<R, StorageOperationStatus> getComponent(String componentId, ComponentTypeEnum componentTypeEnum) {
- return toscaOperationFacade.getToscaElement(componentId);
- }
-
public Either<CapReqDef, ResponseFormat> getRequirementsAndCapabilities(String componentId, ComponentTypeEnum componentTypeEnum, String userId) {
Either<User, ResponseFormat> resp = validateUserExists(userId, "create Component Instance", false);
@@ -545,7 +546,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
List<String> componentsUidToFetch = new ArrayList<>();
componentsUidToFetch.addAll(componentUids);
- if (componentsUidToFetch.size() > 0) {
+ if (!componentsUidToFetch.isEmpty()) {
log.debug("Number of Components to fetch from graph is {}", componentsUidToFetch.size());
Boolean isHighest = isHighest(highestFilter);
Either<List<Component>, StorageOperationStatus> nonCheckoutCompResponse = toscaOperationFacade.getLatestVersionNotAbstractComponents(isAbstractAbstract, isHighest, componentTypeEnum, internalComponentType, componentsUidToFetch);
@@ -617,7 +618,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
public void setToscaArtifactsPlaceHolders(Component component, User user) {
Map<String, ArtifactDefinition> artifactMap = component.getToscaArtifacts();
if (artifactMap == null) {
- artifactMap = new HashMap<String, ArtifactDefinition>();
+ artifactMap = new HashMap<>();
}
String componentUniqueId = component.getUniqueId();
String componentSystemName = component.getSystemName();
@@ -628,7 +629,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
for (Entry<String, Object> artifactInfoMap : toscaArtifacts.entrySet()) {
Map<String, Object> artifactInfo = (Map<String, Object>) artifactInfoMap.getValue();
ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(componentUniqueId, artifactInfoMap.getKey(), artifactInfo, user, ArtifactGroupTypeEnum.TOSCA);
- artifactDefinition.setArtifactName(componentType + "-" + componentSystemName + artifactInfo.get("artifactName"));
+ artifactDefinition.setArtifactName(ValidationUtils.normalizeFileName(componentType + "-" + componentSystemName + artifactInfo.get("artifactName")));
artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
}
}
@@ -695,7 +696,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
List<Component> components = latestVersionEither.left().value();
- Component component = components.stream().filter(c -> c.isHighestVersion()).findFirst().orElse(null);
+ Component component = components.stream().filter(Component::isHighestVersion).findFirst().orElse(null);
if(component == null){
component = components.stream().filter(c -> c.getLifecycleState() == LifecycleStateEnum.CERTIFIED).findFirst().orElse(null);
}
@@ -785,7 +786,6 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
protected Either<List<String>, ResponseFormat> deleteMarkedComponents(ComponentTypeEnum componentType) {
-// List<String> deletedComponents = new ArrayList<String>();
log.trace("start deleteMarkedComponents");
Either<List<String>, StorageOperationStatus> deleteMarkedElements = toscaOperationFacade.deleteMarkedElements(componentType);
@@ -794,30 +794,12 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deleteMarkedElements.right().value(), componentType));
return Either.right(responseFormat);
}
-// ComponentOperation componentOperation = getComponentOperation(componentType);
-// Either<List<String>, StorageOperationStatus> resourcesToDelete = componentOperation.getAllComponentsMarkedForDeletion();
-// if (resourcesToDelete.isRight()) {
-// ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(resourcesToDelete.right().value(), componentType));
-// return Either.right(responseFormat);
-// }
-//
-// for (String resourceToDelete : resourcesToDelete.left().value()) {
-//
-// Either<String, ResponseFormat> deleteMarkedResource = deleteMarkedComponent(resourceToDelete, componentType);
-// if (deleteMarkedResource.isLeft()) {
-// deletedComponents.add(deleteMarkedResource.left().value());
-// }
-// }
-// if(deletedComponents.size() == 0) {
-// log.debug("Component list to delete is empty. do commit");
-// titanGenericDao.commit();
-// }
log.trace("end deleteMarkedComponents");
return Either.left(deleteMarkedElements.left().value());
}
- public Either<List<ArtifactDefinition>, StorageOperationStatus> getComponentArtifactsForDelete(String parentId, NodeTypeEnum parentType, boolean inTransacton) {
- List<ArtifactDefinition> artifacts = new ArrayList<ArtifactDefinition>();
+ public Either<List<ArtifactDefinition>, StorageOperationStatus> getComponentArtifactsForDelete(String parentId, NodeTypeEnum parentType) {
+ List<ArtifactDefinition> artifacts = new ArrayList<>();
Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifactsResponse = artifactToscaOperation.getArtifacts(parentId);
if (artifactsResponse.isRight()) {
if (!artifactsResponse.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
@@ -827,16 +809,6 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
} else {
artifacts.addAll(artifactsResponse.left().value().values());
}
-
-// if (NodeTypeEnum.Resource.equals(parentType)) {
-// Either<List<ArtifactDefinition>, StorageOperationStatus> interfacesArtifactsForResource = getAdditionalArtifacts(parentId, false, true);
-// if (artifactsResponse.isRight() && !interfacesArtifactsForResource.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
-// log.debug("failed to retrieve interface artifacts for {} {}", parentType, parentId);
-// return Either.right(interfacesArtifactsForResource.right().value());
-// } else if (artifactsResponse.isLeft()) {
-// artifacts.addAll(interfacesArtifactsForResource.left().value());
-// }
-// }
return Either.left(artifacts);
}
@@ -873,50 +845,39 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
return Either.left(result);
}
- protected <T extends Component> void generateInputsFromGenericTypeProperties(T component, Resource genericType) {
-
- List<PropertyDefinition> genericTypeProps = genericType.getProperties();
- if(null != genericTypeProps) {
- String genericUniqueId = genericType.getUniqueId();
- List<InputDefinition> inputs = convertGenericTypePropertiesToInputsDefintion(genericTypeProps, genericUniqueId);
- if(null != component.getInputs())
- inputs.addAll(component.getInputs());
- component.setInputs(inputs);
- }
- }
-
- private List<InputDefinition> convertGenericTypePropertiesToInputsDefintion(List<PropertyDefinition> genericTypeProps, String genericUniqueId) {
- return genericTypeProps.stream()
- .map(p -> setInputDefinitionFromProp(p, genericUniqueId))
- .collect(Collectors.toList());
+ protected <T extends Component> void generateAndAddInputsFromGenericTypeProperties(T component, Resource genericType) {
+ List<InputDefinition> genericAndComponentInputs = new ArrayList<>();
+ List<InputDefinition> genericInputs = genericTypeBusinessLogic.generateInputsFromGenericTypeProperties(genericType);
+ genericAndComponentInputs.addAll(genericInputs);
+ if (null != component.getInputs()){
+ List<InputDefinition> nonGenericInputsFromComponent = getAllNonGenericInputsFromComponent(genericInputs, component.getInputs());
+ genericAndComponentInputs.addAll(nonGenericInputsFromComponent);
+ }
+ component.setInputs(genericAndComponentInputs);
}
-
- private InputDefinition setInputDefinitionFromProp(PropertyDefinition prop, String genericUniqueId){
- InputDefinition input = new InputDefinition(prop);
- input.setOwnerId(genericUniqueId);
- return input;
+
+ private List<InputDefinition> getAllNonGenericInputsFromComponent(List<InputDefinition> genericInputs, List<InputDefinition> componentInputs) {
+ if (genericInputs == null) {
+ return componentInputs;
+ }
+
+ Map<String, InputDefinition> inputByNameMap = MapUtil.toMap(genericInputs, InputDefinition::getName);
+ List<InputDefinition> componentNonGenericInputs = new ArrayList<>();
+ componentInputs.stream().forEach(input -> {
+ if (!inputByNameMap.containsKey(input.getName())) {
+ componentNonGenericInputs.add(input);
+ }
+ });
+ return componentNonGenericInputs;
}
protected <T extends Component> Either<Resource, ResponseFormat> fetchAndSetDerivedFromGenericType(T component){
- String genericTypeToscaName = null;
- if(component.getComponentType() == ComponentTypeEnum.RESOURCE && ((Resource)component).getResourceType() == ResourceTypeEnum.CVFC && CollectionUtils.isNotEmpty(((Resource)component).getDerivedFrom())){
- genericTypeToscaName = ((Resource)component).getDerivedFrom().get(0);
- } else {
- genericTypeToscaName = component.fetchGenericTypeToscaNameFromConfig();
- }
- log.debug("Fetching generic tosca name {}", genericTypeToscaName);
- if(null == genericTypeToscaName) {
- log.debug("Failed to fetch certified node type by tosca resource name {}", genericTypeToscaName);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+ Either<Resource, ResponseFormat> genericTypeEither = this.genericTypeBusinessLogic.fetchDerivedFromGenericType(component);
+ if(genericTypeEither.isRight()){
+ log.debug("Failed to fetch latest generic type for component {} of type", component.getName(), component.assetType());
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType()));
}
-
- Either<Resource, StorageOperationStatus> findLatestGeneric = toscaOperationFacade.getLatestCertifiedNodeTypeByToscaResourceName(genericTypeToscaName);
- if(findLatestGeneric.isRight()){
- log.debug("Failed to fetch certified node type by tosca resource name {}", genericTypeToscaName);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType(), genericTypeToscaName));
- }
-
- Resource genericTypeResource = findLatestGeneric.left().value();
+ Resource genericTypeResource = genericTypeEither.left().value();
component.setDerivedFromGenericInfo(genericTypeResource);
return Either.left(genericTypeResource);
}
@@ -1119,7 +1080,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
return shouldUpgradeNodeType(componentToCheckOut, latestGeneric);
}
List<PropertyDefinition> genericTypeProps = latestGeneric.getProperties();
- List<InputDefinition> genericTypeInputs = null == genericTypeProps? null : convertGenericTypePropertiesToInputsDefintion(genericTypeProps, latestGeneric.getUniqueId());
+ List<InputDefinition> genericTypeInputs = null == genericTypeProps? null : genericTypeBusinessLogic.convertGenericTypePropertiesToInputsDefintion(genericTypeProps, latestGeneric.getUniqueId());
List<InputDefinition> currentList = new ArrayList<>();
// nullify existing ownerId from existing list and merge into updated list
if (null != componentToCheckOut.getInputs()) {
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());
+ }
+ }
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
index e8c04c22c1..f6a108cf75 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
@@ -69,7 +69,7 @@ public class CompositionBusinessLogic {
boolean isNotAllPositionsCalculated = resource.getComponentInstances() == null
|| resource.getComponentInstances().stream().filter(p -> (p.getPosX() == null || p.getPosX().isEmpty()) || (p.getPosY() == null || p.getPosY().isEmpty())).findAny().isPresent();
- if (isNotAllPositionsCalculated) {
+ if (isNotAllPositionsCalculated && resource.getComponentInstances() != null) {
// Arrange Icons In Spiral Pattern
Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = buildSpiralPatternPositioningForComponentInstances(resource);
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java
index 8b0c6fa8bf..53dceb8112 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java
@@ -20,8 +20,6 @@
package org.openecomp.sdc.be.components.impl;
-import static org.openecomp.sdc.be.tosca.CsarUtils.VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN;
-
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DistributionMonitoringBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DistributionMonitoringBusinessLogic.java
index 9d9425ea85..be3ac13cc9 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DistributionMonitoringBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DistributionMonitoringBusinessLogic.java
@@ -20,9 +20,12 @@
package org.openecomp.sdc.be.components.impl;
-import org.springframework.beans.factory.annotation.Autowired;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
-import fj.data.Either;
import org.apache.http.HttpStatus;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
@@ -43,7 +46,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import java.util.*;
+import fj.data.Either;
@Component("distributionMonitoringBusinessLogic")
public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ElementBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ElementBusinessLogic.java
index 2c051b2b94..54bed5ae56 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ElementBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ElementBusinessLogic.java
@@ -20,10 +20,20 @@
package org.openecomp.sdc.be.components.impl;
-import com.thinkaurelius.titan.core.TitanGraph;
-import fj.data.Either;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
@@ -38,10 +48,27 @@ import org.openecomp.sdc.be.datamodel.api.CategoryTypeEnum;
import org.openecomp.sdc.be.datamodel.utils.NodeTypeConvertUtils;
import org.openecomp.sdc.be.datatypes.components.ComponentMetadataDataDefinition;
import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
-import org.openecomp.sdc.be.datatypes.enums.*;
+import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ComponentFieldsEnum;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.FilterKeyEnum;
import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.ArtifactType;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DistributionStatusEnum;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.Product;
+import org.openecomp.sdc.be.model.PropertyScope;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.ResourceMetadataDefinition;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.Tag;
+import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.category.CategoryDefinition;
import org.openecomp.sdc.be.model.category.GroupingDefinition;
import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
@@ -64,10 +91,9 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
+import com.thinkaurelius.titan.core.TitanGraph;
+
+import fj.data.Either;
@org.springframework.stereotype.Component("elementsBusinessLogic")
public class ElementBusinessLogic extends BaseBusinessLogic {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupBusinessLogic.java
index a3d590374f..de571b0f03 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupBusinessLogic.java
@@ -20,7 +20,6 @@
package org.openecomp.sdc.be.components.impl;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -42,17 +41,13 @@ import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
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.utils.JsonParserUtils;
import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.info.ArtifactDefinitionInfo;
import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
import org.openecomp.sdc.be.info.GroupDefinitionInfo;
@@ -69,17 +64,15 @@ import org.openecomp.sdc.be.model.GroupTypeDefinition;
import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.PropertyDefinition.GroupInstancePropertyValueUpdateBehavior;
import org.openecomp.sdc.be.model.PropertyDefinition.PropertyNames;
+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.ArtifactsOperations;
import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
-import org.openecomp.sdc.be.model.operations.impl.GroupOperation;
import org.openecomp.sdc.be.model.operations.impl.GroupTypeOperation;
import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
-import org.openecomp.sdc.common.api.ArtifactTypeEnum;
import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
@@ -88,7 +81,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import com.google.gson.JsonSyntaxException;
import fj.data.Either;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupTypeImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupTypeImportManager.java
index 2de9eee217..b3448b27ef 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupTypeImportManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/GroupTypeImportManager.java
@@ -20,7 +20,15 @@
package org.openecomp.sdc.be.components.impl;
-import fj.data.Either;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.components.impl.CommonImportManager.ElementTypeEnum;
import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaTagNamesEnum;
@@ -37,13 +45,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
+import fj.data.Either;
@Component("groupTypeImportManager")
public class GroupTypeImportManager {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java
index fe9c8488aa..eff3d39f7f 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/HealthCheckBusinessLogic.java
@@ -21,7 +21,6 @@
package org.openecomp.sdc.be.components.impl;
import java.io.IOException;
-import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -38,6 +37,8 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
@@ -54,18 +55,18 @@ import org.openecomp.sdc.be.config.ConfigurationManager;
import org.openecomp.sdc.be.dao.api.IEsHealthCheckDao;
import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
import org.openecomp.sdc.be.switchover.detector.SwitchoverDetector;
+import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.common.api.HealthCheckInfo;
-import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckComponent;
import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus;
-import org.openecomp.sdc.common.api.HealthCheckWrapper;
import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.util.HealthCheckUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
@Component("healthCheckBusinessLogic")
public class HealthCheckBusinessLogic {
@@ -135,12 +136,26 @@ public class HealthCheckBusinessLogic {
return true;
}
- public List<HealthCheckInfo> getBeHealthCheckInfosStatus() {
+ public Pair<Boolean, List<HealthCheckInfo>> getBeHealthCheckInfosStatus() {
- return prevBeHealthCheckInfos;
+ return new ImmutablePair<Boolean, List<HealthCheckInfo>>(getAggregateBeStatus(prevBeHealthCheckInfos), prevBeHealthCheckInfos);
}
+ private Boolean getAggregateBeStatus(List<HealthCheckInfo> beHealthCheckInfos) {
+
+ Boolean status = true;
+
+ for (HealthCheckInfo healthCheckInfo : beHealthCheckInfos) {
+ if (healthCheckInfo.getHealthCheckStatus().equals(HealthCheckStatus.DOWN) && !healthCheckInfo.getHealthCheckComponent().equals(Constants.HC_COMPONENT_DISTRIBUTION_ENGINE)) {
+ status = false;
+ break;
+ }
+ }
+ return status;
+ }
+
+
private List<HealthCheckInfo> getBeHealthCheckInfos() {
log.trace("In getBeHealthCheckInfos");
@@ -150,9 +165,6 @@ public class HealthCheckBusinessLogic {
// BE
getBeHealthCheck(healthCheckInfos);
- /*// ES
- getEsHealthCheck(healthCheckInfos);*/
-
// Titan
getTitanHealthCheck(healthCheckInfos);
@@ -165,18 +177,21 @@ public class HealthCheckBusinessLogic {
// Amdocs
getAmdocsHealthCheck(healthCheckInfos);
+ //DCAE
+ getDcaeHealthCheck(healthCheckInfos);
+
return healthCheckInfos;
}
private List<HealthCheckInfo> getBeHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
String appVersion = ExternalConfiguration.getAppVersion();
String description = "OK";
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.UP, appVersion, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_BE, HealthCheckStatus.UP, appVersion, description));
return healthCheckInfos;
}
//Removed from aggregate HC - TDP 293490
-/* private List<HealthCheckInfo> getEsHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
+ /* private List<HealthCheckInfo> getEsHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
// ES health check and version
HealthCheckStatus healthCheckStatus;
@@ -198,7 +213,7 @@ public class HealthCheckBusinessLogic {
healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.ES, healthCheckStatus, null, description));
return healthCheckInfos;
}
-*/
+ */
public List<HealthCheckInfo> getTitanHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
// Titan health check and version
String description;
@@ -208,15 +223,15 @@ public class HealthCheckBusinessLogic {
isTitanUp = titanGenericDao.isGraphOpen();
} catch (Exception e) {
description = "Titan error: " + e.getMessage();
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.TITAN, HealthCheckStatus.DOWN, null, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_TITAN, HealthCheckStatus.DOWN, null, description));
return healthCheckInfos;
}
if (isTitanUp) {
description = "OK";
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.TITAN, HealthCheckStatus.UP, null, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_TITAN, HealthCheckStatus.UP, null, description));
} else {
description = "Titan graph is down";
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.TITAN, HealthCheckStatus.DOWN, null, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_TITAN, HealthCheckStatus.DOWN, null, description));
}
return healthCheckInfos;
}
@@ -234,10 +249,10 @@ public class HealthCheckBusinessLogic {
}
if (isCassandraUp) {
description = "OK";
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.CASSANDRA, HealthCheckStatus.UP, null, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_CASSANDRA, HealthCheckStatus.UP, null, description));
} else {
description = "Cassandra is down";
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.CASSANDRA, HealthCheckStatus.DOWN, null, description));
+ healthCheckInfos.add(new HealthCheckInfo(Constants.HC_COMPONENT_CASSANDRA, HealthCheckStatus.DOWN, null, description));
}
return healthCheckInfos;
@@ -252,71 +267,92 @@ public class HealthCheckBusinessLogic {
}
private List<HealthCheckInfo> getAmdocsHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
+ HealthCheckInfo beHealthCheckInfo = getHostedComponentsBeHealthCheck(Constants.HC_COMPONENT_ON_BOARDING, buildOnBoardingHealthCheckUrl());
+ healthCheckInfos.add(beHealthCheckInfo);
+ return healthCheckInfos;
+ }
+
+ private List<HealthCheckInfo> getDcaeHealthCheck(List<HealthCheckInfo> healthCheckInfos) {
+ HealthCheckInfo beHealthCheckInfo = getHostedComponentsBeHealthCheck(Constants.HC_COMPONENT_DCAE, buildDcaeHealthCheckUrl());
+ healthCheckInfos.add(beHealthCheckInfo);
+ return healthCheckInfos;
+ }
+
+ private HealthCheckInfo getHostedComponentsBeHealthCheck(String componentName, String healthCheckUrl) {
HealthCheckStatus healthCheckStatus;
String description;
String version = null;
List<HealthCheckInfo> componentsInfo = new ArrayList<>();
CloseableHttpClient httpClient = getHttpClient();
- String amdocsHealtchCheckUrl = buildHealthCheckUrl();
- HttpGet httpGet = new HttpGet(amdocsHealtchCheckUrl);
- CloseableHttpResponse beResponse;
- int beStatus;
- try {
- beResponse = httpClient.execute(httpGet);
- beStatus = beResponse.getStatusLine().getStatusCode();
-
- StringBuilder sb = new StringBuilder();
-
- if (beStatus == HttpStatus.SC_OK || beStatus == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
- HttpEntity entity = beResponse.getEntity();
- String beJsonResponse = EntityUtils.toString(entity);
- Gson gson = new Gson();
- HealthCheckWrapper healthCheckWrapper = gson.fromJson(beJsonResponse, HealthCheckWrapper.class);
- version = healthCheckWrapper.getSdcVersion();
- componentsInfo = healthCheckWrapper.getComponentsInfo();
-
- if (componentsInfo != null) {
- componentsInfo.forEach(x -> {
- if (x.getHealthCheckStatus() == HealthCheckStatus.DOWN) {
- sb.append("Component " + x.getHealthCheckComponent().name() + " is Down, ");
- }
- });
+
+ if (healthCheckUrl != null) {
+ HttpGet httpGet = new HttpGet(healthCheckUrl);
+ CloseableHttpResponse beResponse;
+ int beStatus;
+ try {
+ beResponse = httpClient.execute(httpGet);
+ beStatus = beResponse.getStatusLine().getStatusCode();
+
+ String aggDescription = "";
+
+ if (beStatus == HttpStatus.SC_OK || beStatus == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
+ HttpEntity entity = beResponse.getEntity();
+ String beJsonResponse = EntityUtils.toString(entity);
+ log.trace("{} Health Check response: {}", componentName, beJsonResponse);
+
+ ObjectMapper mapper = new ObjectMapper();
+ Map<String, Object> healthCheckMap = mapper.readValue(beJsonResponse, new TypeReference<Map<String, Object>>(){});
+ version = healthCheckMap.get("sdcVersion") != null ? healthCheckMap.get("sdcVersion").toString() : null;
+ if (healthCheckMap.containsKey("componentsInfo")) {
+ componentsInfo = mapper.convertValue(healthCheckMap.get("componentsInfo"), new TypeReference<List<HealthCheckInfo>>() {});
+ }
+
+ if (componentsInfo.size() > 0) {
+ aggDescription = HealthCheckUtil.getAggregateDescription(componentsInfo, null);
+ } else {
+ componentsInfo.add(new HealthCheckInfo(Constants.HC_COMPONENT_BE, HealthCheckStatus.DOWN, null, null));
+ }
} else {
- componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, null));
+ log.trace("{} Health Check Response code: {}", componentName, beStatus);
}
- }
- if (beStatus != HttpStatus.SC_OK) {
- healthCheckStatus = HealthCheckStatus.DOWN;
- //Removing the last comma
- description = sb.length()>0
- ? sb.substring(0, sb.length()-1)
- : "Onboarding is Down, specific reason unknown";//No Amdocs inner component returned DOWN, but the status of Amdocs HC is still DOWN.
- if (componentsInfo.size() == 0) {
- componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, description));
+ if (beStatus != HttpStatus.SC_OK) {
+ healthCheckStatus = HealthCheckStatus.DOWN;
+ description = aggDescription.length() > 0
+ ? aggDescription
+ : componentName + " is Down, specific reason unknown";//No inner component returned DOWN, but the status of HC is still DOWN.
+ if (componentsInfo.size() == 0) {
+ componentsInfo.add(new HealthCheckInfo(Constants.HC_COMPONENT_BE, HealthCheckStatus.DOWN, null, description));
+ }
+ } else {
+ healthCheckStatus = HealthCheckStatus.UP;
+ description = "OK";
}
- } else {
- healthCheckStatus = HealthCheckStatus.UP;
- description = "OK";
- }
- } catch (Exception e) {
- healthCheckStatus = HealthCheckStatus.DOWN;
- description = "Onboarding unexpected response: " + e.getMessage();
- componentsInfo.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, description));
- } finally {
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
+ } catch (Exception e) {
+ log.error("{} unexpected response: ", componentName, e);
+ healthCheckStatus = HealthCheckStatus.DOWN;
+ description = componentName + " unexpected response: " + e.getMessage();
+ if (componentsInfo != null && componentsInfo.size() == 0) {
+ componentsInfo.add(new HealthCheckInfo(Constants.HC_COMPONENT_BE, HealthCheckStatus.DOWN, null, description));
+ }
+ } finally {
+ if (httpClient != null) {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ log.error("closing http client has failed" , e);
+ }
}
}
+ } else {
+ healthCheckStatus = HealthCheckStatus.DOWN;
+ description = componentName + " health check Configuration is missing";
+ componentsInfo.add(new HealthCheckInfo(Constants.HC_COMPONENT_BE, HealthCheckStatus.DOWN, null, description));
}
- healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.ON_BOARDING, healthCheckStatus, version, description, componentsInfo));
- return healthCheckInfos;
+ return new HealthCheckInfo(componentName, healthCheckStatus, version, description, componentsInfo);
}
private CloseableHttpClient getHttpClient() {
@@ -371,20 +407,6 @@ public class HealthCheckBusinessLogic {
}
}
-
- private boolean getAggregateBeStatus(List<HealthCheckInfo> beHealthCheckInfos) {
-
- boolean status = true;
-
- for (HealthCheckInfo healthCheckInfo : beHealthCheckInfos) {
- if (healthCheckInfo.getHealthCheckStatus().equals(HealthCheckStatus.DOWN) && healthCheckInfo.getHealthCheckComponent() != HealthCheckComponent.DE) {
- status = false;
- break;
- }
- }
- return status;
- }
-
}
private void logAlarm(boolean prevHealthState) {
@@ -410,8 +432,8 @@ public class HealthCheckBusinessLogic {
if (beHealthCheckInfos != null && prevBeHealthCheckInfos != null) {
- Map<HealthCheckComponent, HealthCheckStatus> currentValues = beHealthCheckInfos.stream().collect(Collectors.toMap(p -> p.getHealthCheckComponent(), p -> p.getHealthCheckStatus()));
- Map<HealthCheckComponent, HealthCheckStatus> prevValues = prevBeHealthCheckInfos.stream().collect(Collectors.toMap(p -> p.getHealthCheckComponent(), p -> p.getHealthCheckStatus()));
+ Map<String, HealthCheckStatus> currentValues = beHealthCheckInfos.stream().collect(Collectors.toMap(p -> p.getHealthCheckComponent(), p -> p.getHealthCheckStatus()));
+ Map<String, HealthCheckStatus> prevValues = prevBeHealthCheckInfos.stream().collect(Collectors.toMap(p -> p.getHealthCheckComponent(), p -> p.getHealthCheckStatus()));
if (currentValues != null && prevValues != null) {
int currentSize = currentValues.size();
@@ -421,7 +443,7 @@ public class HealthCheckBusinessLogic {
result = true; //extra/missing component
- Map<HealthCheckComponent, HealthCheckStatus> notPresent = null;
+ Map<String, HealthCheckStatus> notPresent = null;
if (currentValues.keySet().containsAll(prevValues.keySet())) {
notPresent = new HashMap<>(currentValues);
notPresent.keySet().removeAll(prevValues.keySet());
@@ -430,15 +452,15 @@ public class HealthCheckBusinessLogic {
notPresent.keySet().removeAll(currentValues.keySet());
}
- for (HealthCheckComponent component : notPresent.keySet()) {
+ for (String component : notPresent.keySet()) {
logAlarm(String.format(COMPONENT_CHANGED_MESSAGE, component, prevValues.get(component), currentValues.get(component)));
}
// HealthCheckComponent changedComponent = notPresent.keySet().iterator().next();
} else {
- for (Entry<HealthCheckComponent, HealthCheckStatus> entry : currentValues.entrySet()) {
- HealthCheckComponent key = entry.getKey();
+ for (Entry<String, HealthCheckStatus> entry : currentValues.entrySet()) {
+ String key = entry.getKey();
HealthCheckStatus value = entry.getValue();
if (!prevValues.containsKey(key)) {
@@ -468,15 +490,37 @@ public class HealthCheckBusinessLogic {
return result;
}
- private String buildHealthCheckUrl() {
+ private String buildOnBoardingHealthCheckUrl() {
Configuration.OnboardingConfig onboardingConfig = ConfigurationManager.getConfigurationManager().getConfiguration().getOnboarding();
- String protocol = onboardingConfig.getProtocol();
- String host = onboardingConfig.getHost();
- Integer port = onboardingConfig.getPort();
- String uri = onboardingConfig.getHealthCheckUri();
+ if (onboardingConfig != null) {
+ String protocol = onboardingConfig.getProtocol();
+ String host = onboardingConfig.getHost();
+ Integer port = onboardingConfig.getPort();
+ String uri = onboardingConfig.getHealthCheckUri();
+
+ return protocol + "://" + host + ":" + port + uri;
+ }
+
+ log.error("onboarding health check configuration is missing.");
+ return null;
+ }
+
+ private String buildDcaeHealthCheckUrl() {
+
+ Configuration.DcaeConfig dcaeConfig = ConfigurationManager.getConfigurationManager().getConfiguration().getDcae();
+
+ if (dcaeConfig != null) {
+ String protocol = dcaeConfig.getProtocol();
+ String host = dcaeConfig.getHost();
+ Integer port = dcaeConfig.getPort();
+ String uri = dcaeConfig.getHealthCheckUri();
+
+ return protocol + "://" + host + ":" + port + uri;
+ }
- return protocol + "://" + host + ":" + port + uri;
+ log.error("dcae health check configuration is missing.");
+ return null;
}
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
index 1755d0b20c..01d64f519f 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
@@ -21,7 +21,15 @@
package org.openecomp.sdc.be.components.impl;
import java.lang.reflect.Type;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InformationDeployedArtifactsBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InformationDeployedArtifactsBusinessLogic.java
index 3b6e0f7a76..52dcce9e2e 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InformationDeployedArtifactsBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InformationDeployedArtifactsBusinessLogic.java
@@ -20,31 +20,6 @@
package org.openecomp.sdc.be.components.impl;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import org.apache.commons.codec.binary.Base64;
-import org.openecomp.sdc.be.config.ConfigurationManager;
-import org.openecomp.sdc.be.config.Configuration.ArtifactTypeConfig;
-import org.openecomp.sdc.be.dao.api.ActionStatus;
-import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
-import org.openecomp.sdc.be.model.ArtifactDefinition;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.ComponentInstance;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
-import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
-import org.openecomp.sdc.common.api.ArtifactTypeEnum;
-import org.openecomp.sdc.common.datastructure.Wrapper;
-import org.openecomp.sdc.exception.ResponseFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import fj.data.Either;
-
//Pavel
//currently NOT IN USE - there are no informational deployed artifacts after US601880
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
index 892da8af9d..a9e7f0b34b 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InputsBusinessLogic.java
@@ -20,12 +20,19 @@
package org.openecomp.sdc.be.components.impl;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
-import jline.internal.Log;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.json.simple.JSONObject;
@@ -50,7 +57,6 @@ import org.openecomp.sdc.be.model.IComponentInstanceConnectedElement;
import org.openecomp.sdc.be.model.InputDefinition;
import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.User;
-
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
@@ -65,6 +71,7 @@ import org.yaml.snakeyaml.Yaml;
import com.google.gson.Gson;
import fj.data.Either;
+import jline.internal.Log;
@Component("inputsBusinessLogic")
public class InputsBusinessLogic extends BaseBusinessLogic {
@@ -311,6 +318,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
}
currentInput.setDefaultValue(newValue);
+ currentInput.setOwnerId(userId);
Either<InputDefinition, StorageOperationStatus> status = toscaOperationFacade.updateInputOfComponent(component, currentInput);
@@ -473,6 +481,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
}
+ assignOwnerIdToInputs(userId, inputsToCreate);
Either<List<InputDefinition>, StorageOperationStatus> assotiateInputsEither = toscaOperationFacade.addInputsToComponent(inputsToCreate, component.getUniqueId());
if(assotiateInputsEither.isRight()){
@@ -524,6 +533,10 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
}
+ private void assignOwnerIdToInputs(String userId, Map<String, InputDefinition> inputsToCreate) {
+ inputsToCreate.values().forEach(inputDefinition -> inputDefinition.setOwnerId(userId));
+ }
+
private StorageOperationStatus addInputsToComponent(String componentId, Map<String, InputDefinition> inputsToCreate, Map<String, List<ComponentInstanceInput>> inputsValueToCreateMap, Map<String, DataTypeDefinition> allDataTypes, List<InputDefinition> resList, int index,
String compInstId, String compInstname, org.openecomp.sdc.be.model.Component origComponent, InputDefinition input) {
@@ -642,7 +655,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
}
Map<String, InputDefinition> inputs = inputsDefinitions.stream().collect(Collectors.toMap( o -> o.getName(), o -> o));
- result = createInputsInGraph(inputs, component, user, inTransaction);
+ result = createInputsInGraph(inputs, component);
}
return result;
@@ -669,7 +682,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
}
- public Either<List<InputDefinition>, ResponseFormat> createInputsInGraph(Map<String, InputDefinition> inputs, org.openecomp.sdc.be.model.Component component, User user, boolean inTransaction) {
+ public Either<List<InputDefinition>, ResponseFormat> createInputsInGraph(Map<String, InputDefinition> inputs, org.openecomp.sdc.be.model.Component component) {
List<InputDefinition> resList = inputs.values().stream().collect(Collectors.toList());
Either<List<InputDefinition>, ResponseFormat> result = Either.left(resList);
@@ -1212,7 +1225,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
propInput.setOwnerId(null);
propInput.setParentUniqueId(null);
- Either<InputDefinition, StorageOperationStatus> createInputRes = createInputForComponentInstance(component, origComponent,ci, inputsToCreate, propertiesToCreate, inputsValueToCreate, dataTypes, inputName, propInput, isInputValue);
+ Either<InputDefinition, StorageOperationStatus> createInputRes = createInputForComponentInstance(component, ci, inputsToCreate, propertiesToCreate, inputsValueToCreate, inputName, propInput, isInputValue);
if (createInputRes.isRight()) {
log.debug("Failed to create input of resource instance for id {} error {}", compInstId, createInputRes.right().value());
@@ -1235,7 +1248,7 @@ public class InputsBusinessLogic extends BaseBusinessLogic {
return Either.left(resList);
}
- private Either<InputDefinition, StorageOperationStatus> createInputForComponentInstance(org.openecomp.sdc.be.model.Component component,org.openecomp.sdc.be.model.Component orignComponent, ComponentInstance ci, Map<String, InputDefinition> inputsToCreate, List<ComponentInstanceProperty> propertiesToCreate, List<ComponentInstanceInput> inputsValueToCreate, Map<String, DataTypeDefinition> dataTypes, String inputName, ComponentInstancePropInput propInput, boolean isInputValue) {
+ private Either<InputDefinition, StorageOperationStatus> createInputForComponentInstance(org.openecomp.sdc.be.model.Component component, ComponentInstance ci, Map<String, InputDefinition> inputsToCreate, List<ComponentInstanceProperty> propertiesToCreate, List<ComponentInstanceInput> inputsValueToCreate, String inputName, ComponentInstancePropInput propInput, boolean isInputValue) {
String propertiesName = propInput.getPropertiesName() ;
PropertyDefinition selectedProp = propInput.getInput();
String[] parsedPropNames = propInput.getParsedPropNames();
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeImportManager.java
index 7b55a6988e..4a07120994 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeImportManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeImportManager.java
@@ -20,7 +20,12 @@
package org.openecomp.sdc.be.components.impl;
-import fj.data.Either;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import javax.annotation.Resource;
+
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.components.impl.CommonImportManager.ElementTypeEnum;
import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaTagNamesEnum;
@@ -34,10 +39,7 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
+import fj.data.Either;
@Component("policyTypeImportManager")
public class PolicyTypeImportManager {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductComponentInstanceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductComponentInstanceBusinessLogic.java
index 7a7148a6a1..73f72216d2 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductComponentInstanceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductComponentInstanceBusinessLogic.java
@@ -22,11 +22,8 @@ package org.openecomp.sdc.be.components.impl;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
-import org.openecomp.sdc.exception.ResponseFormat;
import org.springframework.stereotype.Component;
-import fj.data.Either;
-
@Component("productComponentInstanceBusinessLogic")
public class ProductComponentInstanceBusinessLogic extends ComponentInstanceBusinessLogic {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PropertyBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PropertyBusinessLogic.java
index e16b34f389..ff26ced5c9 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PropertyBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PropertyBusinessLogic.java
@@ -20,11 +20,16 @@
package org.openecomp.sdc.be.components.impl;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import com.google.gson.reflect.TypeToken;
-import fj.data.Either;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.Supplier;
+
+import javax.servlet.ServletContext;
+
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -57,14 +62,12 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
-import javax.servlet.ServletContext;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.function.Supplier;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
+
+import fj.data.Either;
@Component("propertyBusinessLogic")
public class PropertyBusinessLogic extends BaseBusinessLogic {
@@ -229,7 +232,7 @@ public class PropertyBusinessLogic extends BaseBusinessLogic {
return Either.right(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND, ""));
}
for (PropertyDefinition property : properties) {
- if (property.getUniqueId().equals(propertyId) && isPropertyBelongsToResource(property, resourceId)) {
+ if (property.getUniqueId().equals(propertyId) ) {
Map<String, PropertyDefinition> propMap = new HashMap<>();
propMap.put(property.getName(), property);
return Either.left(propMap.entrySet().iterator().next());
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
index 1ab7ffb007..4924bd25a7 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
@@ -55,6 +55,8 @@ import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaTagNamesEnum;
import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction.LifecycleChanceActionEnum;
+import org.openecomp.sdc.be.components.merge.resource.MergeResourceBLFactory;
+import org.openecomp.sdc.be.components.merge.resource.MergeResourceBusinessLogic;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
import org.openecomp.sdc.be.config.Configuration.VfModuleProperty;
@@ -76,6 +78,7 @@ import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
import org.openecomp.sdc.be.info.MergedArtifactInfo;
import org.openecomp.sdc.be.model.ArtifactDefinition;
import org.openecomp.sdc.be.model.CapabilityDefinition;
+import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
@@ -97,7 +100,7 @@ import org.openecomp.sdc.be.model.Operation;
import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.RelationshipImpl;
-import org.openecomp.sdc.be.model.RequirementAndRelationshipPair;
+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;
@@ -127,7 +130,6 @@ import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
import org.openecomp.sdc.be.servlets.RepresentationUtils;
import org.openecomp.sdc.be.tosca.CsarUtils;
import org.openecomp.sdc.be.tosca.CsarUtils.NonMetaArtifactInfo;
-import org.openecomp.sdc.be.tosca.ToscaUtils;
import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer;
import org.openecomp.sdc.be.user.IUserBusinessLogic;
import org.openecomp.sdc.be.user.Role;
@@ -215,6 +217,9 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
@Autowired
private ApplicationDataTypeCache dataTypeCache;
+ @Autowired
+ private MergeResourceBLFactory mergeResourceBLFactory;
+
private Gson gson = new Gson();
public CsarOperation getCsarOperation() {
@@ -539,20 +544,12 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = findNodeTypesArtifactsToHandleRes.left().value();
try{
- result = updateResourceFromYaml(oldRresource, newRresource, updateResource, createdArtifacts, isUpdateYaml, yamlFileName, yamlFileContents, csarInfo, nodeTypesInfo, nodeTypesArtifactsToHandle, null);
+ result = updateResourceFromYaml(oldRresource, newRresource, updateResource, createdArtifacts, isUpdateYaml, yamlFileName, yamlFileContents, csarInfo, nodeTypesInfo, nodeTypesArtifactsToHandle, null, false);
} finally {
if (result == null || result.isRight()) {
log.warn("operation failed. do rollback");
titanDao.rollback();
- if (!createdArtifacts.isEmpty()) {
- StorageOperationStatus deleteFromEsRes = artifactsBusinessLogic.deleteAllComponentArtifactsIfNotOnGraph(createdArtifacts);
- if (!deleteFromEsRes.equals(StorageOperationStatus.OK)) {
- ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(deleteFromEsRes);
- result = Either.right(componentsUtils.getResponseFormat(actionStatus, oldRresource.getName()));
- }
- log.debug("component and all its artifacts were deleted, id = {}", oldRresource.getName());
- }
} else {
log.debug("operation success. do commit");
titanDao.commit();
@@ -566,7 +563,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
private Either<Resource, ResponseFormat> updateResourceFromYaml(Resource oldRresource, Resource newRresource, AuditingActionEnum updateResource, List<ArtifactDefinition> createdArtifacts,
boolean isUpdateYaml, String yamlFileName, String yamlFileContent, CsarInfo csarInfo, Map<String, NodeTypeInfo> nodeTypesInfo,
- Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle, String nodeName) {
+ Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle, String nodeName, boolean isNested) {
Either<Resource, ResponseFormat> result;
Either<Map<String, Resource>, ResponseFormat> parseNodeTypeInfoYamlEither;
boolean inTransaction = true;
@@ -586,7 +583,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
if (isUpdateYaml || !nodeTypesArtifactsToHandle.isEmpty()) {
- prepareForUpdate = updateExistingResourceByImport(newRresource, oldRresource, csarInfo.getModifier(), inTransaction, shouldLock);
+ prepareForUpdate = updateExistingResourceByImport(newRresource, oldRresource, csarInfo.getModifier(), inTransaction, shouldLock, isNested);
if (prepareForUpdate.isRight()) {
log.debug("Failed to prepare resource for update : {}", prepareForUpdate.right().value());
result = Either.right(prepareForUpdate.right().value());
@@ -690,19 +687,35 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
preparedResource = createdCsarArtifactsEither.left().value();
}
+ ActionStatus mergingPropsAndInputsStatus = mergeResourceEntities(oldRresource, preparedResource);
+ if (mergingPropsAndInputsStatus != ActionStatus.OK) {
+ ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(mergingPropsAndInputsStatus, preparedResource);
+ return Either.right(responseFormat);
+ }
+
Either<List<ComponentInstance>, ResponseFormat> eitherSetPosition = compositionBusinessLogic.setPositionsForComponentInstances(preparedResource, csarInfo.getModifier().getUserId());
result = eitherSetPosition.isRight() ? Either.right(eitherSetPosition.right().value()) : Either.left(preparedResource);
return result;
}
+
+ private ActionStatus mergeResourceEntities(Resource oldResource, Resource newResource) {
+ Either<MergeResourceBusinessLogic, ActionStatus> mergeResourceBLEither = mergeResourceBLFactory.getInstance(oldResource, newResource);
+ if (mergeResourceBLEither.isRight()) {
+ return mergeResourceBLEither.right().value();
+ }
+ MergeResourceBusinessLogic mergeResourceBusinessLogic = mergeResourceBLEither.left().value();
+ return mergeResourceBusinessLogic.mergeResourceEntities(oldResource, newResource);
+ }
+
private Either<Resource, ResponseFormat> handleResourceGenericType(Resource resource) {
Either<Resource, ResponseFormat> genericResourceEither = fetchAndSetDerivedFromGenericType(resource);
if (genericResourceEither.isRight()) {
return genericResourceEither;
}
if (resource.shouldGenerateInputs()) {
- generateInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
+ generateAndAddInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
}
return genericResourceEither;
}
@@ -715,18 +728,22 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
try {
nodeTypesArtifactsToHandleRes = Either.left(nodeTypesArtifactsToHandle);
- Map<String, String> extractedVfcToscaNames = extractVfcToscaNames(nodeTypesInfo, oldResource.getName(), csarInfo);
+ Map<String, ImmutablePair<String,String>> extractedVfcToscaNames = extractVfcToscaNames(nodeTypesInfo, oldResource.getName(), csarInfo);
Either<EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>, ResponseFormat> curNodeTypeArtifactsToHandleRes;
EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> curNodeTypeArtifactsToHandle = null;
log.debug("Going to fetch node types for resource with name {} during import csar with UUID {}. ", oldResource.getName(), csarInfo.getCsarUUID());
- for (Entry<String, String> currVfcToscaNameEntry : extractedVfcToscaNames.entrySet()) {
- String currVfcToscaName = currVfcToscaNameEntry.getValue();
+ for (Entry<String, ImmutablePair<String,String>> currVfcToscaNameEntry : extractedVfcToscaNames.entrySet()) {
+ String currVfcToscaName = currVfcToscaNameEntry.getValue().getLeft();
+ String previousVfcToscaName = currVfcToscaNameEntry.getValue().getRight();
String currNamespace = currVfcToscaNameEntry.getKey();
log.debug("Going to fetch node type with tosca name {}. ", currVfcToscaName);
Either<Resource, StorageOperationStatus> curVfcRes = toscaOperationFacade.getLatestByToscaResourceName(currVfcToscaName);
Resource curNodeType = null;
+ if (curVfcRes.isRight() && curVfcRes.right().value() == StorageOperationStatus.NOT_FOUND) {
+ curVfcRes = toscaOperationFacade.getLatestByToscaResourceName(previousVfcToscaName);
+ }
if (curVfcRes.isRight() && curVfcRes.right().value() != StorageOperationStatus.NOT_FOUND) {
log.debug("Error occured during fetching node type with tosca name {}, error: {}", currVfcToscaName, curVfcRes.right().value());
ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(curVfcRes.right().value()), csarInfo.getCsarUUID());
@@ -925,15 +942,15 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return handleNodeTypeArtifactsRes;
}
- private Map<String, String> extractVfcToscaNames(Map<String, NodeTypeInfo> nodeTypesInfo, String vfResourceName, CsarInfo csarInfo) {
- Map<String, String> vfcToscaNames = new HashMap<>();
+ private Map<String, ImmutablePair<String,String>> extractVfcToscaNames(Map<String, NodeTypeInfo> nodeTypesInfo, String vfResourceName, CsarInfo csarInfo) {
+ Map<String, ImmutablePair<String,String>> vfcToscaNames = new HashMap<>();
Map<String, Object> nodes = extractAllNodes(nodeTypesInfo, csarInfo);
if (!nodes.isEmpty()) {
Iterator<Entry<String, Object>> nodesNameEntry = nodes.entrySet().iterator();
while (nodesNameEntry.hasNext()) {
Entry<String, Object> nodeType = nodesNameEntry.next();
- String toscaResourceName = buildNestedToscaResourceName(ResourceTypeEnum.VFC.name(), vfResourceName, nodeType.getKey());
+ ImmutablePair<String,String> toscaResourceName = buildNestedToscaResourceName(ResourceTypeEnum.VFC.name(), vfResourceName, nodeType.getKey());
vfcToscaNames.put(nodeType.getKey(), toscaResourceName);
}
}
@@ -1201,7 +1218,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
vfcCreated = handleNeatedVfcYaml.left().value();
} else if(csarInfo.getCreatedNodesToscaResourceNames()!= null && !csarInfo.getCreatedNodesToscaResourceNames().containsKey(nodeType.getKey())){
log.trace("************* Going to create node {}", nodeType.getKey());
- Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> resourceCreated = this.createNodeTypeResourceFromYaml(yamlName, nodeType, csarInfo.getModifier(), mapToConvert, resource, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, true, csarInfo);
+ Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> resourceCreated = this.createNodeTypeResourceFromYaml(yamlName, nodeType, csarInfo.getModifier(), mapToConvert, resource, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, true, csarInfo, true);
log.debug("************* Finished to create node {}", nodeType.getKey());
if (resourceCreated.isRight()) {
@@ -1257,11 +1274,18 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
if(result == null){
newComplexVfc = buildCvfcRes.left().value();
Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
+ if(oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() == StorageOperationStatus.NOT_FOUND){
+ oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getRight());
+ }
if(oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() != StorageOperationStatus.NOT_FOUND){
log.debug("Failed to fetch previous complex VFC by tosca resource name {}. Status is {}. ", newComplexVfc.getToscaResourceName(), oldComplexVfcRes.right().value());
result = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
} else if(oldComplexVfcRes.isLeft()){
- oldComplexVfc = oldComplexVfcRes.left().value();
+ log.debug("validate derived before update");
+ Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(oldComplexVfcRes.left().value(), newComplexVfc, ValidationUtils.hasBeenCertified(oldComplexVfcRes.left().value().getVersion()));
+ if (eitherValidation.isLeft()) {
+ oldComplexVfc = oldComplexVfcRes.left().value();
+ }
}
}
if(result == null){
@@ -1298,7 +1322,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
log.debug("Failed to create resource {} from YAML {}. ", newComplexVfc.getName(), yamlName);
}
} else {
- handleComplexVfcRes = updateResourceFromYaml(oldComplexVfc, newComplexVfc, AuditingActionEnum.UPDATE_RESOURCE_METADATA, createdArtifacts, true, yamlContent, yamlName, csarInfo, newNodeTypesInfo, nodesArtifactsToHandle, nodeName);
+ handleComplexVfcRes = updateResourceFromYaml(oldComplexVfc, newComplexVfc, AuditingActionEnum.UPDATE_RESOURCE_METADATA, createdArtifacts, true, yamlContent, yamlName, csarInfo, newNodeTypesInfo, nodesArtifactsToHandle, nodeName, true);
if (handleComplexVfcRes.isRight()) {
log.debug("Failed to update resource {} from YAML {}. ", oldComplexVfc.getName(), yamlName);
}
@@ -1335,13 +1359,13 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
private Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createNodeTypeResourceFromYaml(String yamlName, Entry<String, Object> nodeNameValue, User user, Map<String, Object> mapToConvert, Resource resourceVf, boolean needLock,
- Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo) {
+ Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo, boolean isNested) {
Either<UploadResourceInfo, ResponseFormat> resourceMetaData = fillResourceMetadata(yamlName, resourceVf, nodeNameValue.getKey(), user);
if (resourceMetaData.isRight()) {
return Either.right(resourceMetaData.right().value());
}
- String singleVfcYaml = buildNodeTypeYaml(nodeNameValue, mapToConvert, resourceMetaData.left().value().getResourceType(), csarInfo.getVfResourceName());
+ String singleVfcYaml = buildNodeTypeYaml(nodeNameValue, mapToConvert, resourceMetaData.left().value().getResourceType(), csarInfo);
Either<User, ResponseFormat> eitherCreator = validateUser(user, "CheckIn Resource", resourceVf, AuditingActionEnum.CHECKIN_RESOURCE, true);
if (eitherCreator.isRight()) {
@@ -1349,10 +1373,10 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
user = eitherCreator.left().value();
- return this.createResourceFromNodeType(singleVfcYaml, resourceMetaData.left().value(), user, true, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo);
+ return this.createResourceFromNodeType(singleVfcYaml, resourceMetaData.left().value(), user, true, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo, nodeNameValue.getKey(), isNested);
}
- private String buildNodeTypeYaml(Entry<String, Object> nodeNameValue, Map<String, Object> mapToConvert, String nodeResourceType, String csarVfName) {
+ private String buildNodeTypeYaml(Entry<String, Object> nodeNameValue, Map<String, Object> mapToConvert, String nodeResourceType, CsarInfo csarInfo) {
// We need to create a Yaml from each node_types in order to create
// resource from each node type using import normative flow.
DumperOptions options = new DumperOptions();
@@ -1360,7 +1384,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
Yaml yaml = new Yaml(options);
Map<String, Object> node = new HashMap<>();
- node.put(buildNestedToscaResourceName(nodeResourceType, csarVfName, nodeNameValue.getKey()), nodeNameValue.getValue());
+ node.put(buildNestedToscaResourceName(nodeResourceType, csarInfo.getVfResourceName(), nodeNameValue.getKey()).getLeft(), nodeNameValue.getValue());
mapToConvert.put(ToscaTagNamesEnum.NODE_TYPES.getElementName(), node);
return yaml.dumpAsMap(mapToConvert);
@@ -1376,11 +1400,11 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
public Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResourceFromNodeType(String nodeTypeYaml, UploadResourceInfo resourceMetaData, User creator, boolean isInTransaction, boolean needLock,
- Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo) {
+ Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo, String nodeName, boolean isNested) {
LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction("certification on import", LifecycleChanceActionEnum.CREATE_FROM_CSAR);
Function<Resource, Either<Boolean, ResponseFormat>> validator = (resource) -> this.validateResourceCreationFromNodeType(resource, creator);
- return this.resourceImportManager.importCertifiedResource(nodeTypeYaml, resourceMetaData, creator, validator, lifecycleChangeInfo, isInTransaction, true, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo);
+ return this.resourceImportManager.importCertifiedResource(nodeTypeYaml, resourceMetaData, creator, validator, lifecycleChangeInfo, isInTransaction, true, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo, nodeName, isNested);
}
private Either<UploadResourceInfo, ResponseFormat> fillResourceMetadata(String yamlName, Resource resourceVf, String nodeName, User user) {
@@ -1457,7 +1481,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
cvfc.setVendorName(resourceVf.getVendorName());
cvfc.setVendorRelease(resourceVf.getVendorRelease());
cvfc.setResourceVendorModelNumber(resourceVf.getResourceVendorModelNumber());
- cvfc.setToscaResourceName(buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName));
+ cvfc.setToscaResourceName(buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getLeft());
cvfc.setInvariantUUID(UniqueIdBuilder.buildInvariantUUID());
List<String> tags = new ArrayList<>();
@@ -1521,7 +1545,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
// add groups to resource
log.trace("************* Going to add inputs from yaml {}", yamlName);
if (resource.shouldGenerateInputs())
- generateInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
+ generateAndAddInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
Map<String, InputDefinition> inputs = parsedToscaYamlInfo.getInputs();
Either<Resource, ResponseFormat> createInputsOnResource = createInputsOnResource(resource, csarInfo.getModifier(), inputs, inTransaction);
@@ -1599,11 +1623,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
titanDao.rollback();
if (!createdArtifacts.isEmpty() || !nodeTypesNewCreatedArtifacts.isEmpty()) {
createdArtifacts.addAll(nodeTypesNewCreatedArtifacts);
- StorageOperationStatus deleteFromEsRes = artifactsBusinessLogic.deleteAllComponentArtifactsIfNotOnGraph(createdArtifacts);
- if (!deleteFromEsRes.equals(StorageOperationStatus.OK)) {
- ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(deleteFromEsRes);
- return Either.right(componentsUtils.getResponseFormat(actionStatus, resource.getName()));
- }
log.debug("component and all its artifacts were deleted, id = {}", resource.getName());
}
@@ -1720,7 +1739,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
List<InputDefinition> resourceProperties = resource.getInputs();
if ( (inputs != null && false == inputs.isEmpty()) || (resourceProperties != null && false == resourceProperties.isEmpty()) ) {
- Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs, resource, user, inTransaction);
+ Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs, resource);
if (createInputs.isRight()) {
return Either.right(createInputs.right().value());
}
@@ -2042,12 +2061,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
if (groupsToDelete != null && !groupsToDelete.isEmpty()) {
Set<String> artifactsToDelete = new HashSet<String>();
- /*
- * for (GroupDefinition group : groupsToDelete) { List<String> artifacts = group.getArtifacts(); if (artifacts != null) { artifactsToDelete.addAll(artifacts); Either<GroupDefinition, StorageOperationStatus> deleteGroupEither =
- * groupOperation.deleteGroup(group.getUniqueId(), inTransaction); if (deleteGroupEither.isRight()) { StorageOperationStatus storageOperationStatus = deleteGroupEither.right().value(); ActionStatus actionStatus =
- * componentsUtils.convertFromStorageResponse(storageOperationStatus); log.debug("Failed to delete group {} under component {}, error: {}", group.getUniqueId(), resource.getNormalizedName(), actionStatus.name()); return
- * Either.right(componentsUtils.getResponseFormat(actionStatus)); } } }
- */
+
for (String artifactId : artifactsToDelete) {
Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDelete = artifactsBusinessLogic.handleDelete(resource.getUniqueId(), artifactId, csarInfo.getModifier(), AuditingActionEnum.ARTIFACT_DELETE, ComponentTypeEnum.RESOURCE,
resource, null, null, shouldLock, inTransaction);
@@ -2169,9 +2183,14 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
////////////////////////////////////// create set parsed
////////////////////////////////////// artifacts///////////////////////////////////////////
Map<String, List<ArtifactTemplateInfo>> parsedArtifactsMap = parseResourceInfoFromYamlEither.left().value();
- Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection = parsedArtifactsMap.values();
+
Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = new HashMap<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>();
-
+ List<ArtifactTemplateInfo> artifactsWithoutGroups = null;
+ if(parsedArtifactsMap.containsKey(ArtifactTemplateInfo.CSAR_ARTIFACT)){
+ artifactsWithoutGroups = parsedArtifactsMap.get(ArtifactTemplateInfo.CSAR_ARTIFACT);
+ parsedArtifactsMap.remove(ArtifactTemplateInfo.CSAR_ARTIFACT);
+ }
+ Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection = parsedArtifactsMap.values();
for (List<ArtifactTemplateInfo> parsedGroupTemplateList : parsedArifactsCollection) {
for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
@@ -2235,7 +2254,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
////////////// artifacts////////////////////////////
Either<Resource, ResponseFormat> assDissotiateEither = associateAndDissociateArtifactsToGroup(csarInfo, resource, createdNewArtifacts, labelCounter, shouldLock, inTransaction, createdDeplymentArtifactsAfterDelete,
mergedgroup, deletedArtifacts);
-
+ groups = resource.getGroups();
if (assDissotiateEither.isRight()) {
log.debug("Failed to delete artifacts. Status is {} ", assDissotiateEither.right().value());
@@ -2251,7 +2270,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
- groups = resource.getGroups();
+
// update vfModule names
Set<GroupDefinition> groupForAssociateWithMembers = mergedgroup.keySet();
@@ -2331,7 +2350,16 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
-
+ if(artifactsWithoutGroups != null && !artifactsWithoutGroups.isEmpty()){
+ for(ArtifactTemplateInfo t: artifactsWithoutGroups){
+ List<ArtifactTemplateInfo> arrtifacts = new ArrayList<ArtifactTemplateInfo>();
+ arrtifacts.add(t);
+ Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, resource, arrtifacts, createdNewArtifacts, createdDeplymentArtifactsAfterDelete, labelCounter, shouldLock, inTransaction);
+ if (resStatus.isRight())
+ return resStatus;
+ };
+ }
+
Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
if (eitherGerResource.isRight()) {
ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
@@ -2351,17 +2379,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
for (ArtifactDefinition artifact : artifactsToDelete) {
String artifactType = artifact.getArtifactType();
ArtifactTypeEnum artifactTypeEnum = ArtifactTypeEnum.findType(artifactType);
- if (artifactTypeEnum == ArtifactTypeEnum.HEAT_ENV) {
-
- /*
- * Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromGraph = artifactOperation.removeArifactFromResource(resourceId, artifact.getUniqueId(), NodeTypeEnum.Resource, true, true); if
- * (removeArifactFromGraph.isRight()) { StorageOperationStatus status = removeArifactFromGraph.right().value(); log.debug("Failed to delete heat env artifact {} . status is {}", artifact.getUniqueId(), status); ActionStatus
- * actionStatus = componentsUtils.convertFromStorageResponse(status); return Either.right(componentsUtils.getResponseFormat(actionStatus)); }
- *
- * deletedArtifacts.add(removeArifactFromGraph.left().value());
- */
-
- } else {
+ if (artifactTypeEnum != ArtifactTypeEnum.HEAT_ENV) {
Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDelete = artifactsBusinessLogic.handleDelete(resourceId, artifact.getUniqueId(), user, AuditingActionEnum.ARTIFACT_DELETE, ComponentTypeEnum.RESOURCE, resource,
null, null, shouldLock, inTransaction);
if (handleDelete.isRight()) {
@@ -2425,8 +2443,9 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
GroupDefinition groupToUpdate = artifactsToUpdateEntry.getKey();
for (ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo> artifact : artifactsToUpdateList) {
- String prevUUID = artifact.getKey().getArtifactUUID();
+ String prevUUID = artifact.getKey().getArtifactUUID();
String prevId = artifact.getKey().getUniqueId();
+ String prevHeatEnvId = checkAndGetHeatEnvId(artifact.getKey());
Either<ArtifactDefinition, ResponseFormat> updateArtifactEither = updateDeploymentArtifactsFromCsar(csarInfo, resource, artifact.getKey(), artifact.getValue(), updatedArtifacts,
artifact.getRight().getRelatedArtifactsInfo(), shouldLock, inTransaction);
if (updateArtifactEither.isRight()) {
@@ -2441,6 +2460,13 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
groupToUpdate.getArtifacts().add(artAfterUpdate.getUniqueId());
groupToUpdate.getArtifactsUuid().add(artAfterUpdate.getArtifactUUID());
}
+ Optional<ArtifactDefinition> op = updatedArtifacts.stream().filter(p -> p.getGeneratedFromId() != null && p.getGeneratedFromId().equals(artAfterUpdate.getUniqueId())).findAny();
+ if (op.isPresent()) {
+ ArtifactDefinition artifactInfoHeatEnv = op.get();
+ groupToUpdate.getArtifacts().remove(prevHeatEnvId);
+ groupToUpdate.getArtifacts().add(artifactInfoHeatEnv.getUniqueId());
+ }
+
}
}
}
@@ -2521,16 +2547,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
- /*
- * if (!associateArtifactGroup.isEmpty()) {
- *
- * log.debug("Try to associate artifacts to groups.");
- *
- * Either<List<GroupDefinition>, ResponseFormat> assotiateGroupEither = groupBusinessLogic.associateArtifactsToGroup(resource.getUniqueId(), user.getUserId(), ComponentTypeEnum.RESOURCE, associateArtifactGroup, shouldLock, inTransaction); if
- * (assotiateGroupEither.isRight()) { log.debug("Failed to associate artifacts to groups. Status is {} ", assotiateGroupEither.right().value()); resEither = Either.right(assotiateGroupEither.right().value()); return resEither;
- *
- * } }
- */
+
ComponentParametersView parametersView = new ComponentParametersView();
parametersView.disableAll();
@@ -3332,6 +3349,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return resStatus;
}
ArtifactDefinition currentInfo = uploadArtifactToService.left().value().left().value();
+ updatedArtifacts.add(currentInfo);
Either<ArtifactDefinition, ResponseFormat> updateEnvEither = updateHeatParamsFromCsar(resource, csarInfo, artifactTemplateInfo, currentInfo, true);
if (updateEnvEither.isRight()) {
@@ -3342,7 +3360,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
// TODO evg update env time ( must be separate US for this!!!!)
updatedArtifacts.add(updateEnvEither.left().value());
- resStatus = Either.left(updateEnvEither.left().value());
+ resStatus = Either.left(currentInfo);
return resStatus;
@@ -3359,11 +3377,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return resStatus;
}
Either<List<HeatParameterDefinition>, ResponseFormat> propsStatus = extractHeatParameters(ArtifactTypeEnum.HEAT_ENV.getType(), artifactTemplateInfo.getEnv(), artifactparamsStatus.left().value().getValue(), false);
- /*
- * if (propsStatus.isRight()) {
- *
- * resStatus = Either.right(propsStatus.right().value()); return resStatus; }
- */
+
if (propsStatus.isLeft()) {
List<HeatParameterDefinition> updatedHeatEnvParams = propsStatus.left().value();
List<HeatParameterDefinition> currentHeatEnvParams = currentInfo.getListHeatParameters();
@@ -3405,6 +3419,23 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
if (isUpdateEnv) {
+ ComponentParametersView parametersView = new ComponentParametersView();
+ parametersView.disableAll();
+ parametersView.setIgnoreComponentInstances(false);
+ parametersView.setIgnoreUsers(false);
+ parametersView.setIgnoreArtifacts(false);
+ parametersView.setIgnoreGroups(false);
+
+ Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade.getToscaElement(resource.getUniqueId(), parametersView);
+
+ if (eitherGerResource.isRight()) {
+ ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
+
+ resStatus = Either.right(responseFormat);
+ return resStatus;
+
+ }
+ resource = eitherGerResource.left().value();
Map<String, ArtifactDefinition> artifacts = resource.getDeploymentArtifacts();
Optional<ArtifactDefinition> op = artifacts.values().stream().filter(p -> p.getGeneratedFromId() != null && p.getGeneratedFromId().equals(currentInfo.getUniqueId())).findAny();
if (op.isPresent()) {
@@ -3414,6 +3445,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
log.debug("Failed to update heat env on CSAR flow for component {} artifact {} label {}", resource.getUniqueId(), artifactInfoHeatEnv.getUniqueId(), artifactInfoHeatEnv.getArtifactLabel());
return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateArifactOnResource.right().value())));
}
+ resStatus = Either.left(updateArifactOnResource.left().value());
}
}
return resStatus;
@@ -3821,7 +3853,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
String value = null;
List<GetInputValueDataDefinition> getInputs = null;
boolean isValidate = true;
- if (null != propertyInfo && null != propertyInfo.getValue()) {
+ if (propertyInfo.getValue() != null) {
getInputs = propertyInfo.getGet_input();
isValidate = getInputs == null || getInputs.isEmpty();
if (isValidate) {
@@ -3944,10 +3976,10 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
RequirementDefinition validReq = eitherReqStatus.left().value();
- List<RequirementAndRelationshipPair> reqAndRelationshipPairList = regCapRelDef.getRelationships();
+ List<CapabilityRequirementRelationship> reqAndRelationshipPairList = regCapRelDef.getRelationships();
if (reqAndRelationshipPairList == null)
- reqAndRelationshipPairList = new ArrayList<RequirementAndRelationshipPair>();
- RequirementAndRelationshipPair reqAndRelationshipPair = new RequirementAndRelationshipPair();
+ reqAndRelationshipPairList = new ArrayList<>();
+ RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
reqAndRelationshipPair.setRequirement(regName);
reqAndRelationshipPair.setRequirementOwnerId(validReq.getOwnerId());
reqAndRelationshipPair.setRequirementUid(validReq.getUniqueId());
@@ -3982,7 +4014,9 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
reqAndRelationshipPair.setCapability(aviableCapForRel.getName());
reqAndRelationshipPair.setCapabilityUid(aviableCapForRel.getUniqueId());
reqAndRelationshipPair.setCapabilityOwnerId(aviableCapForRel.getOwnerId());
- reqAndRelationshipPairList.add(reqAndRelationshipPair);
+ CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
+ capReqRel.setRelation(reqAndRelationshipPair);
+ reqAndRelationshipPairList.add(capReqRel);
regCapRelDef.setRelationships(reqAndRelationshipPairList);
relations.add(regCapRelDef);
}
@@ -4151,8 +4185,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(validatevalueEiter.right().value()));
}
- // String uniqueId = UniqueIdBuilder.buildResourceInstancePropertyValueUid(currentCompInstance.getComponentUid(), index++);
- // property.setUniqueId(uniqueId);
property.setValue(validatevalueEiter.left().value());
if (getInputs != null && !getInputs.isEmpty()) {
@@ -4239,18 +4271,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
-
- // TODO temporary fix - remove specific capability node validation -
- // String reqNode = validReq.getNode();
- // if (reqNode != null && !reqNode.isEmpty() &&
- // !cap.getCapabilitySources().contains(reqNode)) {
- // return null;
- // }
- // RequirementAndRelationshipPair relationPair = getReqRelPair(cap);
- // Either<Boolean, StorageOperationStatus> eitherStatus = componentInstanceOperation.isAvailableCapabilty(currentCapCompInstance, relationPair);
- // if (eitherStatus.isRight() || eitherStatus.left().value() == false) {
- // return null;
- // }
return cap;
}
@@ -4261,13 +4281,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
List<CapabilityDefinition> capList = capMap.get(validReq.getCapability());
for (CapabilityDefinition cap : capList) {
- // TODO temporary fix - remove specific capability node
- // String reqNode = validReq.getNode();
- // if (reqNode != null && !reqNode.isEmpty()) {
- // if (!cap.getCapabilitySources().contains(reqNode)) {
- // continue;
- // }
- // }
if (cap.getMaxOccurrences() != null && !cap.getMaxOccurrences().equals(CapabilityDataDefinition.MAX_OCCURRENCES)) {
String leftOccurrences = cap.getLeftOccurrences();
if (leftOccurrences == null) {
@@ -5097,7 +5110,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
* createOrUpdateResourceByImport(resource, user, isNormative, false, needLock); }
*/
- public Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createOrUpdateResourceByImport(Resource resource, User user, boolean isNormative, boolean isInTransaction, boolean needLock, CsarInfo csarInfo) {
+ public Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createOrUpdateResourceByImport(Resource resource, User user, boolean isNormative, boolean isInTransaction, boolean needLock, CsarInfo csarInfo, String nodeName, boolean isNested) {
// check if resource already exist
Either<Resource, StorageOperationStatus> latestByName = toscaOperationFacade.getLatestByName(resource.getName());
@@ -5107,10 +5120,22 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
if (latestByName.isRight() && latestByName.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
Either<Resource, StorageOperationStatus> latestByToscaName = toscaOperationFacade.getLatestByToscaResourceName(resource.getToscaResourceName());
- if (latestByToscaName.isRight() && latestByToscaName.right().value().equals(StorageOperationStatus.NOT_FOUND))
+ if (csarInfo!= null && csarInfo.isUpdate() && nodeName != null && latestByToscaName.isRight() && latestByToscaName.right().value().equals(StorageOperationStatus.NOT_FOUND)){
+ latestByToscaName = toscaOperationFacade.getLatestByToscaResourceName(buildNestedToscaResourceName(resource.getResourceType().name(), csarInfo.getVfResourceName(), nodeName).getRight());
+ // update
+ if (latestByToscaName.isLeft()) {
+ log.debug("validate derived before update");
+ Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(latestByToscaName.left().value(), resource, ValidationUtils.hasBeenCertified(latestByToscaName.left().value().getVersion()));
+ if (eitherValidation.isRight()) {
+ result = createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
+ } else {
+ result = updateExistingResourceByImport(resource, latestByToscaName.left().value(), user, isNormative, needLock, isNested);
+ }
+ }
+ }
+ if (result == null && latestByToscaName.isRight() && latestByToscaName.right().value().equals(StorageOperationStatus.NOT_FOUND)){
result = createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
-
- else {
+ } else if (result == null){
StorageOperationStatus status = latestByName.right().value();
BeEcompErrorManager.getInstance().logBeComponentMissingError("Create / Update resource by import", ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
log.debug("resource already exist {}. status={}", resource.getName(), status);
@@ -5123,7 +5148,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
// update
else if (latestByName.isLeft()) {
- result = updateExistingResourceByImport(resource, latestByName.left().value(), user, isNormative, needLock);
+ result = updateExistingResourceByImport(resource, latestByName.left().value(), user, isNormative, needLock, isNested);
}
// error
@@ -5160,7 +5185,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return latestByName.isLeft();
}
- private Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> updateExistingResourceByImport(Resource newResource, Resource oldResource, User user, boolean inTransaction, boolean needLock) {
+ private Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> updateExistingResourceByImport(Resource newResource, Resource oldResource, User user, boolean inTransaction, boolean needLock, boolean isNested) {
String lockedResourceId = oldResource.getUniqueId();
log.debug("found resource: name={}, id={}, version={}, state={}", oldResource.getName(), lockedResourceId, oldResource.getVersion(), oldResource.getLifecycleState());
Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> result = null;
@@ -5184,7 +5209,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
mergeOldResourceMetadataWithNew(oldResource, newResource);
- Either<Boolean, ResponseFormat> validateFieldsResponse = validateResourceFieldsBeforeUpdate(oldResource, newResource, inTransaction);
+ Either<Boolean, ResponseFormat> validateFieldsResponse = validateResourceFieldsBeforeUpdate(oldResource, newResource, inTransaction, isNested);
if (validateFieldsResponse.isRight()) {
result = Either.right(validateFieldsResponse.right().value());
return result;
@@ -5211,7 +5236,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
newResource.setSystemName(oldResource.getSystemName());
if (oldResource.getCsarUUID() != null) {
newResource.setCsarUUID(oldResource.getCsarUUID());
- }
+ }
if (oldResource.getImportedToscaChecksum() != null) {
newResource.setImportedToscaChecksum(oldResource.getImportedToscaChecksum());
}
@@ -5957,7 +5982,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
//endregion
- Either<Boolean, ResponseFormat> validateResourceFields = validateResourceFieldsBeforeUpdate(currentResource, newResource, inTransaction);
+ Either<Boolean, ResponseFormat> validateResourceFields = validateResourceFieldsBeforeUpdate(currentResource, newResource, inTransaction, false);
if (validateResourceFields.isRight()) {
return Either.right(validateResourceFields.right().value());
}
@@ -6117,15 +6142,16 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
* validateResourceFieldsBeforeUpdate
*
* @param currentResource - Resource object to validate
+ * @param isNested
* @return Either<Boolean, ErrorResponse>
*/
- private Either<Boolean, ResponseFormat> validateResourceFieldsBeforeUpdate(Resource currentResource, Resource updateInfoResource, boolean inTransaction) {
+ private Either<Boolean, ResponseFormat> validateResourceFieldsBeforeUpdate(Resource currentResource, Resource updateInfoResource, boolean inTransaction, boolean isNested) {
boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentResource.getVersion());
// validate resource name
log.debug("validate resource name before update");
- Either<Boolean, ResponseFormat> eitherValidation = validateResourceName(currentResource, updateInfoResource, hasBeenCertified);
+ Either<Boolean, ResponseFormat> eitherValidation = validateResourceName(currentResource, updateInfoResource, hasBeenCertified, isNested);
if (eitherValidation.isRight()) {
return eitherValidation;
}
@@ -6314,10 +6340,10 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
return resourceName+"Cvfc";
}
- private Either<Boolean, ResponseFormat> validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
+ private Either<Boolean, ResponseFormat> validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified, boolean isNested) {
String resourceNameUpdated = updateInfoResource.getName();
if (!isResourceNameEquals(currentResource, updateInfoResource)) {
- if (!hasBeenCertified) {
+ if (isNested || !hasBeenCertified) {
Either<Boolean, ResponseFormat> validateResourceNameResponse = validateComponentName(null, updateInfoResource, null);
if (validateResourceNameResponse.isRight()) {
ResponseFormat errorResponse = validateResourceNameResponse.right().value();
@@ -6449,6 +6475,36 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
return Either.left(true);
}
+
+ private Either<Boolean, ResponseFormat> validateNestedDerivedFromDuringUpdate(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
+
+ List<String> currentDerivedFrom = currentResource.getDerivedFrom();
+ List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
+ if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null || updatedDerivedFrom.isEmpty()) {
+ log.trace("Update normative types");
+ return Either.left(true);
+ }
+
+ String derivedFromCurrent = currentDerivedFrom.get(0);
+ String derivedFromUpdated = updatedDerivedFrom.get(0);
+
+ if (!derivedFromCurrent.equals(derivedFromUpdated)) {
+ if (!hasBeenCertified) {
+ Either<Boolean, ResponseFormat> validateDerivedFromExistsEither = validateDerivedFromExist(null, updateInfoResource, null);
+ if (validateDerivedFromExistsEither.isRight()) {
+ return validateDerivedFromExistsEither;
+ }
+ } else {
+ Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null, currentResource, updateInfoResource, null);
+
+ if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left().value()) {
+ log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
+ return validateDerivedFromExtending;
+ }
+ }
+ }
+ return Either.left(true);
+ }
private Either<Boolean, ResponseFormat> validateDerivedFromExist(User user, Resource resource, AuditingActionEnum actionEnum) {
@@ -7309,9 +7365,10 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
- private String buildNestedToscaResourceName(String nodeResourceType, String vfResourceName, String nodeTypeFullName) {
+ private ImmutablePair<String, String> buildNestedToscaResourceName(String nodeResourceType, String vfResourceName, String nodeTypeFullName) {
String actualType;
String actualVfName;
+ String actualPreviousVfName;
if(ResourceTypeEnum.CVFC.name().equals(nodeResourceType)){
actualVfName = vfResourceName + ResourceTypeEnum.CVFC.name();
actualType = ResourceTypeEnum.VFC.name();
@@ -7319,6 +7376,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
actualVfName = vfResourceName;
actualType = nodeResourceType;
}
+
StringBuilder toscaResourceName = new StringBuilder(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX);
String nameWithouNamespacePrefix = nodeTypeFullName.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
String[] findTypes = nameWithouNamespacePrefix.split("\\.");
@@ -7330,7 +7388,8 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
} else {
toscaResourceName.append(actualType.toLowerCase()).append('.').append(ValidationUtils.convertToSystemName(actualVfName)).append('.').append(Constants.ABSTRACT);
}
- return toscaResourceName.append(actualName.toLowerCase()).toString();
+ StringBuilder previousToscaResourceName = new StringBuilder(toscaResourceName);
+ return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(), previousToscaResourceName.append(actualName.substring(actualName.split("\\.")[1].length() + 1).toLowerCase()).toString());
}
public ICacheMangerOperation getCacheManagerOperation() {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
index b21195ff42..7ed90ce3b6 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
@@ -20,7 +20,22 @@
package org.openecomp.sdc.be.components.impl;
-import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import javax.servlet.ServletContext;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.auditing.api.IAuditingManager;
@@ -38,7 +53,17 @@ import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.impl.WebAppContextWrapper;
-import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.CapabilityDefinition;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.CsarInfo;
+import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.RequirementDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.UploadResourceInfo;
+import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.category.CategoryDefinition;
import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
@@ -57,20 +82,7 @@ import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.yaml.snakeyaml.Yaml;
-import javax.servlet.ServletContext;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
+import fj.data.Either;
@Component("resourceImportManager")
public class ResourceImportManager {
@@ -110,7 +122,7 @@ public class ResourceImportManager {
lifecycleChangeInfo.setUserRemarks("certification on import");
Function<Resource, Either<Boolean, ResponseFormat>> validator = (resource) -> resourceBusinessLogic.validatePropertiesDefaultValues(resource);
- return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, null, null, false, null);
+ return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, null, null, false, null, null, false);
}
public Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> importNormativeResourceFromCsar(String resourceYml, UploadResourceInfo resourceMetaData, User creator, boolean createNewVersion, boolean needLock) {
@@ -119,11 +131,11 @@ public class ResourceImportManager {
lifecycleChangeInfo.setUserRemarks("certification on import");
Function<Resource, Either<Boolean, ResponseFormat>> validator = (resource) -> resourceBusinessLogic.validatePropertiesDefaultValues(resource);
- return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, null, null, false, null);
+ return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, null, null, false, null, null, false);
}
public Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> importCertifiedResource(String resourceYml, UploadResourceInfo resourceMetaData, User creator, Function<Resource, Either<Boolean, ResponseFormat>> validationFunction,
- LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean isInTransaction, boolean createNewVersion, boolean needLock, Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo) {
+ LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean isInTransaction, boolean createNewVersion, boolean needLock, Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo, String nodeName, boolean isNested) {
Resource resource = new Resource();
ImmutablePair<Resource, ActionStatus> responsePair = new ImmutablePair<>(resource, ActionStatus.CREATED);
Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> response = Either.left(responsePair);
@@ -152,7 +164,7 @@ public class ResourceImportManager {
}
}
- response = resourceBusinessLogic.createOrUpdateResourceByImport(resource, creator, true, isInTransaction, needLock, csarInfo);
+ response = resourceBusinessLogic.createOrUpdateResourceByImport(resource, creator, true, isInTransaction, needLock, csarInfo, nodeName, isNested);
Either<Resource, ResponseFormat> changeStateResponse;
if (response.isLeft()) {
resource = response.left().value().left;
@@ -240,7 +252,7 @@ public class ResourceImportManager {
Either<Boolean, ResponseFormat> validatePropertiesTypes = resourceBusinessLogic.validatePropertiesDefaultValues(resource);
if (validatePropertiesTypes.isLeft()) {
- response = resourceBusinessLogic.createOrUpdateResourceByImport(resource, creator, false, isInTransaction, true, null);
+ response = resourceBusinessLogic.createOrUpdateResourceByImport(resource, creator, false, isInTransaction, true, null, null, false);
} else {
ResponseFormat validationErrorResponse = validatePropertiesTypes.right().value();
auditErrorImport(resourceMetaData, creator, validationErrorResponse, false);
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResponseFormatManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResponseFormatManager.java
index e8c0bf3d8a..136121484d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResponseFormatManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResponseFormatManager.java
@@ -20,13 +20,11 @@
package org.openecomp.sdc.be.components.impl;
-import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.config.ConfigurationManager;
import org.openecomp.sdc.be.config.ErrorConfiguration;
import org.openecomp.sdc.be.config.ErrorInfo;
import org.openecomp.sdc.be.config.ErrorInfo.ErrorInfoType;
import org.openecomp.sdc.be.dao.api.ActionStatus;
-import org.openecomp.sdc.common.config.EcompErrorName;
import org.openecomp.sdc.exception.OkResponseInfo;
import org.openecomp.sdc.exception.PolicyException;
import org.openecomp.sdc.exception.ResponseFormat;
@@ -60,7 +58,6 @@ public class ResponseFormatManager {
ErrorConfiguration errorConfiguration = configurationManager.getErrorConfiguration();
ErrorInfo errorInfo = errorConfiguration.getErrorInfo(responseEnum.name());
if (errorInfo == null) {
- BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.EcompErrorNotFound, "ResponseFormatManager", responseEnum.name());
log.debug("failed to locate {} in error configuration", responseEnum.name());
errorInfo = errorConfiguration.getErrorInfo(ActionStatus.GENERAL_ERROR.name());
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
index 89c444b6d9..23852c30a2 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
@@ -23,7 +23,6 @@ package org.openecomp.sdc.be.components.impl;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
@@ -359,7 +358,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
if (genericServiceEither.isRight())
return Either.right(genericServiceEither.right().value());
- generateInputsFromGenericTypeProperties(service, genericServiceEither.left().value());
+ generateAndAddInputsFromGenericTypeProperties(service, genericServiceEither.left().value());
Either<Service, StorageOperationStatus> dataModelResponse = toscaOperationFacade.createToscaComponent(service);
@@ -711,7 +710,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
String uuidUpdated = serviceUpdate.getUUID();
String uuidCurrent = currentService.getUUID();
if (!uuidCurrent.equals(uuidUpdated)) {
- log.info("update srvice: recived request to update uuid to {} the field is not updatable ignoring.", uuidUpdated);
+ log.info("update service: recived request to update uuid to {} the field is not updatable ignoring.", uuidUpdated);
}
response = validateAndUpdateServiceType(user, currentService, serviceUpdate, null);
@@ -734,7 +733,9 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
serviceUpdate.setInvariantUUID(currentInvariantUuid);
}
validateAndUpdateEcompNaming(currentService, serviceUpdate);
-
+
+ currentService.setEnvironmentContext(serviceUpdate.getEnvironmentContext());
+
return Either.left(currentService);
}
@@ -1508,7 +1509,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
return vfModuleAertifact;
}
- private void fillVfModuleInstHeatEnvPayload(List<GroupInstance> groupsForCurrVF, ComponentInstance currVFInstance, Wrapper<String> payloadWrapper) {
+ private void fillVfModuleInstHeatEnvPayload(List<GroupInstance> groupsForCurrVF, Wrapper<String> payloadWrapper) {
// Converts GroupDefinition to VfModuleArtifactPayload which is the
// format used in the payload
@@ -1531,37 +1532,13 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
}
- private void addHeatEnvArtifactsToVFModulePayload(VfModuleArtifactPayload vfModulePayload, ComponentInstance currVFInstance) {
- List<String> originalModuleArtifacts = vfModulePayload.getArtifacts();
- if (!MapUtils.isEmpty(currVFInstance.getDeploymentArtifacts()) && !CollectionUtils.isEmpty(originalModuleArtifacts)) {
-
- // EVG : fix now for patch. remove null from list. Need to be fixed later : remove VF HEAT ENV uuid from the list??
- List<String> filteredUUIDFromModule = originalModuleArtifacts.stream().filter(uuid -> uuid != null).collect(Collectors.toList());
-
- final Collection<ArtifactDefinition> depInsArtifacts = currVFInstance.getDeploymentArtifacts().values();
- // All Heat_ENV
- List<ArtifactDefinition> heatEnvArtifacts = depInsArtifacts.stream().filter(art -> art.getArtifactType().equals(ArtifactTypeEnum.HEAT_ENV.getType())).collect(Collectors.toList());
- // Unique Id Of Artifacts In the vf module
- List<String> moduleArtUniqueId = depInsArtifacts.stream().filter(art -> originalModuleArtifacts.contains(art.getArtifactUUID())).map(art -> art.getUniqueId()).collect(Collectors.toList());
- // Collect Only Heat Artifatcs that are Generated from artifacts in
- // the module
- List<String> relevantHeatEnvUUID = heatEnvArtifacts.stream().filter(heatEnv -> moduleArtUniqueId.contains(heatEnv.getGeneratedFromId())).map(heatEnv -> heatEnv.getArtifactUUID()).collect(Collectors.toList());
-
- List<String> fullArtifactList = new ArrayList<>();
- fullArtifactList.addAll(filteredUUIDFromModule);
- fullArtifactList.addAll(relevantHeatEnvUUID);
-
- vfModulePayload.setArtifacts(fullArtifactList);
- }
- }
-
private Either<ArtifactDefinition, ResponseFormat> generateVfModuleInstanceArtifact(User modifier, ComponentInstance currVFInstance, Service service, boolean shouldLock) {
ArtifactDefinition vfModuleAertifact = null;
Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
Wrapper<String> payloadWrapper = new Wrapper<>();
List<GroupInstance> groupsForCurrVF = collectGroupsInstanceForCompInstance(currVFInstance, responseWrapper);
if (responseWrapper.isEmpty()) {
- fillVfModuleInstHeatEnvPayload(groupsForCurrVF, currVFInstance, payloadWrapper);
+ fillVfModuleInstHeatEnvPayload(groupsForCurrVF, payloadWrapper);
}
if (responseWrapper.isEmpty() && payloadWrapper.getInnerElement() != null) {
vfModuleAertifact = getVfModuleInstArtifactForCompInstance(currVFInstance, service, modifier, groupsForCurrVF, payloadWrapper, responseWrapper);
@@ -1694,7 +1671,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
@Override
public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
- return artifactsBusinessLogic.generateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service, resourceInstanceName, modifier, shouldLock, instanceId);
+ return artifactsBusinessLogic.forceGenerateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service, resourceInstanceName, modifier, shouldLock, instanceId);
}
public ArtifactDefinition getArtifactDefinition() {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/VFComponentInstanceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/VFComponentInstanceBusinessLogic.java
index 5a93ecf182..c5db7ee022 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/VFComponentInstanceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/VFComponentInstanceBusinessLogic.java
@@ -20,19 +20,12 @@
package org.openecomp.sdc.be.components.impl;
-import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
-import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.tosca.ToscaUtils;
-import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
-import fj.data.Either;
-
@Component("vfComponentInstanceBusinessLogic")
public class VFComponentInstanceBusinessLogic extends ComponentInstanceBusinessLogic {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/generic/GenericTypeBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/generic/GenericTypeBusinessLogic.java
new file mode 100644
index 0000000000..7f6abe7f2c
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/generic/GenericTypeBusinessLogic.java
@@ -0,0 +1,91 @@
+package org.openecomp.sdc.be.components.impl.generic;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import fj.data.Either;
+
+@org.springframework.stereotype.Component
+public class GenericTypeBusinessLogic {
+
+ private final static Logger log = LoggerFactory.getLogger(GenericTypeBusinessLogic.class);
+
+ @Autowired
+ private ComponentsUtils componentsUtils;
+
+ @Autowired
+ private ToscaOperationFacade toscaOperationFacade;
+
+ /**
+ * @param component the component of which to fetch its generic type
+ * @return the generic node type which corresponds to the given component
+ */
+ public Either<Resource, ResponseFormat> fetchDerivedFromGenericType(Component component){
+ String genericTypeToscaName = getGenericTypeToscaName(component);
+ log.debug("Fetching generic tosca name {}", genericTypeToscaName);
+ if(null == genericTypeToscaName) {
+ log.debug("Failed to fetch certified generic node type for component {}", component.getName());
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+
+ Either<Resource, StorageOperationStatus> findLatestGeneric = toscaOperationFacade.getLatestCertifiedNodeTypeByToscaResourceName(genericTypeToscaName);
+ if(findLatestGeneric.isRight()){
+ log.debug("Failed to fetch certified node type by tosca resource name {}", genericTypeToscaName);
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType(), genericTypeToscaName));
+ }
+
+ Resource genericTypeResource = findLatestGeneric.left().value();
+ return Either.left(genericTypeResource);
+ }
+
+ /**
+ *
+ * @param genericType the generic node type
+ * @return the generic type properties as inputs
+ */
+ public List<InputDefinition> generateInputsFromGenericTypeProperties(Resource genericType) {
+ List<PropertyDefinition> genericTypeProps = genericType.getProperties();
+ if(null != genericTypeProps) {
+ return convertGenericTypePropertiesToInputsDefintion(genericTypeProps, genericType.getUniqueId());
+ }
+ return new ArrayList<>();
+ }
+
+ public List<InputDefinition> convertGenericTypePropertiesToInputsDefintion(List<PropertyDefinition> genericTypeProps, String genericUniqueId) {
+ return genericTypeProps.stream()
+ .map(p -> setInputDefinitionFromProp(p, genericUniqueId))
+ .collect(Collectors.toList());
+ }
+
+ private InputDefinition setInputDefinitionFromProp(PropertyDefinition prop, String genericUniqueId){
+ InputDefinition input = new InputDefinition(prop);
+ input.setOwnerId(genericUniqueId);
+ return input;
+ }
+
+ private <T extends Component> String getGenericTypeToscaName(T component) {
+ return isCvfcHasDerivedFrom(component) ? ((Resource)component).getDerivedFrom().get(0) : component.fetchGenericTypeToscaNameFromConfig();
+ }
+
+ private <T extends Component> boolean isCvfcHasDerivedFrom(T component) {
+ return component.getComponentType() == ComponentTypeEnum.RESOURCE && ((Resource)component).getResourceType() == ResourceTypeEnum.CVFC && CollectionUtils.isNotEmpty(((Resource)component).getDerivedFrom());
+ }
+
+}