aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java113
1 files changed, 110 insertions, 3 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java
index 15fff52ab9..002ae50cde 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ComponentValidations.java
@@ -20,19 +20,126 @@
package org.openecomp.sdc.be.components.validation;
+import org.apache.commons.collections.CollectionUtils;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
+import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
+import java.util.Set;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.GroupDefinition;
+import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.StorageException;
+import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
+import org.openecomp.sdc.common.util.ValidationUtils;
-public class ComponentValidations {
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static java.util.stream.Collectors.toList;
+
+
+@org.springframework.stereotype.Component
+public final class ComponentValidations {
+
+ private final ToscaOperationFacade toscaOperationFacade;
+ private final IGraphLockOperation graphLockOperation;
+
+ public ComponentValidations(ToscaOperationFacade toscaOperationFacade, IGraphLockOperation graphLockOperation) {
+ this.toscaOperationFacade = toscaOperationFacade;
+ this.graphLockOperation = graphLockOperation;
+ }
public static boolean validateComponentInstanceExist(Component component, String instanceId) {
return Optional.ofNullable(component.getComponentInstances())
- .map(componentInstances -> componentInstances.stream().map(ComponentInstance::getUniqueId).collect(Collectors.toList()))
+ .map(componentInstances -> componentInstances.stream().map(ComponentInstance::getUniqueId).collect(toList()))
.filter(instancesIds -> instancesIds.contains(instanceId))
.isPresent();
}
+ public static String getNormalizedName(ToscaDataDefinition toscaDataDefinition) {
+ String name = (String) toscaDataDefinition.getToscaPresentationValue(JsonPresentationFields.NAME);
+ return org.openecomp.sdc.common.util.ValidationUtils.normalizeComponentInstanceName(name);
+ }
+
+ /**
+ * The following logic is applied:
+ * For each name new or existing name we look at the normalized name which is used in Tosca representation
+ * @param currentName
+ * @param newName
+ * @param component
+ * @return True is new name can be used in this component, false otherwise
+ */
+ public static boolean validateNameIsUniqueInComponent(String currentName, String newName, Component component) {
+ String normalizedCurrentName = ValidationUtils.normalizeComponentInstanceName(currentName);
+ String normalizedNewName = ValidationUtils.normalizeComponentInstanceName(newName);
+
+ if (normalizedCurrentName.equals(normalizedNewName)) {
+ return true; //As it's same entity, still considered unique
+ }
+ List<GroupDefinition> groups = component.getGroups();
+ List<ComponentInstance> componentInstances = component.getComponentInstances();
+ Set<String> existingNames = new HashSet<>();
+ if (CollectionUtils.isNotEmpty(groups)) {
+ List<String> existingGroupNames = groups
+ .stream()
+ .map(ComponentValidations::getNormalizedName)
+ .collect(toList());
+ existingNames.addAll(existingGroupNames);
+ }
+ if (CollectionUtils.isNotEmpty(componentInstances)) {
+ List<String> existingInstanceNames = componentInstances
+ .stream()
+ .map(ComponentValidations::getNormalizedName)
+ .collect(toList());
+ existingNames.addAll(existingInstanceNames);
+ }
+ return !existingNames.contains(normalizedNewName);
+ }
+
+ public Component validateComponentIsCheckedOutByUserAndLockIt(ComponentTypeEnum componentTypeEnum, String componentId, String userId) {
+ Component component = getComponent(componentId, componentTypeEnum);
+
+ if (!ComponentValidationUtils.canWorkOnComponent(component, userId)) {
+ throw new ComponentException(ActionStatus.ILLEGAL_COMPONENT_STATE, component.getName());
+ }
+
+ lockComponent(component);
+
+ return component;
+ }
+
+ private Component getComponent(String componentId, ComponentTypeEnum componentType) {
+ Component component = toscaOperationFacade.getToscaElement(componentId, new ComponentParametersView())
+ .left()
+ .on(this::onToscaOperationError);
+
+ if (componentType!=component.getComponentType()) {
+ throw new ComponentException(ActionStatus.INVALID_RESOURCE_TYPE);
+ }
+
+ return component;
+ }
+
+ private void lockComponent(Component component) {
+ StorageOperationStatus lockComponentStatus = graphLockOperation.lockComponent(component.getUniqueId(),
+ component.getComponentType().getNodeType());
+ if (!StorageOperationStatus.OK.equals(lockComponentStatus)) {
+ throw new StorageException(lockComponentStatus);
+ }
+ }
+
+ private Component onToscaOperationError(StorageOperationStatus storageOperationStatus) {
+ throw new StorageException(storageOperationStatus);
+ }
+
}