2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.validation;
23 import org.apache.commons.collections.CollectionUtils;
24 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
25 import org.openecomp.sdc.be.dao.api.ActionStatus;
26 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
27 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
28 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
29 import java.util.List;
30 import java.util.Optional;
33 import org.openecomp.sdc.be.model.Component;
34 import org.openecomp.sdc.be.model.ComponentInstance;
35 import org.openecomp.sdc.be.model.ComponentParametersView;
36 import org.openecomp.sdc.be.model.GroupDefinition;
37 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
38 import org.openecomp.sdc.be.model.operations.StorageException;
39 import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation;
40 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
41 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
42 import org.openecomp.sdc.common.util.ValidationUtils;
44 import java.util.HashSet;
45 import java.util.List;
48 import static java.util.stream.Collectors.toList;
51 @org.springframework.stereotype.Component
52 public final class ComponentValidations {
54 private final ToscaOperationFacade toscaOperationFacade;
55 private final IGraphLockOperation graphLockOperation;
57 public ComponentValidations(ToscaOperationFacade toscaOperationFacade, IGraphLockOperation graphLockOperation) {
58 this.toscaOperationFacade = toscaOperationFacade;
59 this.graphLockOperation = graphLockOperation;
62 public static boolean validateComponentInstanceExist(Component component, String instanceId) {
63 return Optional.ofNullable(component.getComponentInstances())
64 .map(componentInstances -> componentInstances.stream().map(ComponentInstance::getUniqueId).collect(toList()))
65 .filter(instancesIds -> instancesIds.contains(instanceId))
69 public static String getNormalizedName(ToscaDataDefinition toscaDataDefinition) {
70 String name = (String) toscaDataDefinition.getToscaPresentationValue(JsonPresentationFields.NAME);
71 return org.openecomp.sdc.common.util.ValidationUtils.normalizeComponentInstanceName(name);
75 * The following logic is applied:
76 * For each name new or existing name we look at the normalized name which is used in Tosca representation
80 * @return True is new name can be used in this component, false otherwise
82 public static boolean validateNameIsUniqueInComponent(String currentName, String newName, Component component) {
83 String normalizedCurrentName = ValidationUtils.normalizeComponentInstanceName(currentName);
84 String normalizedNewName = ValidationUtils.normalizeComponentInstanceName(newName);
86 if (normalizedCurrentName.equals(normalizedNewName)) {
87 return true; //As it's same entity, still considered unique
89 List<GroupDefinition> groups = component.getGroups();
90 List<ComponentInstance> componentInstances = component.getComponentInstances();
91 Set<String> existingNames = new HashSet<>();
92 if (CollectionUtils.isNotEmpty(groups)) {
93 List<String> existingGroupNames = groups
95 .map(ComponentValidations::getNormalizedName)
97 existingNames.addAll(existingGroupNames);
99 if (CollectionUtils.isNotEmpty(componentInstances)) {
100 List<String> existingInstanceNames = componentInstances
102 .map(ComponentValidations::getNormalizedName)
104 existingNames.addAll(existingInstanceNames);
106 return !existingNames.contains(normalizedNewName);
109 public Component validateComponentIsCheckedOutByUserAndLockIt(ComponentTypeEnum componentTypeEnum, String componentId, String userId) {
110 Component component = getComponent(componentId, componentTypeEnum);
112 if (!ComponentValidationUtils.canWorkOnComponent(component, userId)) {
113 throw new ComponentException(ActionStatus.ILLEGAL_COMPONENT_STATE, component.getName());
116 lockComponent(component);
121 private Component getComponent(String componentId, ComponentTypeEnum componentType) {
122 Component component = toscaOperationFacade.getToscaElement(componentId, new ComponentParametersView())
124 .on(this::onToscaOperationError);
126 if (componentType!=component.getComponentType()) {
127 throw new ComponentException(ActionStatus.INVALID_RESOURCE_TYPE);
133 private void lockComponent(Component component) {
134 StorageOperationStatus lockComponentStatus = graphLockOperation.lockComponent(component.getUniqueId(),
135 component.getComponentType().getNodeType());
136 if (!StorageOperationStatus.OK.equals(lockComponentStatus)) {
137 throw new StorageException(lockComponentStatus);
141 private Component onToscaOperationError(StorageOperationStatus storageOperationStatus) {
142 throw new StorageException(storageOperationStatus);