aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be
diff options
context:
space:
mode:
authoraribeiro <anderson.ribeiro@est.tech>2020-05-25 11:33:22 +0100
committerOfir Sonsino <ofir.sonsino@intl.att.com>2020-06-21 07:12:09 +0000
commit50c930a4095964a77611900401eff85f001c4aed (patch)
tree63a13eef3f80eb1c6dd6e00d103c9e90cdce14ab /catalog-be
parent5dd7bf3451168c1701b6c35b29d0db70c218595a (diff)
Add Support for node_filters
Allows for node_filter to be specified for a node template to provide processing instructions to the orchestrator Issue-ID: SDC-3095 Change-Id: I4e496e300552049d9bfd00df878b86d9fb97312b Signed-off-by: aribeiro <anderson.ribeiro@est.tech>
Diffstat (limited to 'catalog-be')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java10
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java256
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java417
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java350
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java64
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java66
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java88
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java299
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java306
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java23
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java18
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java30
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java43
13 files changed, 1036 insertions, 934 deletions
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 a7c926e0f7..544f030d91 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
@@ -240,16 +240,6 @@ public abstract class BaseBusinessLogic {
}
}
- protected ActionStatus lockComponentAndReturnStatus(final String componentId,
- final Component component,
- final String ecompErrorContext) {
- final ActionStatus lock = lockElement(componentId, component, ecompErrorContext);
- if (lock!= ActionStatus.OK) {
- logAndThrowComponentException(lock, component.getUniqueId(), component.getName());
- }
- return ActionStatus.OK;
- }
-
protected void lockComponent(String componentId, Component component, boolean needLock, String ecompErrorContext) {
if (needLock) {
lockComponent(componentId, component, ecompErrorContext);
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 486a6b2a35..30cfac225b 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
@@ -44,6 +44,7 @@ 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.impl.exceptions.BusinessLogicException;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
@@ -73,6 +74,7 @@ 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.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.impl.ForwardingPathUtils;
import org.openecomp.sdc.be.impl.ServiceFilterUtils;
import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
@@ -116,6 +118,7 @@ import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
+import org.openecomp.sdc.be.user.Role;
import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
import org.openecomp.sdc.common.api.ArtifactTypeEnum;
import org.openecomp.sdc.common.api.Constants;
@@ -150,7 +153,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
private ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
private ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
private ForwardingPathOperation forwardingPathOperation;
- private NodeFilterOperation serviceFilterOperation;
+ private NodeFilterOperation nodeFilterOperation;
@Autowired
public ComponentInstanceBusinessLogic(IElementOperation elementDao,
@@ -162,7 +165,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
ComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL,
ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator,
- ForwardingPathOperation forwardingPathOperation, NodeFilterOperation serviceFilterOperation,
+ ForwardingPathOperation forwardingPathOperation, NodeFilterOperation nodeFilterOperation,
ArtifactsOperations artifactToscaOperation) {
super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
@@ -171,7 +174,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
this.compInstMergeDataBL = compInstMergeDataBL;
this.onChangeInstanceOperationOrchestrator = onChangeInstanceOperationOrchestrator;
this.forwardingPathOperation = forwardingPathOperation;
- this.serviceFilterOperation = serviceFilterOperation;
+ this.nodeFilterOperation = nodeFilterOperation;
}
@Autowired
@@ -786,14 +789,20 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, false, true);
}
- public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance componentInstance, boolean inTransaction,
- boolean needLock) {
+ public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(
+ final String containerComponentParam,
+ final String containerComponentId,
+ final String componentInstanceId,
+ final String userId,
+ ComponentInstance componentInstance,
+ final boolean inTransaction,
+ boolean needLock) {
validateUserExists(userId);
final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
- org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+ final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
validateCanWorkOnComponent(containerComponent, userId);
ComponentTypeEnum instanceType = getComponentType(containerComponentType);
@@ -1010,7 +1019,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
oldInstanceName, newInstanceName);
for( Entry<String, CINodeFilterDataDefinition> entry : renamedNodesFilter.entrySet()){
Either<CINodeFilterDataDefinition, StorageOperationStatus>
- renameEither = serviceFilterOperation.updateNodeFilter(
+ renameEither = nodeFilterOperation.updateNodeFilter(
containerComponent.getUniqueId(),entry.getKey(),entry.getValue());
if (renameEither.isRight()){
return Either.right(componentsUtils.getResponseFormatForResourceInstance(
@@ -1051,86 +1060,99 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return oldComponentInstance;
}
- public ComponentInstance deleteComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
+ public ComponentInstance deleteComponentInstance(final String containerComponentParam,
+ final String containerComponentId,
+ final String componentInstanceId, String userId)
+ throws BusinessLogicException {
validateUserExists(userId);
-
final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
- org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+ final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
validateCanWorkOnComponent(containerComponent, userId);
boolean failed = false;
- ComponentInstance deletedRelatedInst;
+ final Optional<ComponentInstance> componentInstanceOptional = containerComponent.getComponentInstanceById(componentInstanceId);
+ if (!componentInstanceOptional.isPresent()) {
+ throw new BusinessLogicException(componentsUtils
+ .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND));
+ }
+ ComponentInstance componentInstance = componentInstanceOptional.get();
+
try {
- if (containerComponent instanceof Service) {
- ComponentInstance componentInstance = containerComponent.getComponentInstanceById(componentInstanceId).get();
- Either<String, StorageOperationStatus> deleteServiceFilterEither =
- serviceFilterOperation.deleteNodeFilter((Service) containerComponent, componentInstanceId);
+ if (containerComponent instanceof Service || containerComponent instanceof Resource &&
+ isVFC(componentInstance.getOriginType())) {
+
+ final Either<String, StorageOperationStatus> deleteServiceFilterEither =
+ nodeFilterOperation.deleteNodeFilter(containerComponent, componentInstanceId);
if (deleteServiceFilterEither.isRight()) {
- ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
+ final ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
containerComponentType);
janusGraphDao.rollback();
throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(status, componentInstanceId));
}
- Either<ComponentInstance, ResponseFormat> resultOp = deleteServiceFiltersRelatedTobeDeletedComponentInstance((Service) containerComponent,
- componentInstance, ComponentTypeEnum.SERVICE, userId);
+ final Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance(
+ containerComponent, componentInstance, containerComponentType, userId);
if (resultOp.isRight()) {
janusGraphDao.rollback();
throw new ByResponseFormatComponentException(resultOp.right().value());
}
}
lockComponent(containerComponent, "deleteComponentInstance");
- ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
+ final ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
- deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
+ componentInstance = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
containerComponentType, deletedCompInstance);
- ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
+ final ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
if (ActionStatus.OK != onDeleteOperationsStatus) {
throw new ByActionStatusComponentException(onDeleteOperationsStatus);
}
- } catch (ComponentException e) {
+ } catch (final ComponentException e) {
failed = true;
throw e;
}
finally {
unlockComponent(failed, containerComponent);
}
- return deletedRelatedInst;
- }
-
- public Either<ComponentInstance, ResponseFormat> deleteServiceFiltersRelatedTobeDeletedComponentInstance(
- Service service, ComponentInstance componentInstance, ComponentTypeEnum containerComponentType, String userId) {
- if (containerComponentType.equals(ComponentTypeEnum.SERVICE)) {
- Set<String> serviceFiltersIDsToBeDeleted =
- getServiceFiltersRelatedToComponentInstance(service.getUniqueId(), componentInstance);
- if (!serviceFiltersIDsToBeDeleted.isEmpty()) {
- Set<String> ids = service.getComponentInstances().stream()
- .filter(ci -> serviceFiltersIDsToBeDeleted
- .contains(ci.getName()))
- .map(ComponentInstance::getUniqueId)
- .collect(Collectors.toSet());
- Either<Set<String>, StorageOperationStatus> deleteServiceFiltersEither =
- serviceFilterOperation.deleteNodeFilters(service, ids);
- if (deleteServiceFiltersEither.isRight()) {
- ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFiltersEither.right().value(),
- containerComponentType);
- return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
+ return componentInstance;
+ }
+
+ public Either<ComponentInstance, ResponseFormat> deleteNodeFiltersFromComponentInstance(
+ final Component component,
+ final ComponentInstance componentInstance,
+ final ComponentTypeEnum containerComponentType,
+ final String userId) {
+
+ final Set<String> componentFiltersIDsToBeDeleted =
+ getComponentFiltersRelatedToComponentInstance(component.getUniqueId(), componentInstance);
+ if (!componentFiltersIDsToBeDeleted.isEmpty()) {
+ final Set<String> ids = component.getComponentInstances().stream()
+ .filter(ci -> componentFiltersIDsToBeDeleted.contains(ci.getName()))
+ .map(ComponentInstance::getUniqueId).collect(Collectors.toSet());
+ final Either<Set<String>, StorageOperationStatus> deleteComponentNodeFiltersEither =
+ nodeFilterOperation.deleteNodeFilters(component, ids);
+ if (deleteComponentNodeFiltersEither.isRight()) {
+ final ActionStatus status = componentsUtils
+ .convertFromStorageResponse(deleteComponentNodeFiltersEither.right().value(),
+ containerComponentType);
+ return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
+ }
+ for (final String id : ids) {
+ final Optional<ComponentInstance> componentInstanceById = component.getComponentInstanceById(id);
+ if (!componentInstanceById.isPresent()) {
+ return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
}
- for (String id : ids) {
- final Optional<ComponentInstance> componentInstanceById = service.getComponentInstanceById(id);
- if (!componentInstanceById.isPresent()){
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- }
- ComponentInstance ci = componentInstanceById.get();
- ci.setDirectives(Collections.emptyList());
-
- final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
- updateComponentInstanceMetadata(ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUniqueId(),
- ci.getUniqueId(), userId, ci, true, false);
- if (componentInstanceResponseFormatEither.isRight()) {
- return componentInstanceResponseFormatEither;
- }
+ final ComponentInstance componentInstanceToBeUpdated = componentInstanceById.get();
+ final List<String> directives = componentInstanceToBeUpdated.getDirectives();
+ if (CollectionUtils.isNotEmpty(directives)) {
+ directives.removeAll(directives);
+ componentInstanceToBeUpdated.setDirectives(Collections.emptyList());
+ }
+ final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
+ updateComponentInstanceMetadata(containerComponentType.getValue(), component.getUniqueId(),
+ componentInstanceToBeUpdated.getUniqueId(), userId, componentInstanceToBeUpdated, true, false);
+ if (componentInstanceResponseFormatEither.isRight()) {
+ return componentInstanceResponseFormatEither;
}
}
}
@@ -1139,14 +1161,14 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
- private Set<String> getServiceFiltersRelatedToComponentInstance(String containerComponentId,
- ComponentInstance componentInstance) {
+ private Set<String> getComponentFiltersRelatedToComponentInstance(String containerComponentId,
+ ComponentInstance componentInstance) {
ComponentParametersView filter = new ComponentParametersView(true);
filter.setIgnoreComponentInstances(false);
- Either<Service, StorageOperationStatus> serviceFilterOrigin =
+ Either<Component, StorageOperationStatus> componentFilterOrigin =
toscaOperationFacade.getToscaElement(containerComponentId, filter);
- final Service service = serviceFilterOrigin.left().value();
- final Set<String> nodesFiltersToBeDeleted = ServiceFilterUtils.getNodesFiltersToBeDeleted(service,
+ final Component component = componentFilterOrigin.left().value();
+ final Set<String> nodesFiltersToBeDeleted = ComponentsUtils.getNodesFiltersToBeDeleted(component,
componentInstance);
return nodesFiltersToBeDeleted;
}
@@ -1163,10 +1185,6 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
return componentInstance;
}
-
-
-
-
private void deleteForwardingPaths(String serviceId, List<String> pathIdsToDelete){
Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
@@ -2624,107 +2642,6 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
}
}
- /*private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property, String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
- String capabilityType, String capabilityName, String ownerId) {
- String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
- 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) && c.getOwnerId().equals(ownerId)).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()) {
- String capKey = ModelConverter.buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName, componentInstanceUniqueId, cap.get());
- 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, String ownerId,
- List<ComponentInstanceProperty> properties, String userId) {
- Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
-
- validateUserExists(userId);
-
- 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>, JanusGraphOperationStatus> allDataTypes = dataTypeCache.getAll();
- if (allDataTypes.isRight()) {
- JanusGraphOperationStatus 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.convertJanusGraphStatusToStorageStatus(status))));
- }
-
- try {
- for (ComponentInstanceProperty property : properties) {
- Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, false);
- newPropertyValueEither.bimap(updatedValue ->
- updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName, ownerId),
- Either::right);
- }
- 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()) {
- janusGraphDao.rollback();
- } else {
- janusGraphDao.commit();
- }
- // unlock resource
- graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
- }
- }*/
-
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;
@@ -3227,8 +3144,15 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
log.error("Failed to deleteComponentInstance with instanceId[{}]", componentInstanceId);
return Either.right(new ResponseFormat());
}
+ }
+ public boolean isVFC(final OriginTypeEnum originTypeEnum) {
+ return OriginTypeEnum.VFC.equals(originTypeEnum);
+ }
+ public void validateUser(final String userId) {
+ final User user = userValidations.validateUserExists(userId);
+ userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
}
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java
new file mode 100644
index 0000000000..0356b63793
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java
@@ -0,0 +1,417 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import static org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR;
+
+import fj.data.Either;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
+import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
+import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
+import org.openecomp.sdc.be.model.operations.api.IElementOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
+import org.openecomp.sdc.be.user.Role;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@org.springframework.stereotype.Component("componentNodeFilterBusinessLogic")
+public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
+
+ private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
+
+ private final NodeFilterOperation nodeFilterOperation;
+ private final NodeFilterValidator nodeFilterValidator;
+
+ @Autowired
+ public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao,
+ final IGroupOperation groupOperation,
+ final IGroupInstanceOperation groupInstanceOperation,
+ final IGroupTypeOperation groupTypeOperation,
+ final InterfaceOperation interfaceOperation,
+ final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+ final ArtifactsOperations artifactToscaOperation,
+ final NodeFilterOperation nodeFilterOperation,
+ final NodeFilterValidator nodeFilterValidator) {
+ super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation,
+ interfaceLifecycleTypeOperation, artifactToscaOperation);
+ this.nodeFilterOperation = nodeFilterOperation;
+ this.nodeFilterValidator = nodeFilterValidator;
+ }
+
+ public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId,
+ final String componentInstanceId,
+ final boolean shouldLock,
+ final ComponentTypeEnum componentTypeEnum)
+ throws BusinessLogicException {
+
+ final Component component = getComponent(componentId);
+ final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
+ Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
+ if (filterDataDefinition.isPresent()) {
+ return filterDataDefinition;
+ }
+ final Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
+ boolean wasLocked = false;
+ try {
+ if (shouldLock) {
+ lockComponent(component.getUniqueId(), component,"Create Node Filter on component");
+ wasLocked = true;
+ }
+ result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
+ if (result.isRight()) {
+ janusGraphDao.rollback();
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Failed to Create Node filter on component with id {}", componentId);
+ throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+ .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+ } else {
+ filterDataDefinition = Optional.ofNullable(result.left().value());
+ }
+ janusGraphDao.commit();
+ LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
+
+ } catch (final Exception e) {
+ janusGraphDao.rollback();
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ } finally {
+ if (wasLocked) {
+ unlockComponent(component.getUniqueId(), componentTypeEnum);
+ }
+ }
+ return filterDataDefinition;
+ }
+
+ public Optional<String> deleteNodeFilterIfExists(final String componentId,
+ final String componentInstanceId,
+ final boolean shouldLock,
+ final ComponentTypeEnum componentTypeEnum)
+ throws BusinessLogicException {
+
+ final Component component = getComponent(componentId);
+ final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
+ getCiNodeFilterDataDefinition(componentInstanceId, component);
+ if (!nodeFilterDataDefinition.isPresent()) {
+ return Optional.ofNullable(componentInstanceId);
+ }
+
+ final Either<String, StorageOperationStatus> result;
+ boolean wasLocked = false;
+ try {
+ if (shouldLock) {
+ lockComponent(component.getUniqueId(), component,"Delete Node Filter from component");
+ wasLocked = true;
+ }
+ result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
+ if (result.isRight()) {
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
+ result.right().value());
+ janusGraphDao.rollback();
+ throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+ .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+ }
+ janusGraphDao.commit();
+ LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
+
+ } catch (final Exception e) {
+ LOGGER.error(BUSINESS_PROCESS_ERROR,"Exception occurred during delete deleting node filter: {}",
+ e.getMessage(), e);
+ janusGraphDao.rollback();
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+ } finally {
+ if (wasLocked) {
+ unlockComponent(component.getUniqueId(), componentTypeEnum);
+ }
+ }
+ return Optional.ofNullable(result.left().value());
+ }
+
+
+
+ public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId,
+ final String componentInstanceId,
+ final NodeFilterConstraintAction action,
+ final String propertyName,
+ final String constraint,
+ final boolean shouldLock,
+ final ComponentTypeEnum componentTypeEnum)
+ throws BusinessLogicException {
+
+ final Component component = getComponent(componentId);
+ CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId,
+ action, constraint, component);
+ boolean wasLocked = false;
+ try {
+ if (shouldLock) {
+ lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+ wasLocked = true;
+ }
+ final RequirementNodeFilterPropertyDataDefinition newProperty =
+ new RequirementNodeFilterPropertyDataDefinition();
+ newProperty.setName(propertyName);
+ newProperty.setConstraints(Collections.singletonList(constraint));
+ final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+ .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, newProperty);
+
+ if (result.isRight()) {
+ janusGraphDao.rollback();
+ throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+ .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+ } else {
+ nodeFilterDataDefinition = result.left().value();
+ }
+ janusGraphDao.commit();
+ LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
+
+ } catch (final Exception e) {
+ janusGraphDao.rollback();
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ } finally {
+ if (wasLocked) {
+ unlockComponent(component.getUniqueId(), componentTypeEnum);
+ }
+ }
+ return Optional.ofNullable(nodeFilterDataDefinition);
+ }
+
+ public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId,
+ final String componentInstanceId,
+ final NodeFilterConstraintAction action,
+ final String constraint,
+ final int position,
+ final boolean shouldLock,
+ final ComponentTypeEnum componentTypeEnum)
+ throws BusinessLogicException {
+
+ final Component component = getComponent(componentId);
+ CINodeFilterDataDefinition nodeFilterDataDefinition =
+ validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint, component);
+ boolean wasLocked = false;
+ try {
+ if (shouldLock) {
+ lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+ wasLocked = true;
+ }
+ final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+ .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position);
+ if (result.isRight()) {
+ janusGraphDao.rollback();
+ throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+ .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+ } else {
+ nodeFilterDataDefinition = result.left().value();
+ }
+ janusGraphDao.commit();
+ LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
+
+ } catch (final Exception e) {
+ janusGraphDao.rollback();
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ } finally {
+ if (wasLocked) {
+ unlockComponent(component.getUniqueId(), componentTypeEnum);
+ }
+ }
+ return Optional.ofNullable(nodeFilterDataDefinition);
+ }
+
+ public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId,
+ final String componentInstanceId,
+ final List<String> constraints,
+ final boolean shouldLock,
+ final ComponentTypeEnum componentTypeEnum)
+ throws BusinessLogicException {
+
+ final Component component = getComponent(componentId);
+
+ final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+ .validateNodeFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE);
+ if (response.isRight()) {
+ throw new BusinessLogicException(componentsUtils
+ .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+ }
+ boolean wasLocked = false;
+ if (shouldLock) {
+ lockComponent(component.getUniqueId(), component,"Update Node Filter on Component");
+ wasLocked = true;
+ }
+ final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId,
+ component);
+ if (!componentInstance.isPresent()) {
+ throw new BusinessLogicException(ResponseFormatManager.getInstance()
+ .getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+ CINodeFilterDataDefinition nodeFilterDataDefinition = componentInstance.get().getNodeFilter();
+ if (nodeFilterDataDefinition == null) {
+ throw new BusinessLogicException(componentsUtils
+ .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+ }
+ try {
+ final List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream()
+ .map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
+ final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+ .updateProperties(componentId, componentInstanceId, nodeFilterDataDefinition, properties);
+
+ if (result.isRight()) {
+ janusGraphDao.rollback();
+ throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+ .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+ } else {
+ nodeFilterDataDefinition = result.left().value();
+ }
+ janusGraphDao.commit();
+ LOGGER.debug("Node filter successfully updated in component {} . ", component.getSystemName());
+
+ } catch (final Exception e) {
+ janusGraphDao.rollback();
+ LOGGER.error(BUSINESS_PROCESS_ERROR,
+ "Exception occurred during update component node filter property values: {}",
+ e.getMessage(), e);
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ } finally {
+ if (wasLocked) {
+ unlockComponent(component.getUniqueId(), componentTypeEnum);
+ }
+ }
+ return Optional.ofNullable(nodeFilterDataDefinition);
+ }
+
+ private void unlockComponent(final String componentUniqueId,
+ final ComponentTypeEnum componentType) {
+ graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
+ }
+
+ public User validateUser(final String userId) {
+ final User user = userValidations.validateUserExists(userId);
+ userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
+ return user;
+ }
+
+ private Component getComponent(final String componentId) throws BusinessLogicException {
+
+ final Either<Component, StorageOperationStatus> result =
+ toscaOperationFacade.getToscaElement(componentId);
+
+ if (result.isRight()) {
+ final StorageOperationStatus errorStatus = result.right().value();
+ LOGGER.error(BUSINESS_PROCESS_ERROR, this.getClass().getName(),
+ "Failed to fetch component information by component id, error {}", errorStatus);
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(
+ componentsUtils.convertFromStorageResponse(errorStatus)));
+ }
+ return result.left().value();
+ }
+
+ private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId,
+ final Component component) {
+ return component.getComponentInstanceById(componentInstanceId);
+ }
+
+ private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(
+ final Optional<ComponentInstance> componentInstance) {
+
+ if (componentInstance.isPresent()) {
+ return Optional.ofNullable(componentInstance.get().getNodeFilter());
+ }
+ return Optional.empty();
+ }
+
+ private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId,
+ final Component component)
+ throws BusinessLogicException {
+
+ final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+ .validateComponentInstanceExist(component, componentInstanceId);
+ if (response.isRight()) {
+ throw new BusinessLogicException(componentsUtils
+ .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+ }
+ final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
+ if (componentInstance.isPresent()) {
+ return Optional.ofNullable(componentInstance.get().getNodeFilter());
+ }
+ return Optional.empty();
+ }
+
+ private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
+ final String constraint) {
+
+ final RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
+ pdd.setConstraints(Arrays.asList(constraint));
+ return pdd;
+ }
+
+ private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
+ final NodeFilterConstraintAction action,
+ final String constraint,
+ final Component component)
+ throws BusinessLogicException {
+
+ validateNodeFilter(component, componentInstanceId, action, constraint);
+ final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(
+ componentInstanceId, component);
+ if (!cINodeFilterDataDefinition.isPresent()) {
+ throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
+ }
+ return cINodeFilterDataDefinition.get();
+ }
+
+ private void validateNodeFilter(final Component component,
+ final String componentInstanceId,
+ final NodeFilterConstraintAction action,
+ final String constraint) throws BusinessLogicException {
+ final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+ .validateNodeFilter(component, componentInstanceId, Collections.singletonList(constraint), action);
+ if (response.isRight()) {
+ throw new BusinessLogicException(componentsUtils
+ .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+ }
+ }
+} \ No newline at end of file
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 bdcc67c744..f4ccb868d9 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
@@ -22,12 +22,38 @@
package org.openecomp.sdc.be.components.impl;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.handleConsumptionInputMappedToCapabilityProperty;
+import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.isAssignedValueFromValidType;
+import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.getOperationOutputName;
+import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.isOperationInputMappedToOtherOperationOutput;
+import static org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum.UPDATE_SERVICE_METADATA;
+import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
+import static org.openecomp.sdc.be.types.ServiceConsumptionSource.SERVICE_INPUT;
+import static org.openecomp.sdc.be.types.ServiceConsumptionSource.STATIC;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import fj.data.Either;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.ListUtils;
@@ -41,12 +67,10 @@ import org.openecomp.sdc.be.components.health.HealthCheckBusinessLogic;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
-import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
import org.openecomp.sdc.be.components.utils.InterfaceOperationUtils;
import org.openecomp.sdc.be.components.utils.PropertiesUtils;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator;
@@ -69,13 +93,11 @@ import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
import org.openecomp.sdc.be.datamodel.ServiceRelations;
import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition;
-import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentFieldsEnum;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
@@ -107,7 +129,6 @@ import org.openecomp.sdc.be.model.category.CategoryDefinition;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
import org.openecomp.sdc.be.model.operations.api.IElementOperation;
import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
@@ -117,7 +138,6 @@ import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
import org.openecomp.sdc.be.plugins.ServiceCreationPlugin;
-import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
import org.openecomp.sdc.be.resources.data.ComponentMetadataData;
import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
@@ -136,43 +156,16 @@ import org.openecomp.sdc.common.api.ArtifactTypeEnum;
import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.common.datastructure.Wrapper;
import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
-import org.openecomp.sdc.common.log.elements.LoggerSupportability;
import org.openecomp.sdc.common.log.wrappers.Logger;
import org.openecomp.sdc.common.util.GeneralUtility;
import org.openecomp.sdc.common.util.ThreadLocalsHolder;
import org.openecomp.sdc.common.util.ValidationUtils;
import org.openecomp.sdc.exception.ResponseFormat;
+import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.context.WebApplicationContext;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
-import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.handleConsumptionInputMappedToCapabilityProperty;
-import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.isAssignedValueFromValidType;
-import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.getOperationOutputName;
-import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.isOperationInputMappedToOtherOperationOutput;
-import static org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum.UPDATE_SERVICE_METADATA;
-import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
-import static org.openecomp.sdc.be.types.ServiceConsumptionSource.SERVICE_INPUT;
-import static org.openecomp.sdc.be.types.ServiceConsumptionSource.STATIC;
-
@org.springframework.stereotype.Component("serviceBusinessLogic")
public class ServiceBusinessLogic extends ComponentBusinessLogic {
@@ -185,7 +178,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
private static final String INITIAL_VERSION = "0.1";
private static final String STATUS_SUCCESS_200 = "200";
private static final String STATUS_DEPLOYED = "DEPLOYED";
- private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(ServiceBusinessLogic.class.getName());
static final String IS_VALID = "isValid";
private ForwardingPathOperation forwardingPathOperation;
@@ -196,8 +188,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
private final ServiceDistributionValidation serviceDistributionValidation;
private final ForwardingPathValidator forwardingPathValidator;
private final UiComponentDataConverter uiComponentDataConverter;
- private final NodeFilterOperation serviceFilterOperation;
- private final NodeFilterValidator serviceFilterValidator;
private ServiceTypeValidator serviceTypeValidator;
private List<ServiceCreationPlugin> serviceCreationPluginList;
@@ -230,24 +220,24 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
@Autowired
public ServiceBusinessLogic(IElementOperation elementDao,
- IGroupOperation groupOperation,
- IGroupInstanceOperation groupInstanceOperation,
- IGroupTypeOperation groupTypeOperation,
- GroupBusinessLogic groupBusinessLogic,
- InterfaceOperation interfaceOperation,
- InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
- ArtifactsBusinessLogic artifactsBusinessLogic,
- IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
- ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
- UiComponentDataConverter uiComponentDataConverter, NodeFilterOperation serviceFilterOperation,
- NodeFilterValidator serviceFilterValidator, ArtifactsOperations artifactToscaOperation,
- ComponentContactIdValidator componentContactIdValidator,
- ComponentNameValidator componentNameValidator,
- ComponentTagsValidator componentTagsValidator,
- ComponentValidator componentValidator,
- ComponentIconValidator componentIconValidator,
- ComponentProjectCodeValidator componentProjectCodeValidator,
- ComponentDescriptionValidator componentDescriptionValidator) {
+ IGroupOperation groupOperation,
+ IGroupInstanceOperation groupInstanceOperation,
+ IGroupTypeOperation groupTypeOperation,
+ GroupBusinessLogic groupBusinessLogic,
+ InterfaceOperation interfaceOperation,
+ InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+ ArtifactsBusinessLogic artifactsBusinessLogic,
+ IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+ ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
+ UiComponentDataConverter uiComponentDataConverter,
+ ArtifactsOperations artifactToscaOperation,
+ ComponentContactIdValidator componentContactIdValidator,
+ ComponentNameValidator componentNameValidator,
+ ComponentTagsValidator componentTagsValidator,
+ ComponentValidator componentValidator,
+ ComponentIconValidator componentIconValidator,
+ ComponentProjectCodeValidator componentProjectCodeValidator,
+ ComponentDescriptionValidator componentDescriptionValidator) {
super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic,
interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator,
componentNameValidator, componentTagsValidator, componentValidator,
@@ -257,9 +247,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
this.serviceDistributionValidation = serviceDistributionValidation;
this.forwardingPathValidator = forwardingPathValidator;
this.uiComponentDataConverter = uiComponentDataConverter;
- this.serviceFilterOperation = serviceFilterOperation;
- this.serviceFilterValidator = serviceFilterValidator;
-
}
@@ -1239,7 +1226,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
private void validateUserAndRole(Service serviceUpdate, User user, String errorContext) {
user = validateUser(user, errorContext, serviceUpdate, null, false);
validateUserRole(user, serviceUpdate, new ArrayList<>(), null, null);
-
}
@VisibleForTesting
@@ -2509,252 +2495,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
return Either.left(dataTransfer);
}
- public Either<String, ResponseFormat> deleteIfNotAlreadyDeletedServiceFilter(String serviceId, String resourceId, String userId, boolean lock) {
- validateUserExists(userId);
-
- Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
- if (storageStatus.isRight()) {
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""));
- }
- Service service = storageStatus.left().value();
-
- Either<Boolean, ResponseFormat> response = serviceFilterValidator.validateComponentInstanceExist(service, resourceId);
- if (storageStatus.isRight()) {
- return Either.right(response.right().value());
- }
- final Optional<ComponentInstance> optionalComponentInstance = service.getComponentInstanceById(resourceId);
- if (!optionalComponentInstance.isPresent() ){
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- }
- CINodeFilterDataDefinition nodeFilter = optionalComponentInstance.get().getNodeFilter();
- if (nodeFilter == null){
- return Either.left(resourceId);
- }
-
- Either<String, StorageOperationStatus> result;
- try{
- if (lock) {
- lockComponent(service.getUniqueId(), service, "Delete Service Filter from service");
- }
- result = serviceFilterOperation.deleteNodeFilter(service , resourceId);
- if (result.isRight()) {
- log.debug("Failed to delete node filter in service {}. Response is {}. ", service.getName(), result.right().value());
- janusGraphDao.rollback();
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE)));
- }
- janusGraphDao.commit();
- log.debug("Node filter successfully changed in service {} . ", service.getSystemName());
-
- } catch (Exception e){
- log.error("Exception occurred during delete forwarding path : {}", e.getMessage(), e);
- janusGraphDao.rollback();
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- } finally {
- graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
- }
- return Either.left(result.left().value());
- }
-
-
- public Either<CINodeFilterDataDefinition, ResponseFormat> createIfNotAlreadyExistServiceFilter(String serviceId, String componentInstanceId, String userId, boolean lock) {
- String errorContext = "createIfNotAlreadyExistServiceFilter";
- User user = validateUserExists(userId);
-
- Either<Service, StorageOperationStatus> serviceEither = toscaOperationFacade.getToscaElement(serviceId);
- if (serviceEither.isRight()) {
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceEither.right().value(), ComponentTypeEnum.SERVICE), ""));
- }
- final Service service = serviceEither.left().value();
- validateUserAndRole(service, user, errorContext);
-
- Optional<ComponentInstance> optionalComponentInstance = service.getComponentInstanceById(componentInstanceId);
- if (!optionalComponentInstance.isPresent()){
- return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
- }
- ComponentInstance componentInstance = optionalComponentInstance.get();
- CINodeFilterDataDefinition serviceFilter = componentInstance.getNodeFilter();
- if (serviceFilter != null){
- return Either.left(serviceFilter);
- }
- if (lock) {
- lockComponent(service.getUniqueId(), service, "Create Service Filter");
- }
- Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
-
- CINodeFilterDataDefinition serviceFilterResult;
- try {
- result = serviceFilterOperation.createNodeFilter(serviceId, componentInstanceId);
- if (result.isRight()) {
- janusGraphDao.rollback();
- return Either.right(componentsUtils.getResponseFormat(
- componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
- ""));
- } else {
- serviceFilterResult = result.left().value();
- }
- janusGraphDao.commit();
-
- } catch (Exception e) {
- janusGraphDao.rollback();
- log.error("Exception occurred during add or update service filter property values: {}", e.getMessage(),
- e);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
- } finally {
- graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
- }
- return Either.left(serviceFilterResult);
- }
-
-
- public Either<CINodeFilterDataDefinition, ResponseFormat> updateServiceFilter(String serviceId, String componentInstanceId,
- List<String> constraints, User inUser, boolean lock) {
- User user = validateUserExists(inUser.getUserId());
- validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
- Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId);
-
- if(serviceStorageOperationStatusEither.isRight()){
- StorageOperationStatus errorStatus = serviceStorageOperationStatusEither.right().value();
- log.debug("Failed to fetch service information by service id, error {}", errorStatus);
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(errorStatus)));
- }
- Service storedService = serviceStorageOperationStatusEither.left().value();
-
- Either<Boolean, ResponseFormat> booleanResponseFormatEither =
- serviceFilterValidator.validateNodeFilter(storedService, componentInstanceId, constraints,
- NodeFilterConstraintAction.UPDATE);
- if(booleanResponseFormatEither.isRight()){
- return Either.right(booleanResponseFormatEither.right().value());
- }
-
-
- Either<Boolean, ResponseFormat> lockResult = null;
- if (lock) {
- lockComponent(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service");
- }
- Optional<ComponentInstance> componentInstanceOptional = storedService.getComponentInstanceById(componentInstanceId);
- if (!componentInstanceOptional.isPresent()){
- return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
- }
- CINodeFilterDataDefinition serviceFilter = componentInstanceOptional.get().getNodeFilter();
- if(serviceFilter == null){
- return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
- }
- CINodeFilterDataDefinition serviceFilterResult;
- try {
- List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream().map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
- Either<CINodeFilterDataDefinition, StorageOperationStatus> result = serviceFilterOperation.updateProperties(serviceId, componentInstanceId, serviceFilter ,properties);
-
- if (result.isRight()) {
- janusGraphDao.rollback();
- return Either.right(componentsUtils.getResponseFormat(
- componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
- ""));
- } else {
- serviceFilterResult = result.left().value();
- }
- janusGraphDao.commit();
-
- } catch (Exception e) {
- janusGraphDao.rollback();
- log.error("Exception occurred during add or update service filter property values: {}", e.getMessage(),
- e);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
- } finally {
- if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) {
- graphLockOperation.unlockComponent(storedService.getUniqueId(), NodeTypeEnum.Service);
- }
- }
- return Either.left(serviceFilterResult);
- }
-
- private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(String constraint){
- RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
- pdd.setConstraints(Arrays.asList(constraint));
- return pdd;
- }
-
- public Either<CINodeFilterDataDefinition, ResponseFormat> addOrDeleteServiceFilter(String serviceId, String componentInstanceId,
- NodeFilterConstraintAction action, String propertyName, String constraint, int position, User inUser, boolean lock) {
- User user = validateUserExists(inUser.getUserId());
- validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
-
- Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId);
-
- if(serviceStorageOperationStatusEither.isRight()){
- StorageOperationStatus errorStatus = serviceStorageOperationStatusEither.right().value();
- log.debug("Failed to fetch service information by service id, error {}", errorStatus);
- return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(errorStatus)));
- }
- Service storedService = serviceStorageOperationStatusEither.left().value();
-
- Either<Boolean, ResponseFormat> booleanResponseFormatEither =
- serviceFilterValidator.validateNodeFilter(storedService, componentInstanceId,
- Collections.singletonList(constraint), action);
- if(booleanResponseFormatEither.isRight()){
- return Either.right(booleanResponseFormatEither.right().value());
- }
-
- Either<CINodeFilterDataDefinition, StorageOperationStatus> result = null;
-
- CINodeFilterDataDefinition serviceFilterResult = null;
- ActionStatus lockStatus = null;
- try {
- if (lock) {
- lockStatus = lockComponentAndReturnStatus(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service");
- }
-
- Optional<ComponentInstance> componentInstanceOptional = storedService.getComponentInstanceById(componentInstanceId);
- if (!componentInstanceOptional.isPresent()) {
- return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
- }
- CINodeFilterDataDefinition serviceFilter = componentInstanceOptional.get().getNodeFilter();
- if (serviceFilter == null) {
- return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
- }
-
-
- switch (action) {
- case ADD:
- RequirementNodeFilterPropertyDataDefinition newProperty = new RequirementNodeFilterPropertyDataDefinition();
- newProperty.setName(propertyName);
- newProperty.setConstraints(Collections.singletonList(constraint));
- result = serviceFilterOperation.addNewProperty(serviceId, componentInstanceId, serviceFilter, newProperty);
- break;
- case DELETE:
- result = serviceFilterOperation.deleteConstraint(serviceId, componentInstanceId, serviceFilter, position);
- break;
- default:
- log.error("Unsupported operation " + action);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
- }
-
- if (result != null && result.isRight()) {
- janusGraphDao.rollback();
- return Either.right(componentsUtils.getResponseFormat(
- componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
- ""));
- } else {
- serviceFilterResult = result.left().value();
- }
- janusGraphDao.commit();
-
- } catch (Exception e) {
- janusGraphDao.rollback();
- log.error("Exception occurred during add or update node filter property values: {}", e.getMessage(),
- e);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
- } finally {
- if (ActionStatus.OK == lockStatus) {
- graphLockOperation.unlockComponent(storedService.getUniqueId(), NodeTypeEnum.Service);
- }
- }
- return Either.left(serviceFilterResult);
- }
-
@Autowired(required = false)
public void setServiceCreationPluginList(List<ServiceCreationPlugin> serviceCreationPluginList) {
this.serviceCreationPluginList = serviceCreationPluginList;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java
index 021e6b49e4..3c770d15aa 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java
@@ -22,18 +22,23 @@ package org.openecomp.sdc.be.components.validation;
import com.google.common.collect.ImmutableSet;
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.openecomp.sdc.be.components.impl.ResponseFormatManager;
import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.ComponentInstanceProperty;
import org.openecomp.sdc.be.model.PropertyDefinition;
-import org.openecomp.sdc.be.model.Service;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
import org.openecomp.sdc.be.ui.model.UIConstraint;
@@ -41,17 +46,9 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-@Component("NodeFilterValidator")
+@org.springframework.stereotype.Component("NodeFilterValidator")
public class NodeFilterValidator {
private static final String SOURCE = "Source";
@@ -70,18 +67,19 @@ public class NodeFilterValidator {
private static final Logger LOGGER = LoggerFactory.getLogger(NodeFilterValidator.class);
- public Either<Boolean, ResponseFormat> validateComponentInstanceExist(Service service, String componentInstanceId) {
- if (service == null || StringUtils.isEmpty(componentInstanceId)) {
+ public Either<Boolean, ResponseFormat> validateComponentInstanceExist(
+ final Component component,
+ final String componentInstanceId) {
+ if (component == null || StringUtils.isEmpty(componentInstanceId)) {
LOGGER.debug("Input data cannot be empty");
return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
}
- if (CollectionUtils.isEmpty(service.getComponentInstances())) {
+ if (CollectionUtils.isEmpty(component.getComponentInstances())) {
LOGGER.debug("Component Instance list is empty");
return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
}
- boolean found =
- service.getComponentInstances().stream().anyMatch(ci -> ci.getUniqueId().equals(componentInstanceId));
- if (!found) {
+ if (component.getComponentInstances().stream()
+ .noneMatch(ci -> ci.getUniqueId().equals(componentInstanceId))) {
LOGGER.debug("Component Instance list is empty");
return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
}
@@ -93,20 +91,16 @@ public class NodeFilterValidator {
return Either.right(errorResponse);
}
- public Either<Boolean, ResponseFormat> validateNodeFilter(CINodeFilterDataDefinition nodeFilter, String serviceId,
- String complonentInstanceId) {
- return Either.left(Boolean.TRUE);
- }
-
-
- public Either<Boolean, ResponseFormat> validateNodeFilter(Service parentComponent, String componentInstanceId,
- List<String> uiConstraints, NodeFilterConstraintAction action) {
+ public Either<Boolean, ResponseFormat> validateNodeFilter(final Component parentComponent,
+ final String componentInstanceId,
+ final List<String> uiConstraints,
+ final NodeFilterConstraintAction action) {
try {
- for (String uiConstraint : uiConstraints) {
+ for (final String uiConstraint : uiConstraints) {
if (NodeFilterConstraintAction.ADD != action && NodeFilterConstraintAction.UPDATE != action) {
break;
}
- UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint);
+ final UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint);
if (ConstraintConvertor.PROPERTY_CONSTRAINT.equals(constraint.getSourceType())) {
final Either<Boolean, ResponseFormat> booleanResponseFormatEither =
validatePropertyConstraint(parentComponent, componentInstanceId, constraint);
@@ -121,7 +115,7 @@ public class NodeFilterValidator {
}
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
LOGGER.debug("Provided constraint" + uiConstraints, e);
return Either.right(componentsUtils.getResponseFormat(ActionStatus.CONSTRAINT_FORMAT_INCORRECT));
}
@@ -129,10 +123,11 @@ public class NodeFilterValidator {
return Either.left(true);
}
- private Either<Boolean, ResponseFormat> validatePropertyConstraint(Service parentComponent,
- String componentInstanceId, UIConstraint uiConstraint) {
+ private Either<Boolean, ResponseFormat> validatePropertyConstraint(
+ final Component parentComponent,
+ final String componentInstanceId, final UIConstraint uiConstraint) {
String source = SOURCE;
- Optional<ComponentInstance> brotherComponentInstance;
+ final Optional<ComponentInstance> brotherComponentInstance;
List<? extends PropertyDefinition> sourcePropertyDefinition =
parentComponent.getName().equals(uiConstraint.getSourceName()) ? parentComponent.getProperties() :
@@ -213,12 +208,13 @@ public class NodeFilterValidator {
}
}
- private Either<Boolean, ResponseFormat> validateStaticValueAndOperator(Service parentComponent,
- String componentInstanceId, UIConstraint uiConstraint) {
+ private Either<Boolean, ResponseFormat> validateStaticValueAndOperator(
+ final Component parentComponent,
+ final String componentInstanceId, final UIConstraint uiConstraint) {
if (!(Objects.nonNull(uiConstraint) && uiConstraint.getValue() instanceof String)) {
return Either.left(false);
}
- Optional<ComponentInstanceProperty> componentInstanceProperty =
+ final Optional<ComponentInstanceProperty> componentInstanceProperty =
parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream()
.filter(property -> uiConstraint.getServicePropertyName().equals(property.getName()))
.findFirst();
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
index 62a30638e6..3479c5f700 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
@@ -30,7 +30,14 @@ import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import fj.F;
import fj.data.Either;
-import java.util.function.Function;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.onap.logging.ref.slf4j.ONAPLogConstants;
import org.openecomp.sdc.be.auditing.api.AuditEventFactory;
@@ -70,13 +77,16 @@ import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
import org.openecomp.sdc.be.dao.graph.datatype.AdditionalInformationEnum;
+import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
import org.openecomp.sdc.be.datatypes.elements.AdditionalInfoParameterInfo;
+import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.model.ArtifactDefinition;
import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.ConsumerDefinition;
import org.openecomp.sdc.be.model.DataTypeDefinition;
import org.openecomp.sdc.be.model.GroupTypeDefinition;
@@ -99,6 +109,7 @@ import org.openecomp.sdc.be.resources.data.auditing.model.OperationalEnvAuditDat
import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
import org.openecomp.sdc.be.tosca.ToscaError;
+import org.openecomp.sdc.be.ui.model.UIConstraint;
import org.openecomp.sdc.be.ui.model.UiLeftPaletteComponent;
import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.common.log.enums.LogLevel;
@@ -111,12 +122,6 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.MarkerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import javax.servlet.http.HttpServletRequest;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
@org.springframework.stereotype.Component("componentUtils")
public class ComponentsUtils {
@@ -1669,6 +1674,53 @@ public class ComponentsUtils {
return uiLeftPaletteComponents;
}
+ private static Set<String> getNodesFiltersToBeDeleted(final Component component,
+ final String componentInstanceName) {
+ return component.getComponentInstances().stream()
+ .filter(ci -> isNodeFilterUsingChangedCi(ci, componentInstanceName))
+ .map(ComponentInstance::getName).collect(Collectors.toSet());
+ }
+
+ public static Set<String> getNodesFiltersToBeDeleted(final Component component,
+ final ComponentInstance componentInstance) {
+ return getNodesFiltersToBeDeleted(component, componentInstance.getName());
+ }
+
+ private static boolean isNodeFilterUsingChangedCi(final ComponentInstance componentInstance,
+ final String componentInstanceName) {
+ if (CollectionUtils.isEmpty(componentInstance.getDirectives())) {
+ return false;
+ }
+ if (componentInstance.getNodeFilter() == null || componentInstance.getNodeFilter().getProperties() == null
+ || componentInstance.getNodeFilter().getProperties().getListToscaDataDefinition() == null) {
+ return false;
+ }
+ return componentInstance.getNodeFilter().getProperties().getListToscaDataDefinition().stream()
+ .anyMatch(property -> isPropertyConstraintChangedByCi(property, componentInstanceName));
+ }
+
+ private static boolean isPropertyConstraintChangedByCi(
+ final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition,
+ final String componentInstanceName) {
+ final List<String> constraints = requirementNodeFilterPropertyDataDefinition.getConstraints();
+ if (constraints == null) {
+ return false;
+ }
+ return constraints.stream().anyMatch(constraint -> isConstraintChangedByCi(constraint, componentInstanceName));
+ }
+
+ private static boolean isConstraintChangedByCi(final String constraint,
+ final String componentInstanceName) {
+ final UIConstraint uiConstraint = new ConstraintConvertor().convert(constraint);
+ if (uiConstraint == null || uiConstraint.getSourceType() == null) {
+ return false;
+ }
+ if (!uiConstraint.getSourceType().equals(ConstraintConvertor.PROPERTY_CONSTRAINT)) {
+ return false;
+ }
+ return uiConstraint.getSourceName().equals(componentInstanceName);
+ }
+
public F<StorageOperationStatus, ResponseFormat> toResponseFormat() {
return sos -> getResponseFormat(convertFromStorageResponse(sos));
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java
index d9a890d399..64f6550bec 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java
@@ -38,7 +38,6 @@ import io.swagger.v3.oas.annotations.servers.Server;
import io.swagger.v3.oas.annotations.servers.Servers;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.tags.Tags;
-import org.apache.commons.collections.CollectionUtils;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
@@ -46,6 +45,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
@@ -66,11 +66,12 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceImportManager;
-import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -132,19 +133,19 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
private final GroupBusinessLogic groupBL;
private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
- private final ServiceBusinessLogic serviceBusinessLogic;
+ private final ComponentNodeFilterBusinessLogic nodeFilterBusinessLogic;
@Inject
public ComponentInstanceServlet(UserBusinessLogic userBusinessLogic,
- GroupBusinessLogic groupBL, ComponentInstanceBusinessLogic componentInstanceBL,
- ComponentsUtils componentsUtils, ServletUtils servletUtils,
- ResourceImportManager resourceImportManager,
- ServiceBusinessLogic serviceBusinessLogic) {
+ GroupBusinessLogic groupBL, ComponentInstanceBusinessLogic componentInstanceBL,
+ ComponentsUtils componentsUtils, ServletUtils servletUtils,
+ ResourceImportManager resourceImportManager,
+ ComponentNodeFilterBusinessLogic nodeFilterBusinessLogic) {
super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
this.groupBL = groupBL;
this.componentInstanceBusinessLogic = componentInstanceBL;
- this.serviceBusinessLogic = serviceBusinessLogic;
+ this.nodeFilterBusinessLogic = nodeFilterBusinessLogic;
}
@POST
@@ -207,64 +208,67 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
schema = @Schema(allowableValues = {ComponentTypeEnum.RESOURCE_PARAM_NAME,
ComponentTypeEnum.SERVICE_PARAM_NAME,
ComponentTypeEnum.PRODUCT_PARAM_NAME})) @PathParam("containerComponentType") final String containerComponentType,
- @Context final HttpServletRequest request) throws IOException {
+ @Context final HttpServletRequest request) throws IOException, BusinessLogicException {
- String url = request.getMethod() + " " + request.getRequestURI();
+ final String url = request.getMethod() + " " + request.getRequestURI();
log.debug(START_HANDLE_REQUEST_OF, url);
loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,StatusCode.STARTED,"update Component Instance Metadata");
+ final String userId = request.getHeader(Constants.USER_ID_HEADER);
+ componentInstanceBusinessLogic.validateUser(userId);
try {
-
log.debug(START_HANDLE_REQUEST_OF, url);
-
- InputStream inputStream = request.getInputStream();
-
- byte[] bytes = IOUtils.toByteArray(inputStream);
+ final byte[] bytes = IOUtils.toByteArray(request.getInputStream());
if (bytes == null || bytes.length == 0) {
log.info(EMPTY_BODY_WAS_SENT);
return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT));
}
- String userId = request.getHeader(Constants.USER_ID_HEADER);
-
- String data = new String(bytes);
- ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
+ final String data = new String(bytes);
+ final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
if (componentInstanceBusinessLogic == null) {
log.debug(UNSUPPORTED_COMPONENT_TYPE, containerComponentType);
- return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.UNSUPPORTED_ERROR, containerComponentType));
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.UNSUPPORTED_ERROR,
+ containerComponentType));
}
- Either<ComponentInstance, ResponseFormat> convertResponse = convertToResourceInstance(data);
-
+ final Either<ComponentInstance, ResponseFormat> convertResponse = convertToResourceInstance(data);
if (convertResponse.isRight()) {
BeEcompErrorManager.getInstance().logBeSystemError(RESOURCE_INSTANCE_UPDATE_RESOURCE_INSTANCE);
log.debug(FAILED_TO_CONVERT_RECEIVED_DATA_TO_BE_FORMAT);
return buildErrorResponse(convertResponse.right().value());
}
- ComponentInstance resourceInstance = convertResponse.left().value();
- Either<ComponentInstance, ResponseFormat> actionResponse = componentInstanceBusinessLogic.updateComponentInstanceMetadata(containerComponentType, componentId, componentInstanceId, userId, resourceInstance);
- loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,actionResponse.left().value().getComponentMetadataForSupportLog(),StatusCode.COMPLETE,"update Component Instance Metadata by {}",userId);
+
+ final ComponentInstance componentInstance = convertResponse.left().value();
+ final Either<ComponentInstance, ResponseFormat> actionResponse = componentInstanceBusinessLogic
+ .updateComponentInstanceMetadata(containerComponentType, componentId, componentInstanceId, userId, componentInstance);
+ loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,actionResponse.left().value()
+ .getComponentMetadataForSupportLog(),StatusCode.COMPLETE,"update Component Instance Metadata by {}", userId);
if (actionResponse.isRight()) {
return buildErrorResponse(actionResponse.right().value());
}
- ComponentInstance resultValue = actionResponse.left().value();
- if (componentTypeEnum.equals(ComponentTypeEnum.SERVICE)){
- if(CollectionUtils.isNotEmpty(resourceInstance.getDirectives())) {
- Either<CINodeFilterDataDefinition, ResponseFormat> either =
- serviceBusinessLogic.createIfNotAlreadyExistServiceFilter(componentId, componentInstanceId, userId,
- true);
- if (either.isRight()){
- BeEcompErrorManager.getInstance().logBeSystemError("Resource Instance - updateResourceInstance Failed to create service filter.");
- log.debug("Failed to create service filter.");
+
+ final ComponentInstance resultValue = actionResponse.left().value();
+ if (ComponentTypeEnum.SERVICE.equals(componentTypeEnum) ||
+ ComponentTypeEnum.RESOURCE.equals(componentTypeEnum) &&
+ componentInstanceBusinessLogic.isVFC(componentInstance.getOriginType())) {
+
+ if(CollectionUtils.isNotEmpty(componentInstance.getDirectives())) {
+ final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
+ nodeFilterBusinessLogic.createNodeFilterIfNotExist(componentId, componentInstanceId,
+ true, componentTypeEnum);
+ if (!nodeFilterDataDefinition.isPresent()){
+ BeEcompErrorManager.getInstance().logBeSystemError("Failed to create node filter.");
+ log.error("Failed to create node filter.");
return buildErrorResponse(convertResponse.right().value());
}
- resultValue.setNodeFilter(either.left().value());
-
+ resultValue.setNodeFilter(nodeFilterDataDefinition.get());
} else {
- Either<String, ResponseFormat> either = serviceBusinessLogic.deleteIfNotAlreadyDeletedServiceFilter(componentId, componentInstanceId, userId,true);
- if (either.isRight()){
- BeEcompErrorManager.getInstance().logBeSystemError("Resource Instance - updateResourceInstance Failed to delete service filter.");
- log.debug("Failed to delete service filter.");
+ final Optional<String> result = nodeFilterBusinessLogic
+ .deleteNodeFilterIfExists(componentId, componentInstanceId, true, componentTypeEnum);
+ if (!result.isPresent()){
+ BeEcompErrorManager.getInstance().logBeSystemError("Failed to delete node filter.");
+ log.error("Failed to delete node filter.");
return buildErrorResponse(convertResponse.right().value());
}
resultValue.setNodeFilter(null);
@@ -273,7 +277,7 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), actionResponse.left().value());
- } catch (Exception e) {
+ } catch (final Exception e) {
BeEcompErrorManager.getInstance().logBeRestApiGeneralError(UPDATE_RESOURCE_INSTANCE);
log.debug(UPDATE_RESOURCE_INSTANCE_WITH_EXCEPTION, e);
throw e;
@@ -377,7 +381,7 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
} catch (Exception e) {
BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Resource Instance");
log.debug("delete resource instance with exception", e);
- throw e;
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
}
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java
new file mode 100644
index 0000000000..4a43ab23a6
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java
@@ -0,0 +1,299 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.servlets;
+
+import fj.data.Either;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ResourceImportManager;
+import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
+import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
+import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter;
+import org.openecomp.sdc.be.ui.model.UIConstraint;
+import org.openecomp.sdc.be.ui.model.UINodeFilter;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Path("/v1/catalog/{componentType}/{componentId}/resourceInstances/{componentInstanceId}/nodeFilter")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Singleton
+public class ComponentNodeFilterServlet extends AbstractValidationsServlet {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ComponentNodeFilterServlet.class);
+ private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
+ private static final String MODIFIER_ID_IS = "modifier id is {}";
+
+ private static final String FAILED_TO_PARSE_COMPONENT = "failed to parse component";
+
+ private static final String FAILED_TO_CREATE_NODE_FILTER = "failed to create node filter";
+ private static final String NODE_FILTER_CREATION = "Node Filter Creation";
+ private static final String CREATE_NODE_FILTER_WITH_AN_ERROR = "create node filter with an error";
+
+ private static final String FAILED_TO_UPDATE_NODE_FILTER = "failed to update node filter";
+ private static final String NODE_FILTER_UPDATE = "Node Filter Update";
+ private static final String UPDATE_NODE_FILTER_WITH_AN_ERROR = "update node filter with an error";
+
+ private static final String FAILED_TO_DELETE_NODE_FILTER = "failed to delete node filter";
+ private static final String NODE_FILTER_DELETE = "Node Filter Delete";
+ private static final String DELETE_NODE_FILTER_WITH_AN_ERROR = "delete node filter with an error";
+
+ private final ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic;
+
+ @Inject
+ public ComponentNodeFilterServlet(final UserBusinessLogic userBusinessLogic,
+ final ComponentInstanceBusinessLogic componentInstanceBL,
+ final ComponentsUtils componentsUtils,
+ final ServletUtils servletUtils,
+ final ResourceImportManager resourceImportManager,
+ final ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic) {
+ super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
+ this.componentNodeFilterBusinessLogic = componentNodeFilterBusinessLogic;
+ }
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/")
+ @Operation(description = "Add Component Filter Constraint", method = "POST",
+ summary = "Add Component Filter Constraint", responses = {
+ @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+ @ApiResponse(responseCode = "201", description = "Create Component Filter"),
+ @ApiResponse(responseCode = "403", description = "Restricted operation"),
+ @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+ @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+ public Response addComponentFilterConstraint(
+ @Parameter(description = "UIConstraint data", required = true) String constraintData,
+ @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+ @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+ @Parameter(description = "valid values: resources / services",
+ schema = @Schema(allowableValues = {
+ ComponentTypeEnum.RESOURCE_PARAM_NAME,
+ ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+ @Context final HttpServletRequest request,
+ @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+ LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+ LOGGER.debug(MODIFIER_ID_IS, userId);
+ final User userModifier = componentNodeFilterBusinessLogic.validateUser(userId);
+
+ final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
+ try {
+ final Either<UIConstraint, ResponseFormat> convertResponse = parseToConstraint(constraintData, userModifier,
+ componentTypeEnum);
+ if (convertResponse.isRight()) {
+ LOGGER.error(FAILED_TO_PARSE_COMPONENT);
+ return buildErrorResponse(convertResponse.right().value());
+ }
+ final UIConstraint uiConstraint = convertResponse.left().value();
+ if (uiConstraint == null) {
+ LOGGER.debug(FAILED_TO_PARSE_COMPONENT);
+ return buildErrorResponse(convertResponse.right().value());
+ }
+ final Optional<CINodeFilterDataDefinition> actionResponse;
+ final String constraint = new ConstraintConvertor().convert(uiConstraint);
+ actionResponse = componentNodeFilterBusinessLogic
+ .addNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.ADD,
+ uiConstraint.getServicePropertyName(), constraint, true, componentTypeEnum);
+
+ if (!actionResponse.isPresent()) {
+ LOGGER.error(FAILED_TO_CREATE_NODE_FILTER);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+ final UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(actionResponse.get());
+
+ return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
+
+ } catch (final Exception e) {
+ BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION);
+ LOGGER.error(CREATE_NODE_FILTER_WITH_AN_ERROR, e);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ }
+ }
+
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/")
+ @Operation(description = "Update Component Filter Constraint", method = "PUT",
+ summary = "Update Component Filter Constraint", responses = {
+ @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+ @ApiResponse(responseCode = "201", description = "Create Component Filter"),
+ @ApiResponse(responseCode = "403", description = "Restricted operation"),
+ @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+ @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+ public Response updateComponentFilterConstraint(
+ @Parameter(description = "UIConstraint data", required = true) String constraintData,
+ @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+ @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+ @Parameter(description = "valid values: resources / services",
+ schema = @Schema(allowableValues = {
+ ComponentTypeEnum.RESOURCE_PARAM_NAME,
+ ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+ @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+ LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+ LOGGER.debug(MODIFIER_ID_IS, userId);
+ final User userModifier = componentNodeFilterBusinessLogic.validateUser(userId);
+
+ try {
+ final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
+ final Either<List, ResponseFormat> convertResponse = parseToConstraints(constraintData, userModifier,
+ componentTypeEnum);
+ if (convertResponse.isRight()) {
+ LOGGER.error(FAILED_TO_PARSE_COMPONENT);
+ return buildErrorResponse(convertResponse.right().value());
+ }
+ final List<Map<String, String>> uiConstraintsMaps = (List<Map<String, String>>) convertResponse.left()
+ .value();
+ if (uiConstraintsMaps == null) {
+ LOGGER.debug("failed to parse data");
+ return buildErrorResponse(convertResponse.right().value());
+ }
+ final ObjectMapper objectMapper = new ObjectMapper();
+ final List<UIConstraint> uiConstraints = uiConstraintsMaps.stream()
+ .map(dataMap -> objectMapper.convertValue(dataMap, UIConstraint.class)).collect(
+ Collectors.toList());
+ if (uiConstraints == null) {
+ LOGGER.debug("failed to parse data");
+ return buildErrorResponse(convertResponse.right().value());
+ }
+ final Optional<CINodeFilterDataDefinition> actionResponse;
+ final List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
+
+ actionResponse = componentNodeFilterBusinessLogic
+ .updateNodeFilter(componentId.toLowerCase(), componentInstanceId, constraints,
+ true, componentTypeEnum);
+
+ if (!actionResponse.isPresent()) {
+ LOGGER.error(FAILED_TO_UPDATE_NODE_FILTER);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+
+ return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
+ new NodeFilterConverter().convertToUi(actionResponse.get()));
+
+ } catch (final Exception e) {
+ BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_UPDATE);
+ LOGGER.error(UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+ }
+
+ @DELETE
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/{constraintIndex}")
+ @Operation(description = "Delete Component Filter Constraint", method = "Delete",
+ summary = "Delete Component Filter Constraint", responses = {
+ @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+ @ApiResponse(responseCode = "201", description = "Delete Component Filter Constraint"),
+ @ApiResponse(responseCode = "403", description = "Restricted operation"),
+ @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+ @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+ public Response deleteComponentFilterConstraint(
+ @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+ @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+ @Parameter(description = "Constraint Index") @PathParam("constraintIndex") int index,
+ @Parameter(description = "valid values: resources / services",
+ schema = @Schema(allowableValues = {
+ ComponentTypeEnum.RESOURCE_PARAM_NAME,
+ ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+ @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+ LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+ LOGGER.debug(MODIFIER_ID_IS, userId);
+ componentNodeFilterBusinessLogic.validateUser(userId);
+
+ try {
+ final Optional<CINodeFilterDataDefinition> actionResponse;
+ actionResponse = componentNodeFilterBusinessLogic
+ .deleteNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.DELETE,
+ null, index, true, ComponentTypeEnum.findByParamName(componentType));
+
+ if (!actionResponse.isPresent()) {
+ LOGGER.debug(FAILED_TO_DELETE_NODE_FILTER);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+ }
+
+ return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
+ new NodeFilterConverter().convertToUi(actionResponse.get()));
+
+ } catch (final Exception e) {
+ BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_DELETE);
+ LOGGER.debug(DELETE_NODE_FILTER_WITH_AN_ERROR, e);
+ return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+ }
+ }
+
+ private Either<UIConstraint, ResponseFormat> parseToConstraint(final String componentJson,
+ final User user,
+ final ComponentTypeEnum componentTypeEnum) {
+ return getComponentsUtils().convertJsonToObjectUsingObjectMapper(componentJson, user, UIConstraint.class,
+ AuditingActionEnum.CREATE_RESOURCE, componentTypeEnum);
+ }
+
+ private Either<List, ResponseFormat> parseToConstraints(final String componentJson,
+ final User user,
+ final ComponentTypeEnum componentTypeEnum) {
+ return getComponentsUtils().convertJsonToObjectUsingObjectMapper(componentJson, user, List.class,
+ AuditingActionEnum.CREATE_RESOURCE, componentTypeEnum);
+ }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java
deleted file mode 100644
index a37ab0120f..0000000000
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.sdc.be.servlets;
-
-import fj.data.Either;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.ArraySchema;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.servers.Server;
-import io.swagger.v3.oas.annotations.servers.Servers;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.tags.Tags;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ResourceImportManager;
-import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
-import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
-import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
-import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
-import org.openecomp.sdc.be.config.BeEcompErrorManager;
-import org.openecomp.sdc.be.dao.api.ActionStatus;
-import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.impl.ServletUtils;
-import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
-import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter;
-import org.openecomp.sdc.be.ui.model.UIConstraint;
-import org.openecomp.sdc.be.ui.model.UINodeFilter;
-import org.openecomp.sdc.be.user.UserBusinessLogic;
-import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.exception.ResponseFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-@Path("/v1/catalog/services/{serviceId}/resourceInstances/{resourceInstanceId}/nodeFilter")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Tags({@Tag(name = "SDC Internal APIs")})
-@Servers({@Server(url = "/sdc2/rest")})
-@Singleton
-public class ServiceFilterServlet extends AbstractValidationsServlet {
-
- private static final Logger log = LoggerFactory.getLogger(ServiceFilterServlet.class);
- private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
- private static final String MODIFIER_ID_IS = "modifier id is {}";
- private static final String FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER = "failed to update or create node filter";
- private static final String FAILED_TO_PARSE_SERVICE = "failed to parse service";
- private static final String NODE_FILTER_CREATION_OR_UPDATE = "Node Filter Creation or update";
- private static final String CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR =
- "create or update node filter with an error";
- private final ServiceBusinessLogic serviceBusinessLogic;
-
- @Inject
- public ServiceFilterServlet(UserBusinessLogic userBusinessLogic,
- ComponentInstanceBusinessLogic componentInstanceBL,
- ComponentsUtils componentsUtils, ServletUtils servletUtils,
- ResourceImportManager resourceImportManager,
- ServiceBusinessLogic serviceBusinessLogic) {
- super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
- this.serviceBusinessLogic = serviceBusinessLogic;
- }
-
- @POST
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- @Path("/")
- @Operation(description = "Add Service Filter Constraint", method = "POST",
- summary = "Add Service Filter Constraint", responses = {
- @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
- @ApiResponse(responseCode = "201", description = "Create Service Filter"),
- @ApiResponse(responseCode = "403", description = "Restricted operation"),
- @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
- @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
- public Response addServiceFilterConstraint(@Parameter(description = "Service data", required = true) String data,
- @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
- @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
- @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
-
- String url = request.getMethod() + " " + request.getRequestURI();
- log.debug(START_HANDLE_REQUEST_OF, url);
- final HttpSession session = request.getSession();
- ServletContext context = session.getServletContext();
- User modifier = new User();
- modifier.setUserId(userId);
- log.debug(MODIFIER_ID_IS, userId);
-
- Response response;
-
- try {
- String serviceIdLower = serviceId.toLowerCase();
-
- Either<UIConstraint, ResponseFormat> convertResponse = parseToConstraint(data, modifier);
- if (convertResponse.isRight()) {
- log.debug(FAILED_TO_PARSE_SERVICE);
- response = buildErrorResponse(convertResponse.right().value());
- return response;
- }
- UIConstraint uiConstraint = convertResponse.left().value();
- if (uiConstraint == null) {
- log.debug(FAILED_TO_PARSE_SERVICE);
- response = buildErrorResponse(convertResponse.right().value());
- return response;
- }
- Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
- String constraint = new ConstraintConvertor().convert(uiConstraint);
- actionResponse = serviceBusinessLogic
- .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.ADD, uiConstraint.getServicePropertyName(),
- constraint, -1, modifier, true);
-
- if (actionResponse.isRight()) {
- log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
- response = buildErrorResponse(actionResponse.right().value());
- return response;
- }
-
- CINodeFilterDataDefinition value = actionResponse.left().value();
- UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(value);
- return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
-
- } catch (Exception e) {
- BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
- log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
- response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
- return response;
-
- }
- }
-
- @PUT
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- @Path("/")
- @Operation(description = "Update Service Filter Constraint", method = "PUT",
- summary = "Update Service Filter Constraint", responses = {
- @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
- @ApiResponse(responseCode = "201", description = "Create Service Filter"),
- @ApiResponse(responseCode = "403", description = "Restricted operation"),
- @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
- @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
- public Response updateServiceFilterConstraint(@Parameter(description = "Service data", required = true) String data,
- @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
- @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
- @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
- ServletContext context = request.getSession().getServletContext();
- String url = request.getMethod() + " " + request.getRequestURI();
- log.debug(START_HANDLE_REQUEST_OF, url);
-
- User modifier = new User();
- modifier.setUserId(userId);
- log.debug(MODIFIER_ID_IS, userId);
-
- Response response;
-
- try {
- String serviceIdLower = serviceId.toLowerCase();
-
- Either<List, ResponseFormat> convertResponse = parseToConstraints(data, modifier);
- if (convertResponse.isRight()) {
- log.debug(FAILED_TO_PARSE_SERVICE);
- response = buildErrorResponse(convertResponse.right().value());
- return response;
- }
- List<Map<String,String>> uiConstraintsMaps = (List<Map<String,String>>) convertResponse.left().value();
- if (uiConstraintsMaps == null) {
- log.debug("failed to parse data");
- response = buildErrorResponse(convertResponse.right().value());
- return response;
- }
- final ObjectMapper objectMapper = new ObjectMapper();
- List<UIConstraint> uiConstraints = uiConstraintsMaps.stream().map(dataMap -> objectMapper.convertValue(dataMap, UIConstraint.class)).collect(
- Collectors.toList());
- if (uiConstraints == null) {
- log.debug("failed to parse data");
- response = buildErrorResponse(convertResponse.right().value());
- return response;
- }
- Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
- List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
- actionResponse = serviceBusinessLogic.updateServiceFilter(serviceIdLower, ciId, constraints, modifier, true);
-
- if (actionResponse.isRight()) {
- log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
- response = buildErrorResponse(actionResponse.right().value());
- return response;
- }
-
- CINodeFilterDataDefinition value = actionResponse.left().value();
- return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
- new NodeFilterConverter().convertToUi(value));
-
- } catch (Exception e) {
- BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
- log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
- response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
- return response;
-
- }
- }
-
- @DELETE
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- @Path("/{constraintIndex}")
- @Operation(description = "Delete Service Filter Constraint", method = "Delete",
- summary = "Delete Service Filter Constraint", responses = {
- @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
- @ApiResponse(responseCode = "201", description = "Delete Service Filter Constraint"),
- @ApiResponse(responseCode = "403", description = "Restricted operation"),
- @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
- @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
- public Response deleteServiceFilterConstraint(
- @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
- @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
- @Parameter(description = "Constraint Index") @PathParam("constraintIndex") int index,
- @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
- String url = request.getMethod() + " " + request.getRequestURI();
- log.debug(START_HANDLE_REQUEST_OF, url);
-
- User modifier = new User();
- modifier.setUserId(userId);
- log.debug(MODIFIER_ID_IS, userId);
-
- Response response;
-
- try {
- String serviceIdLower = serviceId.toLowerCase();
-
- Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
- actionResponse = serviceBusinessLogic
- .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.DELETE,
- null, null, index, modifier, true);
-
- if (actionResponse.isRight()) {
-
- log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
- response = buildErrorResponse(actionResponse.right().value());
- return response;
- }
-
- final CINodeFilterDataDefinition value = actionResponse.left().value();
- return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
- new NodeFilterConverter().convertToUi(value));
-
- } catch (Exception e) {
- BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
- log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
- response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
- return response;
-
- }
- }
-
- private Either<UIConstraint, ResponseFormat> parseToConstraint(String serviceJson, User user) {
- return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, UIConstraint.class,
- AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
- }
-
- private Either<List, ResponseFormat> parseToConstraints(String serviceJson, User user) {
- return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, List.class,
- AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
- }
-}
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java
index 1b8fd42435..d5fe4f159e 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java
@@ -21,8 +21,16 @@
*/
package org.openecomp.sdc.be.components;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
import com.google.common.collect.Sets;
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
import org.junit.Before;
import org.mockito.Mockito;
import org.openecomp.sdc.ElementOperationMock;
@@ -36,7 +44,6 @@ import org.openecomp.sdc.be.components.impl.ServiceBusinessLogicTest;
import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
import org.openecomp.sdc.be.components.utils.ComponentBusinessLogicMock;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
@@ -57,7 +64,6 @@ import org.openecomp.sdc.be.model.Service;
import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.category.CategoryDefinition;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
import org.openecomp.sdc.be.model.operations.api.IElementOperation;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
@@ -73,15 +79,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
-import javax.servlet.ServletContext;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogicMock {
private static final Logger log = LoggerFactory.getLogger(ServiceBusinessLogicTest.class);
private static final String SERVICE_CATEGORY = "Mobility";
@@ -94,8 +91,6 @@ public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogi
protected final ServiceDistributionValidation serviceDistributionValidation = Mockito.mock(ServiceDistributionValidation.class);
protected final ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
protected final UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
- protected final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
- protected final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
private ServiceBusinessLogic bl;
private ResponseFormatManager responseManager = null;
private IElementOperation mockElementDao;
@@ -173,7 +168,7 @@ public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogi
groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
artifactsBusinessLogic, distributionEngine, componentInstanceBusinessLogic,
serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
- serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator, componentNameValidator,
+ artifactToscaOperation, componentContactIdValidator, componentNameValidator,
componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
bl.setUserAdmin(mockUserAdmin);
bl.setGraphLockOperation(graphLockOperation);
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java
index 5c135642a5..68fa486270 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java
@@ -21,6 +21,12 @@
*/
package org.openecomp.sdc.be.components;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
import fj.data.Either;
import org.junit.Before;
import org.junit.Test;
@@ -37,7 +43,6 @@ import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
import org.openecomp.sdc.be.components.utils.ComponentBusinessLogicMock;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
@@ -47,18 +52,11 @@ import org.openecomp.sdc.be.model.ComponentParametersView;
import org.openecomp.sdc.be.model.DistributionStatusEnum;
import org.openecomp.sdc.be.model.Service;
import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
import org.openecomp.sdc.common.impl.ExternalConfiguration;
import org.openecomp.sdc.common.util.ThreadLocalsHolder;
import org.openecomp.sdc.exception.ResponseFormat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
-
/**
* Created by chaya on 10/26/2017.
*/
@@ -71,8 +69,6 @@ public class ServiceDistributionBLTest extends ComponentBusinessLogicMock {
private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
private final ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
private final UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
- private final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
- private final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
@InjectMocks
@@ -80,7 +76,7 @@ public class ServiceDistributionBLTest extends ComponentBusinessLogicMock {
groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
artifactsBusinessLogic, distributionEngine, componentInstanceBusinessLogic,
serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
- serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator,
+ artifactToscaOperation, componentContactIdValidator,
componentNameValidator, componentTagsValidator, componentValidator, componentIconValidator,
componentProjectCodeValidator, componentDescriptionValidator);
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java
index b812fd9187..a4a3b4d628 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java
@@ -20,7 +20,17 @@
package org.openecomp.sdc.be.components.impl;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import javax.servlet.ServletContext;
import org.junit.Before;
import org.mockito.Mockito;
import org.openecomp.sdc.ElementOperationMock;
@@ -29,7 +39,6 @@ import org.openecomp.sdc.be.components.distribution.engine.DistributionEngine;
import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
import org.openecomp.sdc.be.components.validation.UserValidations;
import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
@@ -65,7 +74,6 @@ import org.openecomp.sdc.be.model.Resource;
import org.openecomp.sdc.be.model.Service;
import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.category.CategoryDefinition;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
import org.openecomp.sdc.be.model.operations.api.IElementOperation;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
@@ -80,17 +88,6 @@ import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.exception.ResponseFormat;
import org.springframework.web.context.WebApplicationContext;
-import javax.servlet.ServletContext;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
protected ServiceBusinessLogic bl;
@@ -119,8 +116,6 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
- protected final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
- protected final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
protected ServiceTypeValidator serviceTypeValidator = new ServiceTypeValidator(componentsUtils);
protected ServiceCategoryValidator serviceCategoryValidator = new ServiceCategoryValidator(componentsUtils, mockElementDao);
protected ServiceRoleValidator serviceRoleValidator = new ServiceRoleValidator(componentsUtils);
@@ -135,9 +130,6 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
protected final ComponentValidator componentValidator = Mockito.mock(ComponentValidator.class);
protected ServiceValidator serviceValidator = createServiceValidator();
-
-
-
protected User user = null;
protected Resource genericService = null;
@@ -218,7 +210,7 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
artifactBl, distributionEngine, componentInstanceBusinessLogic,
serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
- serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator,
+ artifactToscaOperation, componentContactIdValidator,
componentNameValidator, componentTagsValidator, componentValidator,
componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
bl.setComponentContactIdValidator(componentContactIdValidator);
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java
index f5b558e0d6..d801314c79 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java
@@ -20,9 +20,28 @@
package org.openecomp.sdc.be.servlets;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.when;
+import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.SERVICE_PARAM_NAME;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
import org.eclipse.jetty.http.HttpStatus;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
@@ -33,6 +52,7 @@ import org.junit.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceImportManager;
import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
@@ -55,26 +75,6 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.when;
-import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.SERVICE_PARAM_NAME;
-
/**
* The test suite designed for test functionality of ComponentInstanceServlet class
*/
@@ -94,6 +94,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
private static GroupBusinessLogic groupBusinessLogic;
private static ResourceImportManager resourceImportManager;
private static ServiceBusinessLogic serviceBusinessLogic;
+ private static ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic;
@BeforeClass
public static void setup() {
@@ -261,6 +262,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
bind(servletUtils).to(ServletUtils.class);
bind(resourceImportManager).to(ResourceImportManager.class);
bind(serviceBusinessLogic).to(ServiceBusinessLogic.class);
+ bind(componentNodeFilterBusinessLogic).to(ComponentNodeFilterBusinessLogic.class);
}
})
.property("contextConfig", context);
@@ -280,6 +282,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
servletUtils = Mockito.mock(ServletUtils.class);
responseFormat = Mockito.mock(ResponseFormat.class);
serviceBusinessLogic = Mockito.mock(ServiceBusinessLogic.class);
+ componentNodeFilterBusinessLogic = Mockito.mock(ComponentNodeFilterBusinessLogic.class);
}
private static void stubMethods() {