2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2020 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 * SPDX-License-Identifier: Apache-2.0
17 * ============LICENSE_END=========================================================
19 package org.openecomp.sdc.be.components.impl;
21 import static org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR;
23 import fj.data.Either;
24 import java.util.Arrays;
25 import java.util.Collections;
26 import java.util.Optional;
27 import org.apache.commons.lang3.StringUtils;
28 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
29 import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
30 import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
31 import org.openecomp.sdc.be.dao.api.ActionStatus;
32 import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
33 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
34 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition;
36 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
37 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
38 import org.openecomp.sdc.be.datatypes.enums.NodeFilterConstraintType;
39 import org.openecomp.sdc.be.model.Component;
40 import org.openecomp.sdc.be.model.ComponentInstance;
41 import org.openecomp.sdc.be.model.User;
42 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
43 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
44 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
45 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
46 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
47 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
48 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
49 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
50 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
51 import org.openecomp.sdc.be.ui.model.UIConstraint;
52 import org.openecomp.sdc.be.user.Role;
53 import org.openecomp.sdc.common.log.wrappers.Logger;
54 import org.openecomp.sdc.exception.ResponseFormat;
55 import org.springframework.beans.factory.annotation.Autowired;
57 @org.springframework.stereotype.Component("componentNodeFilterBusinessLogic")
58 public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
60 private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
61 private final NodeFilterOperation nodeFilterOperation;
62 private final NodeFilterValidator nodeFilterValidator;
65 public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao, final IGroupOperation groupOperation,
66 final IGroupInstanceOperation groupInstanceOperation, final IGroupTypeOperation groupTypeOperation,
67 final InterfaceOperation interfaceOperation,
68 final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
69 final ArtifactsOperations artifactToscaOperation, final NodeFilterOperation nodeFilterOperation,
70 final NodeFilterValidator nodeFilterValidator) {
71 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
72 artifactToscaOperation);
73 this.nodeFilterOperation = nodeFilterOperation;
74 this.nodeFilterValidator = nodeFilterValidator;
77 public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId, final String componentInstanceId,
78 final boolean shouldLock, final ComponentTypeEnum componentTypeEnum)
79 throws BusinessLogicException {
80 final Component component = getComponent(componentId);
81 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
82 Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
83 if (filterDataDefinition.isPresent()) {
84 return filterDataDefinition;
86 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
87 boolean wasLocked = false;
90 lockComponent(component.getUniqueId(), component, "Create Node Filter on component");
93 result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
94 if (result.isRight()) {
95 janusGraphDao.rollback();
96 LOGGER.error(BUSINESS_PROCESS_ERROR, "Failed to Create Node filter on component with id {}", componentId);
97 throw new BusinessLogicException(componentsUtils
98 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
100 filterDataDefinition = Optional.ofNullable(result.left().value());
102 janusGraphDao.commit();
103 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
104 } catch (final Exception e) {
105 janusGraphDao.rollback();
106 LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
107 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
110 unlockComponent(component.getUniqueId(), componentTypeEnum);
113 return filterDataDefinition;
116 public Optional<String> deleteNodeFilterIfExists(final String componentId, final String componentInstanceId, final boolean shouldLock,
117 final ComponentTypeEnum componentTypeEnum) throws BusinessLogicException {
118 final Component component = getComponent(componentId);
119 final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition = getCiNodeFilterDataDefinition(componentInstanceId, component);
120 if (!nodeFilterDataDefinition.isPresent()) {
121 return Optional.ofNullable(componentInstanceId);
123 final Either<String, StorageOperationStatus> result;
124 boolean wasLocked = false;
127 lockComponent(component.getUniqueId(), component, "Delete Node Filter from component");
130 result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
131 if (result.isRight()) {
132 LOGGER.error(BUSINESS_PROCESS_ERROR, "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
133 result.right().value());
134 janusGraphDao.rollback();
135 throw new BusinessLogicException(componentsUtils
136 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
138 janusGraphDao.commit();
139 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
140 } catch (final Exception e) {
141 LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during delete deleting node filter: {}", e.getMessage(), e);
142 janusGraphDao.rollback();
143 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
146 unlockComponent(component.getUniqueId(), componentTypeEnum);
149 return Optional.ofNullable(result.left().value());
152 public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId, final String componentInstanceId,
153 final NodeFilterConstraintAction action, final String propertyName,
154 final String constraint, final boolean shouldLock,
155 final ComponentTypeEnum componentTypeEnum,
156 final NodeFilterConstraintType nodeFilterConstraintType, final String capabilityName)
157 throws BusinessLogicException {
158 final Component component = getComponent(componentId);
159 CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint,
160 component, nodeFilterConstraintType);
161 boolean wasLocked = false;
164 lockComponent(component.getUniqueId(), component, "Add Node Filter on Component");
167 final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition = new RequirementNodeFilterPropertyDataDefinition();
168 requirementNodeFilterPropertyDataDefinition.setName(propertyName);
169 requirementNodeFilterPropertyDataDefinition.setConstraints(Collections.singletonList(constraint));
170 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = addNewNodeFilter(componentId, componentInstanceId,
171 nodeFilterConstraintType, nodeFilterDataDefinition, requirementNodeFilterPropertyDataDefinition, capabilityName);
172 if (result.isRight()) {
173 janusGraphDao.rollback();
174 throw new BusinessLogicException(componentsUtils
175 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
177 nodeFilterDataDefinition = result.left().value();
179 janusGraphDao.commit();
180 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
181 } catch (final Exception e) {
182 janusGraphDao.rollback();
183 LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
184 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
187 unlockComponent(component.getUniqueId(), componentTypeEnum);
190 return Optional.ofNullable(nodeFilterDataDefinition);
193 public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId, final String componentInstanceId,
194 final NodeFilterConstraintAction action, final String constraint, final int position,
195 final boolean shouldLock, final ComponentTypeEnum componentTypeEnum,
196 final NodeFilterConstraintType nodeFilterConstraintType)
197 throws BusinessLogicException {
198 final Component component = getComponent(componentId);
199 CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint,
200 component, nodeFilterConstraintType);
201 boolean wasLocked = false;
204 lockComponent(component.getUniqueId(), component, "Add Node Filter on Component");
207 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
208 .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position, nodeFilterConstraintType);
209 if (result.isRight()) {
210 janusGraphDao.rollback();
211 throw new BusinessLogicException(componentsUtils
212 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
214 nodeFilterDataDefinition = result.left().value();
216 janusGraphDao.commit();
217 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
218 } catch (final Exception e) {
219 janusGraphDao.rollback();
220 LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
221 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
224 unlockComponent(component.getUniqueId(), componentTypeEnum);
227 return Optional.ofNullable(nodeFilterDataDefinition);
230 private Either<CINodeFilterDataDefinition, StorageOperationStatus> addNewNodeFilter(final String componentId, final String componentInstanceId,
231 final NodeFilterConstraintType nodeFilterConstraintType,
232 final CINodeFilterDataDefinition nodeFilterDataDefinition,
233 final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition,
234 final String capabilityName) {
235 if (NodeFilterConstraintType.PROPERTIES.equals(nodeFilterConstraintType)) {
236 return nodeFilterOperation
237 .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, requirementNodeFilterPropertyDataDefinition);
239 final RequirementNodeFilterCapabilityDataDefinition requirementNodeFilterCapabilityDataDefinition = new RequirementNodeFilterCapabilityDataDefinition();
240 requirementNodeFilterCapabilityDataDefinition.setName(capabilityName);
241 final ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> propertyDataDefinitionListDataDefinition = new ListDataDefinition<>();
242 propertyDataDefinitionListDataDefinition.getListToscaDataDefinition()
243 .addAll(Collections.singleton(requirementNodeFilterPropertyDataDefinition));
244 requirementNodeFilterCapabilityDataDefinition.setProperties(propertyDataDefinitionListDataDefinition);
245 return nodeFilterOperation
246 .addNewCapabilities(componentId, componentInstanceId, nodeFilterDataDefinition, requirementNodeFilterCapabilityDataDefinition);
249 private void unlockComponent(final String componentUniqueId, final ComponentTypeEnum componentType) {
250 graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
253 public User validateUser(final String userId) {
254 final User user = userValidations.validateUserExists(userId);
255 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
259 private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId, final Component component) {
260 return component.getComponentInstanceById(componentInstanceId);
263 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final Optional<ComponentInstance> componentInstance) {
264 if (componentInstance.isPresent()) {
265 return Optional.ofNullable(componentInstance.get().getNodeFilter());
267 return Optional.empty();
270 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId, final Component component)
271 throws BusinessLogicException {
272 final Either<Boolean, ResponseFormat> response = nodeFilterValidator.validateComponentInstanceExist(component, componentInstanceId);
273 if (response.isRight()) {
274 throw new BusinessLogicException(
275 componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
277 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
278 if (componentInstance.isPresent()) {
279 return Optional.ofNullable(componentInstance.get().getNodeFilter());
281 return Optional.empty();
284 private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
285 final NodeFilterConstraintAction action, final String constraint,
286 final Component component,
287 final NodeFilterConstraintType nodeFilterConstraintType)
288 throws BusinessLogicException {
289 validateNodeFilter(component, componentInstanceId, action, constraint, nodeFilterConstraintType);
290 final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(componentInstanceId, component);
291 if (!cINodeFilterDataDefinition.isPresent()) {
292 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
294 return cINodeFilterDataDefinition.get();
297 private void validateNodeFilter(final Component component, final String componentInstanceId, final NodeFilterConstraintAction action,
298 final String constraint, final NodeFilterConstraintType nodeFilterConstraintType) throws BusinessLogicException {
299 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
300 .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action, nodeFilterConstraintType);
301 if (response.isRight()) {
302 throw new BusinessLogicException(
303 componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
307 public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId, final String componentInstanceId,
308 final UIConstraint uiConstraint, final ComponentTypeEnum componentTypeEnum,
309 final NodeFilterConstraintType nodeFilterConstraintType, final int index)
310 throws BusinessLogicException {
311 final Optional<CINodeFilterDataDefinition> deleteActionResponse = deleteNodeFilter(componentId, componentInstanceId,
312 NodeFilterConstraintAction.DELETE, null, index, true, componentTypeEnum, nodeFilterConstraintType);
313 if (!deleteActionResponse.isPresent()) {
314 throw new BusinessLogicException(
315 componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR, "Failed to delete node filter capabilities"));
317 return addNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.ADD, uiConstraint.getServicePropertyName(),
318 new ConstraintConvertor().convert(uiConstraint), true, componentTypeEnum, nodeFilterConstraintType,
319 StringUtils.isEmpty(uiConstraint.getCapabilityName()) ? "" : uiConstraint.getCapabilityName());