diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java | 942 |
1 files changed, 361 insertions, 581 deletions
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 28fc2597b8..c1f7808958 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,43 +22,17 @@ package org.openecomp.sdc.be.components.impl; -import static org.apache.commons.collections.CollectionUtils.isEmpty; -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.utils.InterfacesOperationsToscaUtil.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 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 fj.data.Either; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.openecomp.sdc.be.catalog.enums.ChangeTypeEnum; import org.openecomp.sdc.be.components.distribution.engine.IDistributionEngine; import org.openecomp.sdc.be.components.distribution.engine.INotificationData; import org.openecomp.sdc.be.components.distribution.engine.VfModuleArtifactPayload; @@ -73,6 +47,19 @@ 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; +import org.openecomp.sdc.be.components.validation.component.ComponentIconValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentNameValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentProjectCodeValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentTagsValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceCategoryValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceFunctionValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceInstantiationTypeValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceRoleValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceTypeValidator; +import org.openecomp.sdc.be.components.validation.service.ServiceValidator; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.config.ConfigurationManager; import org.openecomp.sdc.be.dao.api.ActionStatus; @@ -90,7 +77,6 @@ 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.InstantiationTypes; import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum; @@ -148,6 +134,7 @@ 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; @@ -159,6 +146,31 @@ 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.utils.InterfacesOperationsToscaUtil.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 { @@ -171,6 +183,7 @@ 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; @@ -184,6 +197,34 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { private final NodeFilterOperation serviceFilterOperation; private final NodeFilterValidator serviceFilterValidator; + private ServiceTypeValidator serviceTypeValidator; + + @Autowired + public void setServiceTypeValidator(ServiceTypeValidator serviceTypeValidator) { + this.serviceTypeValidator = serviceTypeValidator; + } + + + private ServiceFunctionValidator serviceFunctionValidator; + + @Autowired + public void setServiceFunctionValidator(ServiceFunctionValidator serviceFunctionValidator) { + this.serviceFunctionValidator = serviceFunctionValidator; + } + + @Autowired + private ServiceRoleValidator serviceRoleValidator; + + @Autowired + private ServiceInstantiationTypeValidator serviceInstantiationTypeValidator; + + @Autowired + private ServiceCategoryValidator serviceCategoryValidator; + + @Autowired + private ServiceValidator serviceValidator; + + @Autowired public ServiceBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, @@ -196,9 +237,18 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic, ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator, UiComponentDataConverter uiComponentDataConverter, NodeFilterOperation serviceFilterOperation, - NodeFilterValidator serviceFilterValidator, ArtifactsOperations artifactToscaOperation) { + NodeFilterValidator serviceFilterValidator, 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); + interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator, + componentNameValidator, componentTagsValidator, componentValidator, + componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator); this.distributionEngine = distributionEngine; this.componentInstanceBusinessLogic = componentInstanceBusinessLogic; this.serviceDistributionValidation = serviceDistributionValidation; @@ -206,76 +256,12 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { this.uiComponentDataConverter = uiComponentDataConverter; this.serviceFilterOperation = serviceFilterOperation; this.serviceFilterValidator = serviceFilterValidator; - } - - public Either<Service, ResponseFormat> changeServiceDistributionState(String serviceId, String state, LifecycleChangeInfoWithAction commentObj, User user) { - - validateUserExists(user.getUserId(), "change Service Distribution State", false); - - log.debug("check request state"); - Either<DistributionTransitionEnum, ResponseFormat> validateEnum = validateTransitionEnum(state); - if (validateEnum.isRight()) { - return Either.right(validateEnum.right().value()); - } - DistributionTransitionEnum distributionTransition = validateEnum.left().value(); - AuditingActionEnum auditAction = distributionTransition == DistributionTransitionEnum.APPROVE ? AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_APPROV : AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REJECT; - Either<String, ResponseFormat> commentResponse = validateComment(commentObj); - if (commentResponse.isRight()) { - return Either.right(commentResponse.right().value()); - } - String comment = commentResponse.left().value(); - - Either<Service, ResponseFormat> validateService = validateServiceDistributionChange(user, serviceId, auditAction, comment); - if (validateService.isRight()) { - return Either.right(validateService.right().value()); - } - Service service = validateService.left().value(); - Either<User, ResponseFormat> validateUser = validateUserDistributionChange(user, service, auditAction, comment); - if (validateUser.isRight()) { - return Either.right(validateUser.right().value()); - } - user = validateUser.left().value(); - - // lock resource - - Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, service, "ChangeServiceDistributionState"); - if (lockResult.isRight()) { - ResponseFormat responseFormat = lockResult.right().value(); - createAudit(user, auditAction, comment, service, responseFormat); - return Either.right(responseFormat); - } - - try { - - DistributionStatusEnum newState; - if (distributionTransition == DistributionTransitionEnum.APPROVE) { - newState = DistributionStatusEnum.DISTRIBUTION_APPROVED; - } else { - newState = DistributionStatusEnum.DISTRIBUTION_REJECTED; - } - Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, newState); - if (result.isRight()) { - janusGraphDao.rollback(); - BeEcompErrorManager.getInstance().logBeSystemError("ChangeServiceDistributionState"); - log.debug("service {} is change destribuation status failed", service.getUniqueId()); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR, service.getVersion(), service.getName()); - createAudit(user, auditAction, comment, service, responseFormat); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); - } - janusGraphDao.commit(); - Service updatedService = result.left().value(); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK); - log.debug(AUDIT_BEFORE_SENDING_RESPONSE); - componentsUtils.auditComponent(responseFormat, user, updatedService, auditAction, new ResourceCommonInfo(ComponentTypeEnum.SERVICE.getValue()), ResourceVersionInfo.newBuilder().build(), comment); - return Either.left(result.left().value()); - } finally { - graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service); - } } + public Either<List<Map<String, Object>>, ResponseFormat> getComponentAuditRecords(String componentVersion, String componentUUID, String userId) { - validateUserExists(userId, "get Component Audit Records", false); + validateUserExists(userId); Either<List<Map<String, Object>>, ActionStatus> result; try { @@ -358,7 +344,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String operationId, String userId, ServiceConsumptionData serviceConsumptionData) { - validateUserExists(userId, "create Property", false); + validateUserExists(userId); Either<Service, StorageOperationStatus> serviceEither = toscaOperationFacade.getToscaElement(serviceId); @@ -703,33 +689,19 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { private Either<Boolean, ResponseFormat> validateOperationInputConstraint( OperationInputDefinition operationInputDefinition, String value, String type) { - - if (Objects.nonNull(operationInputDefinition.getParentPropertyType()) - && !operationInputDefinition.getParentPropertyType().equals(operationInputDefinition.getType())) { - InputDefinition inputDefinition = new InputDefinition(); - inputDefinition.setDefaultValue(value); - inputDefinition.setInputPath(operationInputDefinition.getSubPropertyInputPath()); - inputDefinition.setName(operationInputDefinition.getName()); - inputDefinition.setType(type); - - ComponentInstanceProperty propertyDefinition = new ComponentInstanceProperty(); - propertyDefinition.setType(operationInputDefinition.getParentPropertyType()); - if (operationInputDefinition.getParentPropertyType() != null) { + ComponentInstanceProperty propertyDefinition = new ComponentInstanceProperty(); + propertyDefinition.setType(operationInputDefinition.getParentPropertyType()); + + InputDefinition inputDefinition = new InputDefinition(); + inputDefinition.setDefaultValue(value); + inputDefinition.setInputPath(operationInputDefinition.getSubPropertyInputPath()); + inputDefinition.setType(type); + if (Objects.nonNull(operationInputDefinition.getParentPropertyType())) { inputDefinition.setProperties(Collections.singletonList(propertyDefinition)); - } - - return PropertyValueConstraintValidationUtil.getInstance() - .validatePropertyConstraints(Collections.singletonList(inputDefinition), applicationDataTypeCache); - } else { - PropertyDefinition propertyDefinition = new PropertyDefinition(); - propertyDefinition.setType(operationInputDefinition.getType()); - propertyDefinition.setSchema(operationInputDefinition.getSchema()); - propertyDefinition.setValue(value); - propertyDefinition.setName(operationInputDefinition.getName()); - - return PropertyValueConstraintValidationUtil.getInstance() - .validatePropertyConstraints(Collections.singletonList(propertyDefinition), applicationDataTypeCache); } + + return PropertyValueConstraintValidationUtil.getInstance() + .validatePropertyConstraints(Collections.singletonList(inputDefinition), applicationDataTypeCache); } private void addStaticValueToInputOperation(String value, Operation operation, @@ -833,6 +805,16 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.left(archiveAudit); } + @VisibleForTesting + public void setServiceValidator(ServiceValidator serviceValidator) { + this.serviceValidator = serviceValidator; + } + + @VisibleForTesting + public void setServiceCategoryValidator(ServiceCategoryValidator serviceCategoryValidator) { + this.serviceCategoryValidator = serviceCategoryValidator; + } + private List<Map<String, Object>> getAuditingFieldsList(List<? extends AuditingGenericEvent> prevVerAuditList) { List<Map<String, Object>> prevVerAudit = new ArrayList<>(); @@ -856,6 +838,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { // get user details user = validateUser(user, "Create Service", service, AuditingActionEnum.CREATE_RESOURCE, false); + log.debug("User returned from validation: "+ user.toString()); // validate user role validateUserRole(user, service, new ArrayList<>(), AuditingActionEnum.CREATE_RESOURCE, null); service.setCreatorUserId(user.getUserId()); @@ -867,12 +850,16 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { service.setVersion(INITIAL_VERSION); service.setConformanceLevel(ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel()); service.setDistributionStatus(DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED); - + service.setComponentType(ComponentTypeEnum.SERVICE); Either<Service, ResponseFormat> createServiceResponse = validateServiceBeforeCreate(service, user, AuditingActionEnum.CREATE_RESOURCE); if (createServiceResponse.isRight()) { return createServiceResponse; } - return createServiceByDao(service, AuditingActionEnum.CREATE_RESOURCE, user); + return createServiceByDao(service, AuditingActionEnum.CREATE_RESOURCE, user) + .left() + .bind(c -> updateCatalog(c, ChangeTypeEnum.LIFECYCLE) + .left() + .map (r -> (Service) r)); } private void checkFieldsForOverideAttampt(Service service) { @@ -961,12 +948,18 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } } - private Either<Service, ResponseFormat> validateServiceBeforeCreate(Service service, User user, AuditingActionEnum actionEnum) { + @VisibleForTesting + protected Either<Service, ResponseFormat> validateServiceBeforeCreate(Service service, User user, AuditingActionEnum actionEnum) { - Either<Boolean, ResponseFormat> validationResponse = validateServiceFieldsBeforeCreate(user, service, actionEnum); - if (validationResponse.isRight()) { - return Either.right(validationResponse.right().value()); + try { + serviceValidator.validate(user,service,actionEnum); + } catch (ComponentException exp) { + ResponseFormat responseFormat = componentsUtils.getResponseFormat(exp); + componentsUtils.auditComponentAdmin(responseFormat, user, service, + AuditingActionEnum.CREATE_SERVICE, ComponentTypeEnum.SERVICE); + throw exp; } + service.setCreatorFullName(user.getFirstName() + " " + user.getLastName()); service.setContactId(service.getContactId().toLowerCase()); @@ -978,57 +971,8 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.left(service); } - - - private Either<Boolean, ResponseFormat> validateServiceFieldsBeforeCreate(User user, Service service, AuditingActionEnum actionEnum) { - try { - validateComponentFieldsBeforeCreate(user, service, actionEnum); - - Either<Boolean, ResponseFormat> serviceNameUniquenessValidation = validateComponentNameUnique(user, service, actionEnum); - if (serviceNameUniquenessValidation.isRight()) { - throw new ByResponseFormatComponentException(serviceNameUniquenessValidation.right().value()); - } - Either<Boolean, ResponseFormat> categoryValidation = validateServiceCategory(user, service, actionEnum); - if (categoryValidation.isRight()) { - return categoryValidation; - } - Either<Boolean, ResponseFormat> projectCodeValidation = validateProjectCode(user, service, actionEnum); - if (projectCodeValidation.isRight()) { - return projectCodeValidation; - } - validateServiceTypeAndCleanup(service); - - Either<Boolean, ResponseFormat> serviceRoleValidation = validateServiceRoleAndCleanup(user, service, actionEnum); - if (serviceRoleValidation.isRight()) { - return serviceRoleValidation; - } - return validateInstantiationTypeValue(user, service, actionEnum); - } catch (ComponentException exception) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(exception); - componentsUtils.auditComponentAdmin(responseFormat, user, service, - AuditingActionEnum.CREATE_SERVICE, ComponentTypeEnum.SERVICE); - return Either.right(responseFormat); - } - } - - private Either<Boolean, ResponseFormat> validateServiceCategory(User user, Service service, AuditingActionEnum actionEnum) { - log.debug("validate Service category"); - if (isEmpty(service.getCategories())) { - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.SERVICE.getValue()); - componentsUtils.auditComponentAdmin(errorResponse, user, service, actionEnum, ComponentTypeEnum.SERVICE); - return Either.right(errorResponse); - } - Either<Boolean, ResponseFormat> validatCategory = validateServiceCategory(service.getCategories()); - if (validatCategory.isRight()) { - ResponseFormat responseFormat = validatCategory.right().value(); - componentsUtils.auditComponentAdmin(responseFormat, user, service, actionEnum, ComponentTypeEnum.SERVICE); - return Either.right(responseFormat); - } - return Either.left(true); - } - public Either<Map<String, Boolean>, ResponseFormat> validateServiceNameExists(String serviceName, String userId) { - validateUserExists(userId, "validate Service Name Exists", false); + validateUserExists(userId); Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade.validateComponentNameUniqueness(serviceName, null, ComponentTypeEnum.SERVICE); // DE242223 @@ -1044,6 +988,10 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.right(responseFormat); } + public void setElementDao(IElementOperation elementDao) { + this.elementDao = elementDao; + } + @Autowired public void setCassandraAuditingDao(AuditCassandraDao auditingDao) { this.auditCassandraDao = auditingDao; @@ -1053,6 +1001,10 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return artifactsBusinessLogic; } + public void setArtifactBl(ArtifactsBusinessLogic artifactBl) { + this.artifactsBusinessLogic = artifactBl; + } + public Either<Service, ResponseFormat> updateServiceMetadata(String serviceId, Service serviceUpdate, User user) { user = validateUser(user, "updateServiceMetadata", serviceUpdate, null, false); // validate user role @@ -1078,42 +1030,49 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { Service serviceToUpdate = validationRsponse.left().value(); // lock resource - Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, currentService, "Update Service Metadata"); - if (lockResult.isRight()) { - return Either.right(lockResult.right().value()); - } + lockComponent(serviceId, currentService, "Update Service Metadata"); try { - Either<Service, StorageOperationStatus> updateResponse = toscaOperationFacade.updateToscaElement(serviceToUpdate); - if (updateResponse.isRight()) { - janusGraphDao.rollback(); - BeEcompErrorManager.getInstance().logBeSystemError("Update Service Metadata"); - log.debug("failed to update sevice {}", serviceToUpdate.getUniqueId()); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); - } - janusGraphDao.commit(); - return Either.left(updateResponse.left().value()); + return toscaOperationFacade.updateToscaElement(serviceToUpdate) + .right() + .map(rf -> { + janusGraphDao.rollback(); + BeEcompErrorManager.getInstance().logBeSystemError("Update Service Metadata"); + log.debug("failed to update sevice {}", serviceToUpdate.getUniqueId()); + return (componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); + }) + .left() + .bind(c -> updateCatalogAndCommit(c)); + } finally { graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service); } } - public Either<Set<String>, ResponseFormat> deleteForwardingPaths(String serviceId, Set<String> pathIdsToDelete, User user, boolean lock) { + private Either<Service, ResponseFormat> updateCatalogAndCommit(Service service){ + Either<Service, ResponseFormat> res = updateCatalog(service, ChangeTypeEnum.LIFECYCLE).left().map(s -> (Service)s); + janusGraphDao.commit(); + return res; + + } + + public Set<String> deleteForwardingPaths(String serviceId, Set<String> pathIdsToDelete, User user, boolean lock) { Service serviceToDelete = initServiceToDeletePaths(serviceId, pathIdsToDelete); user = validateUser(user, "deleteForwardingPaths", serviceToDelete, null, false); // validate user role validateUserRole(user, serviceToDelete, new ArrayList<>(), null, null); Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId); if (storageStatus.isRight()) { - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), "")); + throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""); } Service service = storageStatus.left().value(); Either<Set<String>, StorageOperationStatus> result = null; if (lock) { - Either<Boolean, ResponseFormat> lockResult = lockComponent(service.getUniqueId(), service, "Delete Forwarding Path on Service"); - if (lockResult.isRight()) { + try { + lockComponent(service.getUniqueId(), service, "Delete Forwarding Path on Service"); + } catch (ComponentException e) { janusGraphDao.rollback(); - return Either.right(componentsUtils.getResponseFormat(componentsUtils - .convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), "")); + throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse + (storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""); } } try{ @@ -1121,19 +1080,20 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { if (result.isRight()) { log.debug(FAILED_TO_LOCK_SERVICE_RESPONSE_IS, service.getName(), result.right().value()); janusGraphDao.rollback(); - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE))); + throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse + (storageStatus.right().value(), ComponentTypeEnum.SERVICE)); } janusGraphDao.commit(); log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, service.getSystemName()); - } catch (Exception e){ + } catch (ComponentException e){ log.error("Exception occurred during delete forwarding path : {}", e.getMessage(), e); janusGraphDao.rollback(); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); + throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR); } finally { graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service); } - return Either.left(result.left().value()); + return result.left().value(); } private Service initServiceToDeletePaths(String serviceId, Collection<String> pathIdsToDelete) { @@ -1144,11 +1104,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return serviceToDelete; } - public Either<Service, ResponseFormat> updateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) { + public Service updateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) { return createOrUpdateForwardingPath(serviceId, serviceUpdate, user, true,"updateForwardingPath", lock); } - public Either<Service, ResponseFormat> createForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) { + public Service createForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) { return createOrUpdateForwardingPath(serviceId, serviceUpdate, user, false, "createForwardingPath", lock); } @@ -1164,7 +1124,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return dataDefinition; } - private Either<Service, ResponseFormat> createOrUpdateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean isUpdate, String errorContext, boolean lock) { + private Service createOrUpdateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean isUpdate, String errorContext, boolean lock) { validateUserAndRole(serviceUpdate, user, errorContext); Map<String, ForwardingPathDataDefinition> forwardingPaths = serviceUpdate.getForwardingPaths(); @@ -1173,83 +1133,80 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { forwardingPaths.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> new ForwardingPathDataDefinition(getTrimmedValues(entry.getValue())))); - Either<Boolean, ResponseFormat> booleanResponseFormatEither = forwardingPathValidator.validateForwardingPaths(trimmedForwardingPaths.values(), + forwardingPathValidator.validateForwardingPaths(trimmedForwardingPaths.values(), serviceId, isUpdate); - if(booleanResponseFormatEither.isRight()){ - return Either.right(booleanResponseFormatEither.right().value()); - } 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))); + throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(errorStatus)); } Service storedService = serviceStorageOperationStatusEither.left().value(); Either<ForwardingPathDataDefinition, StorageOperationStatus> result; - Either<Component, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade.getLatestByName(ForwardingPathUtils.FORWARDING_PATH_NODE_NAME); - if (forwardingPathOrigin.isRight()) { - StorageOperationStatus errorStatus = forwardingPathOrigin.right().value(); - log.debug("Failed to fetch normative forwarding path resource by tosca name, error {}", errorStatus); - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(errorStatus))); - } - Component component = forwardingPathOrigin.left().value(); + Component component = getForwardingPathOriginComponent(); final String toscaResourceName; if ( component.getComponentType() == ComponentTypeEnum.RESOURCE) { toscaResourceName = ((Resource) component).getToscaResourceName(); } else { toscaResourceName = ""; } - Either<Boolean, ResponseFormat> lockResult = null; if (lock) { - lockResult = - lockComponent(storedService.getUniqueId(), storedService, "Add or Update Forwarding Path on Service"); - if (lockResult.isRight()) { - log.debug(FAILED_TO_LOCK_SERVICE_RESPONSE_IS, storedService.getName(), - lockResult.right().value().getFormattedMessage()); - return Either.right(lockResult.right().value()); - } else { - log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, storedService.getSystemName()); - } + lockComponent(storedService.getUniqueId(), storedService, "Add or Update Forwarding Path on Service"); + log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, storedService.getSystemName()); } Map<String, ForwardingPathDataDefinition> resultMap = new HashMap<>(); try { trimmedForwardingPaths.values().forEach(fp -> fp.setToscaResourceName(toscaResourceName)); - try { - for (ForwardingPathDataDefinition forwardingPathDataDefinition : trimmedForwardingPaths.values()) { - if (isUpdate) { - result = forwardingPathOperation.updateForwardingPath(serviceId, forwardingPathDataDefinition); - } else { - result = forwardingPathOperation.addForwardingPath(serviceId, forwardingPathDataDefinition); - } - if (result.isRight()) { - janusGraphDao.rollback(); - return Either.right(componentsUtils.getResponseFormat( - componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE), - "")); - } else { - ForwardingPathDataDefinition fpDataDefinition = result.left().value(); - resultMap.put(fpDataDefinition.getUniqueId(), forwardingPathDataDefinition); - } - } - - } catch (Exception e) { - janusGraphDao.rollback(); - log.error("Exception occurred during add or update forwarding path property values: {}", e.getMessage(), - e); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); - } + populateForwardingPaths(serviceId, isUpdate, trimmedForwardingPaths, resultMap); janusGraphDao.commit(); } finally { - if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) { + if (lock) { graphLockOperation.unlockComponent(storedService.getUniqueId(), NodeTypeEnum.Service); } } - Service service = createServiceWithForwardingPathForResponse(serviceId, resultMap); - return Either.left(service); + return createServiceWithForwardingPathForResponse(serviceId, resultMap); + } + + private Component getForwardingPathOriginComponent() { + Either<Component, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade.getLatestByName(ForwardingPathUtils.FORWARDING_PATH_NODE_NAME); + if (forwardingPathOrigin.isRight()) { + StorageOperationStatus errorStatus = forwardingPathOrigin.right().value(); + log.debug("Failed to fetch normative forwarding path resource by tosca name, error {}", errorStatus); + throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(errorStatus)); + } + return forwardingPathOrigin.left().value(); + } + + private void populateForwardingPaths(String serviceId, boolean isUpdate, Map<String, ForwardingPathDataDefinition> trimmedForwardingPaths, Map<String, ForwardingPathDataDefinition> resultMap) { + Either<ForwardingPathDataDefinition, StorageOperationStatus> result; + try { + for (ForwardingPathDataDefinition forwardingPathDataDefinition : trimmedForwardingPaths.values()) { + if (isUpdate) { + result = forwardingPathOperation.updateForwardingPath(serviceId, forwardingPathDataDefinition); + } else { + result = forwardingPathOperation.addForwardingPath(serviceId, forwardingPathDataDefinition); + } + if (result.isRight()) { + janusGraphDao.rollback(); + throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat( + componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE), + "")); + } else { + ForwardingPathDataDefinition fpDataDefinition = result.left().value(); + resultMap.put(fpDataDefinition.getUniqueId(), forwardingPathDataDefinition); + } + } + + } catch (ComponentException e) { + janusGraphDao.rollback(); + log.error("Exception occurred during add or update forwarding path property values: {}", + e.getMessage(), e); + throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR); + } } private Service createServiceWithForwardingPathForResponse(String serviceId, Map<String,ForwardingPathDataDefinition> forwardingPathDataDefinitionMap) { @@ -1324,6 +1281,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { verifyValuesAreIdentical(serviceUpdate.getUUID(), currentService.getUUID(), "uuid"); validateAndUpdateServiceType(currentService, serviceUpdate); + validateAndUpdateServiceFunction(currentService, serviceUpdate); response = validateAndUpdateServiceRole(user, currentService, serviceUpdate, UPDATE_SERVICE_METADATA); if (response.isRight()) { @@ -1363,7 +1321,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { currentService.setEcompGeneratedNaming(isEcompGeneratedUpdate); } String namingPolicyUpdate = serviceUpdate.getNamingPolicy(); - if (currentService.isEcompGeneratedNaming()) { + if (currentService.isEcompGeneratedNaming() != null && currentService.isEcompGeneratedNaming()) { currentService.setNamingPolicy(namingPolicyUpdate); } else { if (!StringUtils.isEmpty(namingPolicyUpdate)) { @@ -1377,7 +1335,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String contactIdUpdated = serviceUpdate.getContactId(); String contactIdCurrent = currentService.getContactId(); if (!contactIdCurrent.equals(contactIdUpdated)) { - validateContactId(user, serviceUpdate, audatingAction); + componentContactIdValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); currentService.setContactId(contactIdUpdated.toLowerCase()); } return Either.left(true); @@ -1393,7 +1351,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } if (!(tagsCurrent.containsAll(tagsUpdated) && tagsUpdated.containsAll(tagsCurrent))) { - validateTagsListAndRemoveDuplicates(user, serviceUpdate, audatingAction); + componentTagsValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); currentService.setTags(tagsUpdated); } return Either.left(true); @@ -1403,7 +1361,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String descriptionUpdated = serviceUpdate.getDescription(); String descriptionCurrent = currentService.getDescription(); if (!descriptionCurrent.equals(descriptionUpdated)) { - validateDescriptionAndCleanup(user, serviceUpdate, audatingAction); + componentDescriptionValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); currentService.setDescription(serviceUpdate.getDescription()); } return Either.left(true); @@ -1412,11 +1370,13 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { private Either<Boolean, ResponseFormat> validateAndUpdateProjectCode(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) { String projectCodeUpdated = serviceUpdate.getProjectCode(); String projectCodeCurrent = currentService.getProjectCode(); - if (!projectCodeCurrent.equals(projectCodeUpdated)) { + if (StringUtils.isEmpty(projectCodeCurrent) + || !projectCodeCurrent.equals(projectCodeUpdated)) { - Either<Boolean, ResponseFormat> validatProjectCodeResponse = validateProjectCode(user, serviceUpdate, audatingAction); - if (validatProjectCodeResponse.isRight()) { - ResponseFormat errorRespons = validatProjectCodeResponse.right().value(); + try { + componentProjectCodeValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); + } catch (ComponentException exp) { + ResponseFormat errorRespons = exp.getResponseFormat(); return Either.right(errorRespons); } currentService.setProjectCode(projectCodeUpdated); @@ -1430,7 +1390,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String iconCurrent = currentService.getIcon(); if (!iconCurrent.equals(iconUpdated)) { if (!hasBeenCertified) { - validateIcon(user, serviceUpdate, audatingAction); + componentIconValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); currentService.setIcon(iconUpdated); } else { log.info("icon {} cannot be updated once the service has been certified once.", iconUpdated); @@ -1446,10 +1406,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String serviceNameCurrent = currentService.getName(); if (!serviceNameCurrent.equals(serviceNameUpdated)) { if (!hasBeenCertified) { - validateComponentName(user, serviceUpdate, auditingAction); - Either<Boolean, ResponseFormat> serviceNameUniquenessValidation = validateComponentNameUnique(user, serviceUpdate, auditingAction); - if (serviceNameUniquenessValidation.isRight()) { - return serviceNameUniquenessValidation; + componentNameValidator.validateAndCorrectField(user, serviceUpdate, auditingAction); + try { + componentNameValidator.validateComponentNameUnique(user, serviceUpdate, auditingAction); + } catch (ComponentException exp) { + return Either.right(exp.getResponseFormat()); } currentService.setName(serviceNameUpdated); currentService.getComponentMetadataDefinition().getMetadataDataDefinition().setNormalizedName(ValidationUtils.normaliseComponentName(serviceNameUpdated)); @@ -1468,34 +1429,17 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String updatedServiceType = updatedService.getServiceType(); String currentServiceType = currentService.getServiceType(); if (!currentServiceType.equals(updatedServiceType)) { - validateServiceTypeAndCleanup(updatedService); + serviceTypeValidator.validateAndCorrectField(null, updatedService, null); currentService.setServiceType(updatedServiceType); } } - private void validateServiceTypeAndCleanup(Component component) { - log.debug("validate service type"); - String serviceType = ((Service)component).getServiceType(); - if (serviceType == null) { - log.info("service type is not valid."); - throw new ByActionStatusComponentException(ActionStatus.INVALID_SERVICE_TYPE); - } - serviceType = cleanUpText(serviceType); - validateServiceType(serviceType); - } - - - private void validateServiceType(String serviceType) { - if (serviceType.isEmpty()) { - return; - } - if (!ValidationUtils.validateServiceTypeLength(serviceType)) { - log.info("service type exceeds limit."); - throw new ByActionStatusComponentException(ActionStatus.SERVICE_TYPE_EXCEEDS_LIMIT, "" + ValidationUtils.SERVICE_TYPE_MAX_LENGTH); - } - if (!ValidationUtils.validateIsEnglish(serviceType)) { - log.info("service type is not valid."); - throw new ByActionStatusComponentException(ActionStatus.INVALID_SERVICE_TYPE); + private void validateAndUpdateServiceFunction(Service currentService, Service updatedService) { + String updatedServiceFunction = updatedService.getServiceFunction(); + String currentServiceFunction = currentService.getServiceFunction(); + if (!currentServiceFunction.equals(updatedServiceFunction)) { + serviceFunctionValidator.validateAndCorrectField(null, updatedService, null); + currentService.setServiceFunction(updatedService.getServiceFunction()); } } @@ -1503,9 +1447,10 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { String updatedServiceRole = updatedService.getServiceRole(); String currentServiceRole = currentService.getServiceRole(); if (!currentServiceRole.equals(updatedServiceRole)) { - Either<Boolean, ResponseFormat> validateServiceRole = validateServiceRoleAndCleanup(user, updatedService , auditingAction); - if (validateServiceRole.isRight()) { - ResponseFormat errorResponse = validateServiceRole.right().value(); + try { + serviceRoleValidator.validateAndCorrectField(user, updatedService, auditingAction); + } catch (ComponentException exp) { + ResponseFormat errorResponse = exp.getResponseFormat(); componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction, ComponentTypeEnum.SERVICE); return Either.right(errorResponse); } @@ -1514,31 +1459,14 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.left(true); } - protected Either<Boolean, ResponseFormat> validateServiceRoleAndCleanup(User user, Component component, AuditingActionEnum actionEnum) { - log.debug("validate service role"); - String serviceRole = ((Service)component).getServiceRole(); - if (serviceRole != null){ - serviceRole = cleanUpText(serviceRole); - - Either<Boolean, ResponseFormat> validateServiceRole = validateServiceRole(serviceRole); - if (validateServiceRole.isRight()) { - ResponseFormat responseFormat = validateServiceRole.right().value(); - componentsUtils.auditComponentAdmin(responseFormat, user, component, actionEnum, ComponentTypeEnum.SERVICE); - return Either.right(responseFormat); - } - return Either.left(true); - } else { - return Either.left(false); - } - } - private Either<Boolean, ResponseFormat> validateAndUpdateInstantiationTypeValue(User user, Service currentService, Service updatedService, AuditingActionEnum auditingAction) { String updatedInstaType= updatedService.getInstantiationType(); String currentInstaType = currentService.getInstantiationType(); if (!currentInstaType.equals(updatedInstaType)) { - Either<Boolean, ResponseFormat> validateInstantiationType = validateInstantiationTypeValue(user, updatedService , auditingAction); - if (validateInstantiationType.isRight()) { - ResponseFormat errorResponse = validateInstantiationType.right().value(); + try { + serviceInstantiationTypeValidator.validateAndCorrectField(user, updatedService, auditingAction); + } catch (ComponentException exp) { + ResponseFormat errorResponse = exp.getResponseFormat(); componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction, ComponentTypeEnum.SERVICE); return Either.right(errorResponse); } @@ -1547,95 +1475,27 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.left(true); } - private Either<Boolean, ResponseFormat> validateInstantiationTypeValue(User user, Service service, AuditingActionEnum actionEnum) { - log.debug("validate instantiation type"); - String instantiationType = service.getInstantiationType(); - if (!InstantiationTypes.containsName(instantiationType) || instantiationType == null){ - log.error("Recieved Instantiation type {} is not valid.", instantiationType); - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_INSTANTIATION_TYPE); - componentsUtils.auditComponentAdmin(errorResponse, user, service, actionEnum, ComponentTypeEnum.SERVICE); - return Either.right(errorResponse); - } - return Either.left(true); - } - - private Either<Boolean, ResponseFormat> validateServiceRole(String serviceRole) { - if (serviceRole.equals("")){ - return Either.left(true); - } else { - if (!ValidationUtils.validateServiceRoleLength(serviceRole)) { - log.info("service role exceeds limit."); - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_ROLE_EXCEEDS_LIMIT, "" + ValidationUtils.SERVICE_ROLE_MAX_LENGTH); - return Either.right(errorResponse); - } - - if (!ValidationUtils.validateIsEnglish(serviceRole)) { - log.info("service role is not valid."); - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_SERVICE_ROLE); - return Either.right(errorResponse); - } - return Either.left(true); - } - } - private Either<Boolean, ResponseFormat> validateAndUpdateCategory(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) { - List<CategoryDefinition> categoryUpdated = serviceUpdate.getCategories(); - List<CategoryDefinition> categoryCurrent = currentService.getCategories(); - Either<Boolean, ResponseFormat> validateCategoryResponse = validateServiceCategory(user, serviceUpdate, audatingAction); - if (validateCategoryResponse.isRight()) { - return Either.right(validateCategoryResponse.right().value()); - } - if (!categoryCurrent.get(0).getName().equals(categoryUpdated.get(0).getName())) { - if (!hasBeenCertified) { - currentService.setCategories(categoryUpdated); - } else { - log.info("category {} cannot be updated once the service has been certified once.", categoryUpdated); - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CATEGORY_CANNOT_BE_CHANGED); - return Either.right(errorResponse); + try { + List<CategoryDefinition> categoryUpdated = serviceUpdate.getCategories(); + List<CategoryDefinition> categoryCurrent = currentService.getCategories(); + serviceCategoryValidator.validateAndCorrectField(user, serviceUpdate, audatingAction); + if (!categoryCurrent.get(0).getName().equals(categoryUpdated.get(0).getName())) { + if (!hasBeenCertified) { + currentService.setCategories(categoryUpdated); + } else { + log.info("category {} cannot be updated once the service has been certified once.", categoryUpdated); + ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CATEGORY_CANNOT_BE_CHANGED); + return Either.right(errorResponse); + } } + } catch (ComponentException exp) { + return Either.right(exp.getResponseFormat()); } return Either.left(true); } - private Either<Boolean, ResponseFormat> validateServiceCategory(List<CategoryDefinition> list) { - if (list != null) { - if (list.size() > 1) { - log.debug("Must be only one category for service"); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES, ComponentTypeEnum.SERVICE.getValue()); - return Either.right(responseFormat); - } - CategoryDefinition category = list.get(0); - if (category.getSubcategories() != null) { - log.debug("Subcategories cannot be defined for service"); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CANNOT_CONTAIN_SUBCATEGORY); - return Either.right(responseFormat); - } - if (!ValidationUtils.validateStringNotEmpty(category.getName())) { - log.debug("Resource category is empty"); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.SERVICE.getValue()); - return Either.right(responseFormat); - } - - log.debug("validating service category {} against valid categories list", list); - Either<List<CategoryDefinition>, ActionStatus> categorys = elementDao.getAllServiceCategories(); - if (categorys.isRight()) { - log.debug("failed to retrieve service categories from JanusGraph"); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(categorys.right().value()); - return Either.right(responseFormat); - } - List<CategoryDefinition> categoryList = categorys.left().value(); - for (CategoryDefinition value : categoryList) { - if (value.getName().equals(category.getName())) { - return Either.left(true); - } - } - log.debug("Category {} is not part of service category group. Service category valid values are {}", list, categoryList); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CATEGORY, ComponentTypeEnum.SERVICE.getValue())); - } - return Either.left(false); - } - public Either<ServiceRelations, ResponseFormat> getServiceComponentsRelations(String serviceId, User user) { Either<Service, ResponseFormat> serviceResponseFormatEither = getService(serviceId, user); if (serviceResponseFormatEither.isRight()){ @@ -1649,9 +1509,8 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public ResponseFormat deleteService(String serviceId, User user) { ResponseFormat responseFormat; - String ecompErrorContext = "delete service"; - validateUserExists(user, ecompErrorContext, false); + validateUserExists(user); Either<Service, StorageOperationStatus> serviceStatus = toscaOperationFacade.getToscaElement(serviceId); if (serviceStatus.isRight()) { log.debug("failed to get service {}", serviceId); @@ -1661,21 +1520,20 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { Service service = serviceStatus.left().value(); StorageOperationStatus result = StorageOperationStatus.OK; - Either<Boolean, ResponseFormat> lockResult = lockComponent(service, "Mark service to delete"); - if (lockResult.isRight()) { - return lockResult.right().value(); - } try { + lockComponent(service, "Mark service to delete"); result = markComponentToDelete(service); - if (result.equals(StorageOperationStatus.OK)) { + if (result == StorageOperationStatus.OK) { responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT); } else { ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result); responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, service.getName()); } return responseFormat; - } finally { - if (result == null || !result.equals(StorageOperationStatus.OK)) { + }catch (ComponentException e){ + return e.getResponseFormat(); + }finally { + if (result == null || result != StorageOperationStatus.OK) { log.warn("operation failed. do rollback"); BeEcompErrorManager.getInstance().logBeSystemError("Delete Service"); janusGraphDao.rollback(); @@ -1691,7 +1549,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { ResponseFormat responseFormat; String ecompErrorContext = "delete service"; validateUserNotEmpty(user, ecompErrorContext); - user = validateUserExists(user, ecompErrorContext, false); + user = validateUserExists(user); Either<Service, ResponseFormat> getResult = getServiceByNameAndVersion(serviceName, version, user.getUserId()); if (getResult.isRight()) { @@ -1700,15 +1558,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { Service service = getResult.left().value(); StorageOperationStatus result = StorageOperationStatus.OK; - Either<Boolean, ResponseFormat> lockResult = lockComponent(service, "Mark service to delete"); - if (lockResult.isRight()) { - result = StorageOperationStatus.GENERAL_ERROR; - return componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR); - } try { + lockComponent(service, "Mark service to delete"); result = markComponentToDelete(service); - if (result.equals(StorageOperationStatus.OK)) { + if (result == StorageOperationStatus.OK) { responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT); } else { ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result); @@ -1716,8 +1570,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } return responseFormat; - } finally { - if (result == null || !result.equals(StorageOperationStatus.OK)) { + }catch (ComponentException e){ + result = StorageOperationStatus.GENERAL_ERROR; + return componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR); + }finally { + if (result == null || result != StorageOperationStatus.OK) { log.warn("operation failed. do rollback"); BeEcompErrorManager.getInstance().logBeSystemError("Delete Service"); janusGraphDao.rollback(); @@ -1732,7 +1589,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public Either<Service, ResponseFormat> getService(String serviceId, User user) { String ecompErrorContext = "Get service"; validateUserNotEmpty(user, ecompErrorContext); - validateUserExists(user, ecompErrorContext, false); + validateUserExists(user); Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId); if (storageStatus.isRight()) { @@ -1752,7 +1609,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } public Either<Service, ResponseFormat> getServiceByNameAndVersion(String serviceName, String serviceVersion, String userId) { - validateUserExists(userId, "get Service By Name And Version", false); + validateUserExists(userId); Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.SERVICE, serviceName, serviceVersion); if (storageStatus.isRight()) { log.debug("failed to get service by name {} and version {}", serviceName, serviceVersion); @@ -1812,28 +1669,24 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return artifactInfo; } - private Either<DistributionTransitionEnum, ResponseFormat> validateTransitionEnum(String distributionTransition) { - DistributionTransitionEnum transitionEnum = null; + private DistributionTransitionEnum validateTransitionEnum(String distributionTransition) { + DistributionTransitionEnum transitionEnum; transitionEnum = DistributionTransitionEnum.getFromDisplayName(distributionTransition); if (transitionEnum == null) { BeEcompErrorManager.getInstance().logBeSystemError(CHANGE_SERVICE_DISTRIBUTION); log.info("state operation is not valid. operations allowed are: {}", DistributionTransitionEnum.valuesAsString()); - ResponseFormat error = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR); - return Either.right(error); + throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_DISTRIBUTION_STATUS, distributionTransition)); } - return Either.left(transitionEnum); + return transitionEnum; } - private Either<String, ResponseFormat> validateComment(LifecycleChangeInfoWithAction comment) { - String data = comment.getUserRemarks(); - - if (data == null || data.trim().isEmpty()) { - BeEcompErrorManager.getInstance().logBeInvalidJsonInput(CHANGE_SERVICE_DISTRIBUTION); - log.debug("user comment cannot be empty or null."); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)); + private String validateComment(LifecycleChangeInfoWithAction comment) { + if (comment==null || StringUtils.isEmpty(comment.getUserRemarks())) { + return ""; } + String data = comment.getUserRemarks(); data = ValidationUtils.removeNoneUtf8Chars(data); data = ValidationUtils.removeHtmlTags(data); data = ValidationUtils.normaliseWhitespace(data); @@ -1842,45 +1695,13 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { if (!ValidationUtils.validateLength(data, ValidationUtils.COMMENT_MAX_LENGTH)) { BeEcompErrorManager.getInstance().logBeInvalidJsonInput(CHANGE_SERVICE_DISTRIBUTION); log.debug("user comment exceeds limit."); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment", String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH))); + throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment", String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH))); } - if (!ValidationUtils.validateIsEnglish(data)) { - return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)); - } - return Either.left(data); - } - - private Either<Service, ResponseFormat> validateServiceDistributionChange(User user, String serviceId, AuditingActionEnum auditAction, String comment) { - Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId); - if (storageStatus.isRight()) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId); - log.debug(AUDIT_BEFORE_SENDING_RESPONSE); - componentsUtils.auditComponent(responseFormat, user, auditAction, new ResourceCommonInfo(serviceId, ComponentTypeEnum.SERVICE.getValue()), comment); - return Either.right(responseFormat); + if (!ValidationUtils.validateCommentPattern(data)) { + throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)); } - Service service = storageStatus.left().value(); - if (service.getLifecycleState() != LifecycleStateEnum.CERTIFIED) { - log.info("service {} is not available for distribution. Should be in certified state", service.getUniqueId()); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(), service.getName()); - createAudit(user, auditAction, comment, service, responseFormat); - return Either.right(responseFormat); - } - return Either.left(service); - } - - private Either<User, ResponseFormat> validateUserDistributionChange(User user, Service service, AuditingActionEnum auditAction, String comment) { - log.debug("get user from DB"); - - // get user details - user = validateUser(user, "Activate Distribution", service, auditAction, false); - // validate user role - List<Role> roles = new ArrayList<>(); - roles.add(Role.ADMIN); - roles.add(Role.GOVERNOR); - roles.add(Role.OPS); - validateUserRole(user, service, roles, auditAction, comment); - return Either.left(user); + return data; } private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat) { @@ -1931,10 +1752,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public Either<Service, ResponseFormat> activateDistribution(String serviceId, String envName, User modifier, HttpServletRequest request) { - User user = validateUserExists(modifier.getUserId(), "activate Distribution", false); - Either<Service, ResponseFormat> result = null; - ResponseFormat response = null; - Service updatedService = null; + User user = validateUserExists(modifier.getUserId()); + validateUserRole(user, Collections.singletonList(Role.DESIGNER)); + Either<Service, ResponseFormat> result; + ResponseFormat response; + Service updatedService; String did = ThreadLocalsHolder.getUuid(); // DE194021 String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getEnvironments().get(0); @@ -1965,10 +1787,19 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.right(response); } Service service = serviceRes.left().value(); + if (service.isArchived()) { + log.info("Component is archived. Component id: {}", serviceId); + return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, service.getName())); + } + if (service.getLifecycleState() != LifecycleStateEnum.CERTIFIED) { + log.info("service {} is not available for distribution. Should be in certified state", service.getUniqueId()); + ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(), service.getName()); + return Either.right(responseFormat); + } String dcurrStatus = service.getDistributionStatus().name(); String updatedStatus = dcurrStatus; StorageOperationStatus readyForDistribution = distributionEngine.isReadyForDistribution(envName); - if (readyForDistribution.equals(StorageOperationStatus.OK)) { + if (readyForDistribution == StorageOperationStatus.OK) { INotificationData notificationData = distributionEngine.buildServiceForDistribution(service, did, null); ActionStatus notifyServiceResponse = distributionEngine.notifyService(did, service, notificationData, envName, user); if (notifyServiceResponse == ActionStatus.OK) { @@ -1990,7 +1821,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { result = Either.right(response); } } else { - response = componentsUtils.getResponseFormatByDE(componentsUtils.convertFromStorageResponse(readyForDistribution), envName); + response = componentsUtils.getResponseFormatByDE(componentsUtils.convertFromStorageResponse(readyForDistribution, ComponentTypeEnum.SERVICE), envName); result = Either.right(response); } componentsUtils.auditComponent(response, user, service, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST, @@ -2008,13 +1839,10 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { // convert to private after deletion of temp url public Either<Service, ResponseFormat> updateDistributionStatusForActivation(Service service, User user, DistributionStatusEnum state) { - validateUserExists(user.getUserId(), "update Distribution Status For Activation", false); + validateUserExists(user.getUserId()); String serviceId = service.getUniqueId(); - Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, service, "updateDistributionStatusForActivation"); - if (lockResult.isRight()) { - return Either.right(lockResult.right().value()); - } + lockComponent(serviceId, service, "updateDistributionStatusForActivation"); try { Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, state); if (result.isRight()) { @@ -2024,6 +1852,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); } janusGraphDao.commit(); + updateCatalog(service, ChangeTypeEnum.LIFECYCLE); return Either.left(result.left().value()); } finally { graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service); @@ -2032,7 +1861,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public Either<Service, ResponseFormat> markDistributionAsDeployed(String serviceId, String did, User user) { - validateUserExists(user.getUserId(), "mark Distribution As Deployed", false); + validateUserExists(user.getUserId()); log.debug("mark distribution deployed"); AuditingActionEnum auditAction = AuditingActionEnum.DISTRIBUTION_DEPLOY; @@ -2172,13 +2001,14 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } vfModuleArtifactDefinition.setArtifactChecksum(newCheckSum); - Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent = artifactToscaOperation.addArifactToComponent(vfModuleArtifactDefinition, service.getUniqueId(), NodeTypeEnum.ResourceInstance, true, currVF.getUniqueId()); + Either<ArtifactDefinition, StorageOperationStatus> addArtifactToComponent = artifactToscaOperation.addArtifactToComponent( + vfModuleArtifactDefinition, service, NodeTypeEnum.ResourceInstance, true, currVF.getUniqueId()); Either<ArtifactDefinition, ResponseFormat> result; - if (addArifactToComponent.isLeft()) { - result = Either.left(addArifactToComponent.left().value()); + if (addArtifactToComponent.isLeft()) { + result = Either.left(addArtifactToComponent.left().value()); } else { - result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addArifactToComponent.right().value()))); + result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addArtifactToComponent.right().value()))); } return result; @@ -2205,19 +2035,8 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { if (service.getComponentInstances() != null) { List<ArtifactGenerator<CallVal>> artifactGenList = service.getComponentInstances().stream().flatMap(ri -> artifactTaskGeneratorCreator.apply(ri).stream()).collect(Collectors.toList()); if (artifactGenList != null && !artifactGenList.isEmpty()) { - for (ArtifactGenerator<CallVal> entry : artifactGenList) { - Either<CallVal, ResponseFormat> callRes; - try { - callRes = entry.call(); - if (callRes.isRight()) { - log.debug("Failed to generate artifact error : {}", callRes.right().value()); - return Either.right(callRes.right().value()); - } - } catch (Exception e) { - log.debug("Failed to generate artifact exception : {}", e); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); - } - } + Either<Service, ResponseFormat> callRes = checkDeploymentArtifact(artifactGenList); + if (callRes != null) return callRes; } } Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaFullElement(service.getUniqueId()); @@ -2231,6 +2050,23 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } + private <CallVal> Either<Service, ResponseFormat> checkDeploymentArtifact(List<ArtifactGenerator<CallVal>> artifactGenList) { + for (ArtifactGenerator<CallVal> entry : artifactGenList) { + Either<CallVal, ResponseFormat> callRes; + try { + callRes = entry.call(); + if (callRes.isRight()) { + log.debug("Failed to generate artifact error : {}", callRes.right().value()); + return Either.right(callRes.right().value()); + } + } catch (Exception e) { + log.debug("Failed to generate artifact exception : {}", e); + return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); + } + } + return null; + } + abstract class ArtifactGenerator<CallVal> implements Callable<Either<CallVal, ResponseFormat>> { } @@ -2388,19 +2224,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } private User validateRoleForDeploy(String did, User user, AuditingActionEnum auditAction, Service service) { - Either<User, ActionStatus> eitherCreator = userAdmin.getUser(user.getUserId(), false); - if (eitherCreator.isRight() || eitherCreator.left().value() == null) { - BeEcompErrorManager.getInstance().logBeUserMissingError("Deploy Service", user.getUserId()); - log.debug("validateRoleForDeploy method - user is not listed. userId= {}", user.getUserId()); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, user.getUserId()); - auditDeployError(did, user, auditAction, service, ActionStatus.USER_NOT_FOUND); - throw new ByActionStatusComponentException(ActionStatus.USER_NOT_FOUND, user.getUserId()); - } - user = eitherCreator.left().value(); + user = userAdmin.getUser(user.getUserId()); log.debug("validate user role"); List<Role> roles = new ArrayList<>(); roles.add(Role.ADMIN); - roles.add(Role.OPS); + roles.add(Role.DESIGNER); try{ validateUserRole(user, service, roles, auditAction, null); } catch (ByActionStatusComponentException e){ @@ -2440,7 +2268,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { @Override public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, String userId) { - validateUserExists(userId, "Get Component Instances", false); + validateUserExists(userId); Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll); if (getComponentRes.isRight()) { ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentRes.right().value())); @@ -2566,7 +2394,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { private Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponent(String serviceId, User modifier) { Either<ImmutablePair<Component, User>, ResponseFormat> result = null; - Either<Component, ResponseFormat> validateComponentExistsRes = null; User currUser = null; Component component = null; Either<User, ResponseFormat> validationUserResult = validateUserIgnoreAudit(modifier, "updateGroupInstancePropertyValues"); @@ -2576,19 +2403,18 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } if (result == null) { currUser = validationUserResult.left().value(); - validateComponentExistsRes = validateComponentExists(serviceId, ComponentTypeEnum.SERVICE, null); - if (validateComponentExistsRes.isRight()) { + try { + component = validateComponentExists(serviceId, ComponentTypeEnum.SERVICE, null); + if (!ComponentValidationUtils.canWorkOnComponent(component, currUser.getUserId())) { + log.info("#validateUserAndComponent - Restricted operation for user: {}, on service: {}", currUser.getUserId(), component.getCreatorUserId()); + return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION)); + } + } catch (ComponentException e) { log.debug("#validateUserAndComponent - Failed to validate service existing {}. ", serviceId); - result = Either.right(validateComponentExistsRes.right().value()); - } - } - if (result == null) { - component = validateComponentExistsRes.left().value(); - if (!ComponentValidationUtils.canWorkOnComponent(component, currUser.getUserId())) { - log.info("#validateUserAndComponent - Restricted operation for user: {}, on service: {}", currUser.getUserId(), component.getCreatorUserId()); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION)); + result = Either.right(e.getResponseFormat()); } } + if (result == null) { result = Either.left(new ImmutablePair<>(component, currUser)); } @@ -2641,7 +2467,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { Either<Service, StorageOperationStatus> serviceResultEither = toscaOperationFacade.getToscaElement(serviceId, paramsToReturn); if (serviceResultEither.isRight()) { - if(serviceResultEither.right().value().equals(StorageOperationStatus.NOT_FOUND)) { + if(serviceResultEither.right().value() == StorageOperationStatus.NOT_FOUND) { log.debug("#getUiComponentDataTransferByComponentId - Failed to find service with id {} ", serviceId); return Either.right(componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId)); } @@ -2661,11 +2487,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } public Either<String, ResponseFormat> deleteIfNotAlreadyDeletedServiceFilter(String serviceId, String resourceId, String userId, boolean lock) { - Service serviceToDelete = initServiceToDeleteServiceFilter(serviceId); - User user = validateUserExists(userId, "Create service Filter", false); - - user = - validateUser(user, "deleteIfNotAlreadyDeletedServiceFilter", serviceToDelete, null, false); + validateUserExists(userId); Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId); if (storageStatus.isRight()) { @@ -2687,15 +2509,10 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } Either<String, StorageOperationStatus> result; - if (lock) { - Either<Boolean, ResponseFormat> lockResult = lockComponent(service.getUniqueId(), service, "Delete Service Filter from service"); - if (lockResult.isRight()) { - janusGraphDao.rollback(); - return Either.right(componentsUtils.getResponseFormat(componentsUtils - .convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), "")); - } - } 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()); @@ -2716,16 +2533,9 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { } - private Service initServiceToDeleteServiceFilter(String serviceId) { - Service serviceToDelete = new Service(); - serviceToDelete.setUniqueId(serviceId); - return serviceToDelete; - } - - public Either<CINodeFilterDataDefinition, ResponseFormat> createIfNotAlreadyExistServiceFilter(String serviceId, String componentInstanceId, String userId, boolean lock) { String errorContext = "createIfNotAlreadyExistServiceFilter"; - User user = validateUserExists(userId, "Create service Filter", false); + User user = validateUserExists(userId); Either<Service, StorageOperationStatus> serviceEither = toscaOperationFacade.getToscaElement(serviceId); if (serviceEither.isRight()) { @@ -2743,21 +2553,11 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { if (serviceFilter != null){ return Either.left(serviceFilter); } - - Either<CINodeFilterDataDefinition, StorageOperationStatus> result; - - Either<Boolean, ResponseFormat> lockResult = null; if (lock) { - lockResult = - lockComponent(service.getUniqueId(), service, "Create Service Filter"); - if (lockResult.isRight()) { - log.debug("Failed to lock service {}. Response is {}. ", service.getName(), - lockResult.right().value().getFormattedMessage()); - return Either.right(lockResult.right().value()); - } else { - log.debug("The service with system name {} locked. ", service.getSystemName()); - } + lockComponent(service.getUniqueId(), service, "Create Service Filter"); } + Either<CINodeFilterDataDefinition, StorageOperationStatus> result; + CINodeFilterDataDefinition serviceFilterResult; try { result = serviceFilterOperation.createNodeFilter(serviceId, componentInstanceId); @@ -2778,9 +2578,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); } finally { - if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) { - graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service); - } + graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service); } return Either.left(serviceFilterResult); } @@ -2788,8 +2586,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public Either<CINodeFilterDataDefinition, ResponseFormat> updateServiceFilter(String serviceId, String componentInstanceId, List<String> constraints, User inUser, boolean lock) { - String errorContext = "createIfNotAlreadyExistServiceFilter"; - User user = validateUserExists(inUser, errorContext, true); + User user = validateUserExists(inUser.getUserId()); validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN)); Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId); @@ -2810,15 +2607,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { Either<Boolean, ResponseFormat> lockResult = null; if (lock) { - lockResult = - lockComponent(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service"); - if (lockResult.isRight()) { - log.debug("Failed to lock service {}. Response is {}. ", storedService.getName(), - lockResult.right().value().getFormattedMessage()); - return Either.right(lockResult.right().value()); - } else { - log.debug("The service with system name {} locked. ", storedService.getSystemName()); - } + lockComponent(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service"); } Optional<ComponentInstance> componentInstanceOptional = storedService.getComponentInstanceById(componentInstanceId); if (!componentInstanceOptional.isPresent()){ @@ -2865,8 +2654,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { public Either<CINodeFilterDataDefinition, ResponseFormat> addOrDeleteServiceFilter(String serviceId, String componentInstanceId, NodeFilterConstraintAction action, String propertyName, String constraint, int position, User inUser, boolean lock) { - String errorContext = "createIfNotAlreadyExistServiceFilter"; - User user = validateUserExists(inUser, errorContext, true); + User user = validateUserExists(inUser.getUserId()); validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN)); Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId); @@ -2891,24 +2679,16 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { CINodeFilterDataDefinition serviceFilterResult = null; try { if (lock) { - lockResult = - lockComponent(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service"); - if (lockResult.isRight()) { - log.debug("Failed to lock service {}. Response is {}. ", storedService.getName(), - lockResult.right().value().getFormattedMessage()); - return Either.right(lockResult.right().value()); - } else { - log.debug("The service with system name {} locked. ", storedService.getSystemName()); - } + 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)); + 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)); + if (serviceFilter == null) { + return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND)); } @@ -2917,13 +2697,13 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic { RequirementNodeFilterPropertyDataDefinition newProperty = new RequirementNodeFilterPropertyDataDefinition(); newProperty.setName(propertyName); newProperty.setConstraints(Collections.singletonList(constraint)); - result = serviceFilterOperation.addNewProperty(serviceId, componentInstanceId,serviceFilter,newProperty); + result = serviceFilterOperation.addNewProperty(serviceId, componentInstanceId, serviceFilter, newProperty); break; case DELETE: result = serviceFilterOperation.deleteConstraint(serviceId, componentInstanceId, serviceFilter, position); break; default: - log.error("Unsupported operation "+action); + log.error("Unsupported operation " + action); return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); } |