diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle')
8 files changed, 485 insertions, 535 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationChangeTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationChangeTransition.java index 445b3a9750..0e0f6f9464 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationChangeTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationChangeTransition.java @@ -21,27 +21,25 @@ package org.openecomp.sdc.be.components.lifecycle; import java.util.Arrays; -import java.util.List; - import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; -import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; -import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; -import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.User; -import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; -import org.openecomp.sdc.be.model.operations.impl.ResourceOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; -import org.openecomp.sdc.common.config.EcompErrorName; import org.openecomp.sdc.exception.ResponseFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,8 +55,8 @@ public class CertificationChangeTransition extends LifeCycleTransition { private AuditingActionEnum auditingAction; private ArtifactsBusinessLogic artifactsManager; - public CertificationChangeTransition(LifeCycleTransitionEnum name, ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { - super(componentUtils, lifecycleOperation); + public CertificationChangeTransition(LifeCycleTransitionEnum name, ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); this.name = name; @@ -67,7 +65,11 @@ public class CertificationChangeTransition extends LifeCycleTransition { addAuthorizedRoles(ComponentTypeEnum.RESOURCE, Arrays.asList(certificationChangeRoles)); addAuthorizedRoles(ComponentTypeEnum.SERVICE, Arrays.asList(certificationChangeRoles)); // TODO to be later defined for product - + + //additional authorized roles for resource type + Role[] resourceRoles = { Role.DESIGNER}; + addResouceAuthorizedRoles(ResourceTypeEnum.VFCMT, Arrays.asList(resourceRoles)); + switch (this.name) { case CERTIFY: this.auditingAction = AuditingActionEnum.CERTIFICATION_SUCCESS_RESOURCE; @@ -106,7 +108,6 @@ public class CertificationChangeTransition extends LifeCycleTransition { } private ResponseFormat formatCertificationError(Component component, StorageOperationStatus response, ComponentTypeEnum componentType) { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeDaoSystemError, "Change LifecycleState - Certify failed on graph"); BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState - Certify failed on graph"); log.debug("certification change failed on graph"); @@ -118,20 +119,24 @@ public class CertificationChangeTransition extends LifeCycleTransition { @Override public Either<Boolean, ResponseFormat> validateBeforeTransition(Component component, ComponentTypeEnum componentType, User modifier, User owner, LifecycleStateEnum oldState, LifecycleChangeInfoWithAction lifecycleChangeInfo) { String componentName = component.getComponentMetadataDefinition().getMetadataDataDefinition().getName(); - log.debug("validate before certification change. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); + log.info("validate before certification change. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); - if (userValidationResponse.isRight()) { + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier,component, componentType, lifecycleChangeInfo); + if (userValidationResponse.isRight()) { + log.error("userRoleValidation failed"); return userValidationResponse; } if (!oldState.equals(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS)) { + log.error("oldState={} should be={}",oldState,ActionStatus.COMPONENT_NOT_READY_FOR_CERTIFICATION); ResponseFormat error = componentUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_READY_FOR_CERTIFICATION, componentName, componentType.name().toLowerCase()); - return Either.right(error); + return Either.right(error); } if (oldState.equals(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS) && !modifier.equals(owner) && !modifier.getRole().equals(Role.ADMIN.name())) { + log.error("oldState={} should not be={}",oldState,ActionStatus.COMPONENT_IN_CERT_IN_PROGRESS_STATE); + log.error("&& modifier({})!={} && modifier.role({})!={}",modifier,owner); ResponseFormat error = componentUtils.getResponseFormat(ActionStatus.COMPONENT_IN_CERT_IN_PROGRESS_STATE, componentName, componentType.name().toLowerCase(), owner.getFirstName(), owner.getLastName(), owner.getUserId()); return Either.right(error); } @@ -144,14 +149,13 @@ public class CertificationChangeTransition extends LifeCycleTransition { log.info("start performing certification change for resource {}", component.getUniqueId()); Either<? extends Component, ResponseFormat> result = null; - NodeTypeEnum nodeType = componentType.getNodeType(); try { - Either<? extends Component, StorageOperationStatus> certificationChangeResult = Either.right(StorageOperationStatus.GENERAL_ERROR); + Either<ToscaElement, StorageOperationStatus> certificationChangeResult = Either.right(StorageOperationStatus.GENERAL_ERROR); if (nextState.equals(LifecycleStateEnum.CERTIFIED)) { - certificationChangeResult = lifeCycleOperation.certifyComponent(nodeType, component, modifier, owner, true); + certificationChangeResult = lifeCycleOperation.certifyToscaElement(component.getUniqueId(), modifier.getUserId(), owner.getUserId()); } else { - certificationChangeResult = lifeCycleOperation.cancelOrFailCertification(nodeType, component, modifier, owner, nextState, true); + certificationChangeResult = lifeCycleOperation.cancelOrFailCertification(component.getUniqueId(), modifier.getUserId(), owner.getUserId(), nextState); } if (certificationChangeResult.isRight()) { @@ -159,51 +163,32 @@ public class CertificationChangeTransition extends LifeCycleTransition { result = Either.right(responseFormat); return result; } - + if (nextState.equals(LifecycleStateEnum.CERTIFIED)) { - Either<Boolean, StorageOperationStatus> deleteOldComponentVersions = lifeCycleOperation.deleteOldComponentVersions(nodeType, component.getComponentMetadataDefinition().getMetadataDataDefinition().getName(), - component.getComponentMetadataDefinition().getMetadataDataDefinition().getUUID(), true); + Either<Boolean, StorageOperationStatus> deleteOldComponentVersions = lifeCycleOperation.deleteOldToscaElementVersions(ModelConverter.getVertexType(component), componentType, component.getComponentMetadataDefinition().getMetadataDataDefinition().getName(), + component.getComponentMetadataDefinition().getMetadataDataDefinition().getUUID()); if (deleteOldComponentVersions.isRight()) { ResponseFormat responseFormat = formatCertificationError(component, deleteOldComponentVersions.right().value(), componentType); result = Either.right(responseFormat); - return result; } } - result = Either.left(certificationChangeResult.left().value()); + result = Either.left(ModelConverter.convertFromToscaElement(certificationChangeResult.left().value())); return result; } finally { if (result == null || result.isRight()) { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeDaoSystemError, "Change LifecycleState"); BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState"); if (inTransaction == false) { log.debug("operation failed. do rollback"); - lifeCycleOperation.getResourceOperation().getTitanGenericDao().rollback(); + titanDao.rollback(); } } else { if (inTransaction == false) { log.debug("operation success. do commit"); - lifeCycleOperation.getResourceOperation().getTitanGenericDao().commit(); + titanDao.commit(); } } } } - - public StorageOperationStatus deleteOldVersion(List<ArtifactDefinition> artifactsToDelete, Resource resourceToDelete) { - ResourceOperation resourceOperation = lifeCycleOperation.getResourceOperation(); - - Either<List<ArtifactDefinition>, StorageOperationStatus> artifactsRes = resourceOperation.getComponentArtifactsForDelete(resourceToDelete.getUniqueId(), NodeTypeEnum.Resource, true); - if (artifactsRes.isRight()) { - return artifactsRes.right().value(); - } - Either<Resource, StorageOperationStatus> deleteResourceRes = resourceOperation.deleteResource(resourceToDelete.getUniqueId(), true); - if (deleteResourceRes.isRight()) { - return deleteResourceRes.right().value(); - } - artifactsToDelete.addAll(artifactsRes.left().value()); - - return StorageOperationStatus.OK; - } - } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationRequestTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationRequestTransition.java index 69a9cbdb24..042af54383 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationRequestTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CertificationRequestTransition.java @@ -29,10 +29,14 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import org.apache.commons.codec.binary.Base64; import org.openecomp.sdc.be.components.distribution.engine.ServiceDistributionArtifactsBuilder; +import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic; +import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum; @@ -50,13 +54,20 @@ import org.openecomp.sdc.be.model.RequirementCapabilityRelDef; 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.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation; import org.openecomp.sdc.be.model.operations.impl.ResourceOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; +import org.openecomp.sdc.be.tosca.ToscaError; import org.openecomp.sdc.be.tosca.ToscaExportHandler; +import org.openecomp.sdc.be.tosca.ToscaRepresentation; import org.openecomp.sdc.be.user.Role; +import org.openecomp.sdc.common.api.ArtifactTypeEnum; import org.openecomp.sdc.common.util.ValidationUtils; import org.openecomp.sdc.exception.ResponseFormat; import org.slf4j.Logger; @@ -68,15 +79,11 @@ public class CertificationRequestTransition extends LifeCycleTransition { private static Logger log = LoggerFactory.getLogger(CertificationRequestTransition.class.getName()); - private ServiceDistributionArtifactsBuilder serviceDistributionArtifactsBuilder; - private ResourceOperation resourceOperation; private CapabilityOperation capabilityOperation; private ServiceBusinessLogic serviceBusinessLogic; - private ToscaExportHandler toscaExportUtils; - - public CertificationRequestTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation, ServiceDistributionArtifactsBuilder serviceDistributionArtifactsBuilder, ServiceBusinessLogic serviceBusinessLogic, - CapabilityOperation capabilityOperation, ToscaExportHandler toscaExportUtils) { - super(componentUtils, lifecycleOperation); + public CertificationRequestTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ServiceDistributionArtifactsBuilder serviceDistributionArtifactsBuilder, ServiceBusinessLogic serviceBusinessLogic, + CapabilityOperation capabilityOperation, ToscaExportHandler toscaExportUtils, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); // authorized roles Role[] resourceServiceCheckoutRoles = { Role.ADMIN, Role.DESIGNER }; @@ -87,13 +94,13 @@ public class CertificationRequestTransition extends LifeCycleTransition { // TODO to be later defined for product // addAuthorizedRoles(ComponentTypeEnum.PRODUCT, // Arrays.asList(productCheckoutRoles)); + + //additional authorized roles for resource type + Role[] resourceRoles = { Role.TESTER}; + addResouceAuthorizedRoles(ResourceTypeEnum.VFCMT, Arrays.asList(resourceRoles)); - this.serviceDistributionArtifactsBuilder = serviceDistributionArtifactsBuilder; - if (lifeCycleOperation != null) - this.resourceOperation = lifeCycleOperation.getResourceOperation(); this.serviceBusinessLogic = serviceBusinessLogic; this.capabilityOperation = capabilityOperation; - this.toscaExportUtils = toscaExportUtils; } @Override @@ -125,7 +132,7 @@ public class CertificationRequestTransition extends LifeCycleTransition { private ResponseFormat getRelevantResponseFormatUncertifiedRI(ComponentInstance nonCertifiedRI, ComponentTypeEnum componentType) { ResponseFormat responseFormat; - Either<Resource, StorageOperationStatus> eitherResource = resourceOperation.getResource(nonCertifiedRI.getComponentUid()); + Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(nonCertifiedRI.getComponentUid()); if (eitherResource.isRight()) { responseFormat = componentUtils.getResponseFormat(ActionStatus.GENERAL_ERROR); @@ -133,16 +140,16 @@ public class CertificationRequestTransition extends LifeCycleTransition { } else { ActionStatus actionStatus; Resource resource = eitherResource.left().value(); - Either<List<Resource>, StorageOperationStatus> status = resourceOperation.findLastCertifiedResourceByUUID(resource); + Either<Resource, StorageOperationStatus> status = toscaOperationFacade.findLastCertifiedToscaElementByUUID(resource); if (ValidationUtils.validateMinorVersion(nonCertifiedRI.getComponentVersion())) { - if (status.isRight() || status.left().value() == null || status.left().value().isEmpty()) { + if (status.isRight() || status.left().value() == null) { actionStatus = ActionStatus.VALIDATED_RESOURCE_NOT_FOUND; } else { actionStatus = ActionStatus.FOUND_ALREADY_VALIDATED_RESOURCE; } } else { - if (status.isRight() || status.left().value() == null || status.left().value().isEmpty()) + if (status.isRight() || status.left().value() == null) actionStatus = ActionStatus.FOUND_LIST_VALIDATED_RESOURCES; else { actionStatus = ActionStatus.FOUND_ALREADY_VALIDATED_RESOURCE; @@ -157,23 +164,23 @@ public class CertificationRequestTransition extends LifeCycleTransition { private Either<ActionStatus, Map<String, ArtifactDefinition>> validateMandatoryArtifactsSupplied(Map<String, ArtifactDefinition> artifacts) { - if (artifacts == null || true == artifacts.isEmpty()) { + if (artifacts == null || artifacts.isEmpty()) { return Either.left(ActionStatus.OK); } - Map<String, ArtifactDefinition> invalidArtifacts = new HashMap<String, ArtifactDefinition>(); + Map<String, ArtifactDefinition> invalidArtifacts = new HashMap<>(); for (Entry<String, ArtifactDefinition> artifact : artifacts.entrySet()) { ArtifactDefinition artifactDefinition = artifact.getValue(); - if (true == artifactDefinition.getMandatory()) { + if (artifactDefinition.getMandatory()) { String artifactEsId = artifactDefinition.getEsId(); - if (artifactEsId == null || true == artifactEsId.isEmpty()) { + if (artifactEsId == null || artifactEsId.isEmpty()) { invalidArtifacts.put(artifact.getKey(), artifactDefinition); } } } - if (true == invalidArtifacts.isEmpty()) { + if (invalidArtifacts.isEmpty()) { return Either.left(ActionStatus.OK); } else { return Either.right(invalidArtifacts); @@ -185,81 +192,73 @@ public class CertificationRequestTransition extends LifeCycleTransition { log.debug("start performing certification request for resource {}", component.getUniqueId()); - // Either<ActionStatus, Map<String, ArtifactDefinition>> - // validateMandatoryArtifacts = - // validateMandatoryArtifactsSupplied(component.getArtifacts()); - // log.debug("After checking mandatory artifacts were populated. Result - // is " + validateMandatoryArtifacts); - // if (validateMandatoryArtifacts.isRight()) { - // ResponseFormat responseFormat = componentUtils - // .getResponseFormatByMissingArtifacts( - // componentType, - // validateMandatoryArtifacts.right().value()); - // return Either.right(responseFormat); - // } - ActionStatus actionStatus = null; - ResponseFormat responseFormat = null; - - if (componentType == ComponentTypeEnum.SERVICE || (componentType == ComponentTypeEnum.RESOURCE && ((Resource) component).getResourceType() == ResourceTypeEnum.VF)) { - - Either<Boolean, ResponseFormat> statusCert = validateAllResourceInstanceCertified(component); - if (statusCert.isRight()) { - return Either.right(statusCert.right().value()); - } - - statusCert = validateConfiguredAtomicReqCapSatisfied(component); - if (statusCert.isRight()) { - return Either.right(statusCert.right().value()); + ActionStatus actionStatus; + ResponseFormat responseFormat; + Either<? extends Component, ResponseFormat> result = null; + try{ + if (componentType == ComponentTypeEnum.SERVICE || (componentType == ComponentTypeEnum.RESOURCE && ((Resource) component).getResourceType() == ResourceTypeEnum.VF)) { + + Either<Boolean, ResponseFormat> statusCert = validateAllResourceInstanceCertified(component); + if (statusCert.isRight()) { + return Either.right(statusCert.right().value()); + } + + statusCert = validateConfiguredAtomicReqCapSatisfied(component); + if (statusCert.isRight()) { + return Either.right(statusCert.right().value()); + } } - } - if (componentType == ComponentTypeEnum.SERVICE) { - Either<Boolean, StorageOperationStatus> status = validateDeloymentArtifactSupplied((Service) component); - if (status.isRight()) { - StorageOperationStatus operationStatus = status.right().value(); - actionStatus = componentUtils.convertFromStorageResponse(operationStatus); - } else { - Boolean isDeploymentArtifactExists = status.left().value(); - if (isDeploymentArtifactExists == null || isDeploymentArtifactExists.booleanValue() == false) { - actionStatus = ActionStatus.SERVICE_DEPLOYMENT_ARTIFACT_NOT_FOUND; - } else { - Either<Service, ResponseFormat> generateHeatEnvResult = serviceBusinessLogic.generateHeatEnvArtifacts((Service) component, modifier, shouldLock); - if (generateHeatEnvResult.isRight()) { + if (componentType == ComponentTypeEnum.SERVICE) { + + Either<Service, ResponseFormat> generateHeatEnvResult = serviceBusinessLogic.generateHeatEnvArtifacts((Service) component, modifier, shouldLock); + + if (generateHeatEnvResult.isRight()) { return Either.right(generateHeatEnvResult.right().value()); } - Either<Service, ResponseFormat> generateVfModuleResult = serviceBusinessLogic.generateVfModuleArtifacts((Service) component, modifier, shouldLock); - if (generateVfModuleResult.isRight()) { + Either<Service, ResponseFormat> generateVfModuleResult = serviceBusinessLogic.generateVfModuleArtifacts((Service) component, modifier, shouldLock); + if (generateVfModuleResult.isRight()) { return Either.right(generateVfModuleResult.right().value()); - } } } - - if (actionStatus != null) { + + Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherPopulated = componentBl.populateToscaArtifacts(component, modifier, true, inTransaction, shouldLock); + if (eitherPopulated != null && eitherPopulated.isRight()) { + return Either.right(eitherPopulated.right().value()); + } + + NodeTypeEnum nodeType = componentType.equals(ComponentTypeEnum.SERVICE) ? NodeTypeEnum.Service : NodeTypeEnum.Resource; + + + Either<ToscaElement, StorageOperationStatus> certificationRequestResult = lifeCycleOperation.requestCertificationToscaElement(component.getUniqueId(), modifier.getUserId(), owner.getUserId()); + if (certificationRequestResult.isRight()) { + log.debug("checkout failed on graph"); + StorageOperationStatus response = certificationRequestResult.right().value(); + actionStatus = componentUtils.convertFromStorageResponse(response); + + if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { + actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + } responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - return Either.right(responseFormat); + result = Either.right(responseFormat); } - - } - - Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherPopulated = componentBl.populateToscaArtifacts(component, modifier, true, inTransaction, shouldLock); - if (eitherPopulated != null && eitherPopulated.isRight()) { - return Either.right(eitherPopulated.right().value()); - } - - NodeTypeEnum nodeType = (componentType.equals(ComponentTypeEnum.SERVICE)) ? NodeTypeEnum.Service : NodeTypeEnum.Resource; - Either<? extends Component, StorageOperationStatus> certificationRequestResult = lifeCycleOperation.requestCertificationComponent(nodeType, component, modifier, owner, inTransaction); - if (certificationRequestResult.isRight()) { - log.debug("checkout failed on graph"); - StorageOperationStatus response = certificationRequestResult.right().value(); - actionStatus = componentUtils.convertFromStorageResponse(response); - - if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { - actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + else { + result = Either.left(ModelConverter.convertFromToscaElement(certificationRequestResult.left().value())); + } + } finally { + if (result == null || result.isRight()) { + BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState"); + if (inTransaction == false) { + log.debug("operation failed. do rollback"); + titanDao.rollback(); + } + } else { + if (inTransaction == false) { + log.debug("operation success. do commit"); + titanDao.commit(); } - responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - return Either.right(responseFormat); } - - return Either.left(certificationRequestResult.left().value()); + } + return result; } private Either<Boolean, ResponseFormat> validateConfiguredAtomicReqCapSatisfied(Component component) { @@ -369,7 +368,7 @@ public class CertificationRequestTransition extends LifeCycleTransition { log.debug("validate before certification request. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier,component, componentType, lifecycleChangeInfo); if (userValidationResponse.isRight()) { return userValidationResponse; } @@ -397,13 +396,4 @@ public class CertificationRequestTransition extends LifeCycleTransition { return Either.left(true); } - - private Either<Boolean, StorageOperationStatus> validateDeloymentArtifactSupplied(Service service) { - - Either<Boolean, StorageOperationStatus> serviceContainsDeploymentArtifacts = this.serviceDistributionArtifactsBuilder.isServiceContainsDeploymentArtifacts(service); - - return serviceContainsDeploymentArtifacts; - - } - } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckinTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckinTransition.java index 28227285f1..bfe51ded48 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckinTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckinTransition.java @@ -23,15 +23,19 @@ package org.openecomp.sdc.be.components.lifecycle; import java.util.Arrays; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; +import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; -import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.User; -import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; @@ -45,8 +49,8 @@ public class CheckinTransition extends LifeCycleTransition { private static Logger log = LoggerFactory.getLogger(CheckinTransition.class.getName()); - public CheckinTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { - super(componentUtils, lifecycleOperation); + public CheckinTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); // authorized roles Role[] resourceServiceCheckoutRoles = { Role.ADMIN, Role.DESIGNER }; @@ -71,21 +75,40 @@ public class CheckinTransition extends LifeCycleTransition { public Either<? extends Component, ResponseFormat> changeState(ComponentTypeEnum componentType, Component component, ComponentBusinessLogic componentBl, User modifier, User owner, boolean shouldLock, boolean inTransaction) { log.debug("start performing checkin for {} {}", componentType.name(), component.getUniqueId()); - NodeTypeEnum nodeType = componentType.getNodeType(); - Either<? extends Component, StorageOperationStatus> checkinResourceResult = lifeCycleOperation.checkinComponent(nodeType, component, modifier, owner, inTransaction); - if (checkinResourceResult.isRight()) { - log.debug("checkout failed on graph"); - StorageOperationStatus response = checkinResourceResult.right().value(); - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); - - if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { - actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + Either<? extends Component, ResponseFormat> result = null; + try{ + Either<ToscaElement, StorageOperationStatus> checkinResourceResult = lifeCycleOperation. + checkinToscaELement(component.getLifecycleState(), component.getUniqueId(), modifier.getUserId(), owner.getUserId()); + + if (checkinResourceResult.isRight()) { + log.debug("checkout failed on graph"); + StorageOperationStatus response = checkinResourceResult.right().value(); + ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); + + if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { + actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + } + ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); + result = Either.right(responseFormat); + } + else { + result = Either.left(ModelConverter.convertFromToscaElement(checkinResourceResult.left().value())); + } + } finally { + if (result == null || result.isRight()) { + BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState"); + if (inTransaction == false) { + log.debug("operation failed. do rollback"); + titanDao.rollback(); + } + } else { + if (inTransaction == false) { + log.debug("operation success. do commit"); + titanDao.commit(); + } } - ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - return Either.right(responseFormat); } - - return Either.left(checkinResourceResult.left().value()); + return result; } @Override @@ -94,13 +117,19 @@ public class CheckinTransition extends LifeCycleTransition { log.debug("validate before checkin. component name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier,component, componentType, lifecycleChangeInfo); if (userValidationResponse.isRight()) { return userValidationResponse; } if (!oldState.equals(LifecycleStateEnum.READY_FOR_CERTIFICATION) && !oldState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT)) { - ResponseFormat error = componentUtils.getResponseFormat(ActionStatus.COMPONENT_ALREADY_CHECKED_IN, componentName, componentType.name().toLowerCase(), owner.getFirstName(), owner.getLastName(), owner.getUserId()); + ActionStatus action = ActionStatus.COMPONENT_ALREADY_CHECKED_IN; + if (oldState.equals(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS)){ + action = ActionStatus.COMPONENT_SENT_FOR_CERTIFICATION; + } else if (oldState.equals(LifecycleStateEnum.CERTIFIED)){ + action = ActionStatus.COMPONENT_ALREADY_CERTIFIED; + } + ResponseFormat error = componentUtils.getResponseFormat(action, componentName, componentType.name().toLowerCase(), owner.getFirstName(), owner.getLastName(), owner.getUserId()); return Either.right(error); } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTransition.java index a4e6bdb86c..d6cbd3663c 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTransition.java @@ -21,17 +21,26 @@ package org.openecomp.sdc.be.components.lifecycle; import java.util.Arrays; +import java.util.List; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; +import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; +import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum; +import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; -import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.Component; +import org.openecomp.sdc.be.model.InputDefinition; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.User; -import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; @@ -43,12 +52,10 @@ import fj.data.Either; public class CheckoutTransition extends LifeCycleTransition { - private static final String PLACE_HOLDER_RESOURCE_TYPES = "validForResourceTypes"; - private static Logger log = LoggerFactory.getLogger(CheckoutTransition.class.getName()); - public CheckoutTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { - super(componentUtils, lifecycleOperation); + public CheckoutTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); // authorized roles Role[] resourceServiceCheckoutRoles = { Role.ADMIN, Role.DESIGNER }; @@ -74,24 +81,66 @@ public class CheckoutTransition extends LifeCycleTransition { log.debug("start performing {} for resource {}", getName().name(), component.getUniqueId()); - if (componentBl != null) - componentBl.setDeploymentArtifactsPlaceHolder(component, modifier); - NodeTypeEnum nodeType = componentType.getNodeType(); - Either<? extends Component, StorageOperationStatus> checkoutResourceResult = lifeCycleOperation.checkoutComponent(nodeType, component, modifier, owner, inTransaction); + Either<? extends Component, ResponseFormat> result = null; + try { + + Either<ToscaElement, StorageOperationStatus> checkoutResourceResult = lifeCycleOperation.checkoutToscaElement(component.getUniqueId(), modifier.getUserId(), owner.getUserId()); + + if (checkoutResourceResult.isRight()) { + log.debug("checkout failed on graph"); + StorageOperationStatus response = checkoutResourceResult.right().value(); + ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); + + if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { + actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + } + ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); + result = Either.right(responseFormat); + } else { + Component clonedComponent = ModelConverter.convertFromToscaElement(checkoutResourceResult.left().value()); + result = Either.left(clonedComponent); + Either<Boolean, ResponseFormat> upgradeToLatestGeneric = componentBl.shouldUpgradeToLatestGeneric(clonedComponent); + if (upgradeToLatestGeneric.isRight()) + result = Either.right(upgradeToLatestGeneric.right().value()); + else if (upgradeToLatestGeneric.left().value()) { + StorageOperationStatus response = upgradeToLatestGenericData(clonedComponent); + if (StorageOperationStatus.OK != response) { + ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); + ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); + result = Either.right(responseFormat); + } + } - if (checkoutResourceResult.isRight()) { - log.debug("checkout failed on graph"); - StorageOperationStatus response = checkoutResourceResult.right().value(); - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); + } - if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { - actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + } finally { + if (result == null || result.isRight()) { + BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState"); + if (inTransaction == false) { + log.debug("operation failed. do rollback"); + titanDao.rollback(); + } + } else { + if (inTransaction == false) { + log.debug("operation success. do commit"); + titanDao.commit(); + } } - ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - return Either.right(responseFormat); } + return result; + } - return Either.left(checkoutResourceResult.left().value()); + private StorageOperationStatus upgradeToLatestGenericData(Component clonedComponent) { + + StorageOperationStatus updateStatus = null; + Either<Component, StorageOperationStatus> updateEither = toscaOperationFacade.updateToscaElement(clonedComponent); + if (updateEither.isRight()) + updateStatus = updateEither.right().value(); + else if (clonedComponent.shouldGenerateInputs()) { + List<InputDefinition> newInputs = clonedComponent.getInputs(); + updateStatus = lifeCycleOperation.updateToscaDataOfToscaElement(clonedComponent.getUniqueId(), EdgeLabelEnum.INPUTS, VertexTypeEnum.INPUTS, newInputs, JsonPresentationFields.NAME); + } + return updateStatus; } @Override @@ -100,7 +149,7 @@ public class CheckoutTransition extends LifeCycleTransition { log.debug("validate before checkout. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, component, componentType, lifecycleChangeInfo); if (userValidationResponse.isRight()) { return userValidationResponse; } @@ -131,11 +180,4 @@ public class CheckoutTransition extends LifeCycleTransition { return Either.left(true); } - /* - * private Either<Boolean, ResponseFormat> productContactsValidation(Product product, User modifier) { // validate user Either<Boolean, ResponseFormat> eitherResponse = Either.left(true); String role = modifier.getRole(); if - * (UserRoleEnum.PRODUCT_MANAGER.getName().equals(role) || UserRoleEnum.PRODUCT_STRATEGIST.getName().equals(role)){ String userId = modifier.getUserId(); if (!product.getContacts().contains(userId)){ log. - * debug("User with userId {} cannot checkout product. userId not found in product contacts list" , userId); ResponseFormat responseFormat = componentUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION); return Either.right(responseFormat); - * } else { log. trace("Found user userId {} in product contacts - checkout request validated" ); } } return eitherResponse; } - */ - } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifeCycleTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifeCycleTransition.java index 49d94dc80b..0d0e06fe6d 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifeCycleTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifeCycleTransition.java @@ -24,44 +24,53 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction.LifecycleChanceActionEnum; import org.openecomp.sdc.be.config.ConfigurationManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; +import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; -import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.User; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; import org.openecomp.sdc.exception.ResponseFormat; +import org.springframework.beans.factory.annotation.Autowired; import fj.data.Either; public abstract class LifeCycleTransition { protected ConfigurationManager configurationManager; - protected ILifecycleOperation lifeCycleOperation; + @Autowired + protected ToscaElementLifecycleOperation lifeCycleOperation; + @Autowired + protected TitanDao titanDao; protected ComponentsUtils componentUtils; protected Map<ComponentTypeEnum, List<Role>> authorizedRoles; + protected Map<ResourceTypeEnum, List<Role>> resourceAuthorizedRoles; + + ToscaOperationFacade toscaOperationFacade; - protected LifeCycleTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { + protected LifeCycleTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation2, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { - // configurationManager = (ConfigurationManager) - // context.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR); - // lifeCycleOperation = LifecycleOperation.getInstance(); this.configurationManager = ConfigurationManager.getConfigurationManager(); - this.lifeCycleOperation = lifecycleOperation; + this.lifeCycleOperation = lifecycleOperation2; this.componentUtils = componentUtils; this.authorizedRoles = new HashMap<>(); - + this.resourceAuthorizedRoles = new HashMap<>(); + this.toscaOperationFacade = toscaOperationFacade; + this.titanDao = titanDao; } public abstract LifeCycleTransitionEnum getName(); @@ -76,11 +85,11 @@ public abstract class LifeCycleTransition { this.configurationManager = configurationManager; } - public ILifecycleOperation getLifeCycleOperation() { + public ToscaElementLifecycleOperation getLifeCycleOperation() { return lifeCycleOperation; } - public void setLifeCycleOperation(ILifecycleOperation lifeCycleOperation) { + public void setLifeCycleOperation(ToscaElementLifecycleOperation lifeCycleOperation) { this.lifeCycleOperation = lifeCycleOperation; } @@ -91,14 +100,14 @@ public abstract class LifeCycleTransition { public void addAuthorizedRoles(ComponentTypeEnum componentType, List<Role> authorizedRoles) { this.authorizedRoles.put(componentType, authorizedRoles); } + + public List<Role> getResourceAuthorizedRoles(ResourceTypeEnum resourceType) { + return resourceAuthorizedRoles.get(resourceType); + } - // - // public Either<? extends Component, ResponseFormat> - // changeState(ComponentTypeEnum componentType, Component component, - // ComponentBusinessLogic componentBl, User modifier, User owner){ - // return changeState(componentType, component, componentBl, modifier, - // owner, false); - // } + public void addResouceAuthorizedRoles(ResourceTypeEnum resourceType, List<Role> authorizedRoles) { + this.resourceAuthorizedRoles.put(resourceType, authorizedRoles); + } public abstract Either<? extends Component, ResponseFormat> changeState(ComponentTypeEnum componentType, Component component, ComponentBusinessLogic componentBl, User modifier, User owner, boolean needLock, boolean inTransaction); @@ -122,8 +131,7 @@ public abstract class LifeCycleTransition { protected Either<User, ResponseFormat> getComponentOwner(Component component, ComponentTypeEnum componentType, boolean inTransaction) { - NodeTypeEnum nodeType = componentType.getNodeType(); - Either<User, StorageOperationStatus> resourceOwnerResult = getLifeCycleOperation().getComponentOwner(component.getUniqueId(), nodeType, inTransaction); + Either<User, StorageOperationStatus> resourceOwnerResult = getLifeCycleOperation().getToscaElementOwner(component.getUniqueId()); if (resourceOwnerResult.isRight()) { ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(componentUtils.convertFromStorageResponse(resourceOwnerResult.right().value()), component, componentType); return Either.right(responseFormat); @@ -131,21 +139,13 @@ public abstract class LifeCycleTransition { return Either.left(resourceOwnerResult.left().value()); } - /** - * isUserValidForRequest - * - * @param modifier - * @param action - * TODO - * @return - */ - protected Either<Boolean, ResponseFormat> userRoleValidation(User modifier, ComponentTypeEnum componentType, LifecycleChangeInfoWithAction lifecycleChangeInfo) { + protected Either<Boolean, ResponseFormat> userRoleValidation(User modifier,Component component, ComponentTypeEnum componentType, LifecycleChangeInfoWithAction lifecycleChangeInfo) { // validate user - if (getAuthorizedRoles(componentType).contains(Role.valueOf(modifier.getRole()))) { + //first check the user for the component and then for the resource + if (getAuthorizedRoles(componentType).contains(Role.valueOf(modifier.getRole())) || userResourceRoleValidation(component,componentType,modifier)) { return Either.left(true); } - // this is only when creating vfc/cp when import vf from csar - when we // create resources from node type, we create need to change the state // to certified @@ -156,5 +156,18 @@ public abstract class LifeCycleTransition { ResponseFormat responseFormat = componentUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION); return Either.right(responseFormat); } + + protected boolean userResourceRoleValidation(Component component, ComponentTypeEnum componentType, User modifier) { + if (componentType.equals(ComponentTypeEnum.RESOURCE)){ + ResourceTypeEnum resourceType = ((ResourceMetadataDataDefinition)component.getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType(); + if (getResourceAuthorizedRoles(resourceType)!=null && getResourceAuthorizedRoles(resourceType).contains(Role.valueOf(modifier.getRole()))) { + return true; + } + } else { + return false; + } + + return false; + } } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifecycleBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifecycleBusinessLogic.java index 27709bb332..8e89a6bf31 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifecycleBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/LifecycleBusinessLogic.java @@ -34,8 +34,11 @@ import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic; import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; +import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; @@ -43,14 +46,13 @@ import org.openecomp.sdc.be.model.LifecycleStateEnum; 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.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.ICacheMangerOperation; import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation; -import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation; -import org.openecomp.sdc.be.model.operations.impl.ProductOperation; -import org.openecomp.sdc.be.model.operations.impl.ResourceOperation; -import org.openecomp.sdc.be.model.operations.impl.ServiceOperation; +import org.openecomp.sdc.be.model.operations.impl.ComponentOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.tosca.ToscaExportHandler; import org.openecomp.sdc.common.api.Constants; @@ -76,13 +78,7 @@ public class LifecycleBusinessLogic { private ArtifactsBusinessLogic artifactsBusinessLogic; @Autowired - private ResourceOperation resourceOperation; - - @Autowired - private ServiceOperation serviceOperation; - - @Autowired - private ProductOperation productOperation; + private TitanDao titanDao; @Autowired private CapabilityOperation capabilityOperation; @@ -93,7 +89,7 @@ public class LifecycleBusinessLogic { private ComponentsUtils componentUtils; @javax.annotation.Resource - private ILifecycleOperation lifecycleOperation; + private ToscaElementLifecycleOperation lifecycleOperation; @javax.annotation.Resource ArtifactsBusinessLogic artifactsManager; @@ -114,6 +110,9 @@ public class LifecycleBusinessLogic { @Autowired ICacheMangerOperation cacheManagerOperation; + + @Autowired + ToscaOperationFacade toscaOperationFacade; private Map<String, LifeCycleTransition> stateTransitions; private static volatile boolean isInitialized = false; @@ -134,29 +133,29 @@ public class LifecycleBusinessLogic { private void initStateOperations() { stateTransitions = new HashMap<String, LifeCycleTransition>(); - LifeCycleTransition checkoutOp = new CheckoutTransition(componentUtils, lifecycleOperation); + LifeCycleTransition checkoutOp = new CheckoutTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); stateTransitions.put(checkoutOp.getName().name(), checkoutOp); - UndoCheckoutTransition undoCheckoutOp = new UndoCheckoutTransition(componentUtils, lifecycleOperation); + UndoCheckoutTransition undoCheckoutOp = new UndoCheckoutTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); undoCheckoutOp.setArtifactsBusinessLogic(artifactsBusinessLogic); stateTransitions.put(undoCheckoutOp.getName().name(), undoCheckoutOp); - LifeCycleTransition checkinOp = new CheckinTransition(componentUtils, lifecycleOperation); + LifeCycleTransition checkinOp = new CheckinTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); stateTransitions.put(checkinOp.getName().name(), checkinOp); - LifeCycleTransition certificationRequest = new CertificationRequestTransition(componentUtils, lifecycleOperation, serviceDistributionArtifactsBuilder, serviceBusinessLogic, capabilityOperation, toscaExportUtils); + LifeCycleTransition certificationRequest = new CertificationRequestTransition(componentUtils, lifecycleOperation, serviceDistributionArtifactsBuilder, serviceBusinessLogic, capabilityOperation, toscaExportUtils, toscaOperationFacade, titanDao); stateTransitions.put(certificationRequest.getName().name(), certificationRequest); - LifeCycleTransition startCertification = new StartCertificationTransition(componentUtils, lifecycleOperation); + LifeCycleTransition startCertification = new StartCertificationTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); stateTransitions.put(startCertification.getName().name(), startCertification); - LifeCycleTransition failCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.FAIL_CERTIFICATION, componentUtils, lifecycleOperation); + LifeCycleTransition failCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.FAIL_CERTIFICATION, componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); stateTransitions.put(failCertification.getName().name(), failCertification); - LifeCycleTransition cancelCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.CANCEL_CERTIFICATION, componentUtils, lifecycleOperation); + LifeCycleTransition cancelCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.CANCEL_CERTIFICATION, componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); stateTransitions.put(cancelCertification.getName().name(), cancelCertification); - CertificationChangeTransition successCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.CERTIFY, componentUtils, lifecycleOperation); + CertificationChangeTransition successCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.CERTIFY, componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); successCertification.setArtifactsManager(artifactsBusinessLogic); stateTransitions.put(successCertification.getName().name(), successCertification); } @@ -172,132 +171,16 @@ public class LifecycleBusinessLogic { // TODO: rhalili - should use changeComponentState when possible public Either<Resource, ResponseFormat> changeState(String resourceId, User modifier, LifeCycleTransitionEnum transitionEnum, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction, boolean needLock) { return (Either<Resource, ResponseFormat>) changeComponentState(ComponentTypeEnum.RESOURCE, resourceId, modifier, transitionEnum, changeInfo, inTransaction, needLock); - - // LifeCycleTransition lifeCycleTransition = - // stateTransitions.get(transitionEnum.name()); - // if (lifeCycleTransition == null) { - // log.debug("state operation is not valid. operations allowed are: {}", - // LifeCycleTransitionEnum.valuesAsString()); - // ResponseFormat error = - // componentUtils.getInvalidContentErrorAndAudit(modifier, - // AuditingActionEnum.CHECKOUT_RESOURCE); - // return Either.right(error); - // } - // - // Either<Resource, ResponseFormat> operationResult; - // Resource resource = null; - // boolean needToUnlockResource = false; - // - // log.debug("get resource from graph"); - // ResponseFormat errorResponse; - // Either<Resource, ResponseFormat> eitherResourceResponse = - // getResourceForChange(resourceId, modifier, lifeCycleTransition); - // if (eitherResourceResponse.isRight()) { - // return eitherResourceResponse; - // } - // resource = eitherResourceResponse.left().value(); - // String resourceCurrVersion = resource.getResourceVersion(); - // LifecycleStateEnum resourceCurrState = resource.getLifecycleState(); - // - // if (inTransaction == false) { - // // lock resource - // Either<Boolean, ResponseFormat> eitherLockResource = - // lockResource(resource); - // if (eitherLockResource.isRight()) { - // errorResponse = eitherLockResource.right().value(); - // componentUtils.auditResource(errorResponse, modifier, resource, - // resourceCurrState.name(), resourceCurrVersion, - // lifeCycleTransition.getAuditingAction(), null); - // return Either.right(errorResponse); - // } - // needToUnlockResource = true; - // } - // - // try { - // Either<Boolean, ResponseFormat> resourceNotDeleted = - // validateResourceNotDeleted(modifier, lifeCycleTransition, resource, - // resourceCurrVersion); - // if (resourceNotDeleted.isRight()) { - // return Either.right(resourceNotDeleted.right().value()); - // } - // - // Either<Boolean, ResponseFormat> validateHighestVersion = - // validateHighestVersion(modifier, lifeCycleTransition, resource, - // resourceCurrVersion); - // if (validateHighestVersion.isRight()) { - // return Either.right(validateHighestVersion.right().value()); - // } - // - // Either<User, ResponseFormat> ownerResult = - // lifeCycleTransition.getResourceOwner(resource); - // if (ownerResult.isRight()) { - // return Either.right(ownerResult.right().value()); - // } - // User owner = ownerResult.left().value(); - // log.debug("owner of resource {} is {}", resource.getUniqueId(), - // owner.getUserId()); - // - // LifecycleStateEnum oldState = resource.getLifecycleState(); - // - // Either<String, ResponseFormat> commentValidationResult = - // validateComment(changeInfo, transitionEnum); - // if (commentValidationResult.isRight()) { - // errorResponse = commentValidationResult.right().value(); - // EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new - // EnumMap<AuditingFieldsKeysEnum, - // Object>(AuditingFieldsKeysEnum.class); - // auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, - // changeInfo.getUserRemarks()); - // componentUtils.auditResource(errorResponse, modifier, resource, - // resourceCurrState.name(), resourceCurrVersion, - // lifeCycleTransition.getAuditingAction(), auditingFields); - // return Either.right(errorResponse); - // } - // changeInfo.setUserRemarks(commentValidationResult.left().value()); - // - // Either<Boolean, ResponseFormat> stateValidationResult = - // lifeCycleTransition.validateResourceBeforeTransition(resource.getResourceName(), - // ComponentTypeEnum.RESOURCE, modifier, owner, oldState); - // if (stateValidationResult.isRight()) { - // errorResponse = stateValidationResult.right().value(); - // componentUtils.auditResource(errorResponse, modifier, resource, - // resourceCurrState.name(), resourceCurrVersion, - // lifeCycleTransition.getAuditingAction(), null); - // return Either.right(errorResponse); - // } - // - // operationResult = lifeCycleTransition.changeStateOperation(resource, - // modifier, owner, inTransaction); - // - // if (operationResult.isRight()) { - // errorResponse = operationResult.right().value(); - // log.debug("audit before sending response"); - // componentUtils.auditResource(errorResponse, modifier, resource, - // resourceCurrState.name(), resourceCurrVersion, - // lifeCycleTransition.getAuditingAction(), null); - // - // return Either.right(errorResponse); - // } - // Resource resourceAfterOperation = operationResult.left().value(); - // EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new - // EnumMap<AuditingFieldsKeysEnum, - // Object>(AuditingFieldsKeysEnum.class); - // auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, - // changeInfo.getUserRemarks()); - // componentUtils.auditResource(componentUtils.getResponseFormat(ActionStatus.OK), - // modifier, resourceAfterOperation, resourceCurrState.name(), - // resourceCurrVersion, lifeCycleTransition.getAuditingAction(), - // auditingFields); - // return operationResult; - // - // } finally { - // log.debug("unlock resource {}", resourceId); - // if (needToUnlockResource && resource != null) { - // resource.setUniqueId(resourceId); - // graphLockOperation.unlockResource(resource); - // } - // } - + } + + private boolean isComponentVFCMT(Component component, ComponentTypeEnum componentType){ + if (componentType.equals(ComponentTypeEnum.RESOURCE)){ + ResourceTypeEnum resourceType = ((ResourceMetadataDataDefinition)component.getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType(); + if (resourceType.equals(ResourceTypeEnum.VFCMT)){ + return true; + } + } + return false; } public Either<? extends Component, ResponseFormat> changeComponentState(ComponentTypeEnum componentType, String componentId, User modifier, LifeCycleTransitionEnum transitionEnum, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction, @@ -309,12 +192,8 @@ public class LifecycleBusinessLogic { ResponseFormat error = componentUtils.getInvalidContentErrorAndAudit(modifier, AuditingActionEnum.CHECKOUT_RESOURCE); return Either.right(error); } - ComponentBusinessLogic bl = getComponentBL(componentType); - - Either<? extends Component, ResponseFormat> operationResult = null; Component component = null; - // boolean needToUnlockResource = false; - log.debug("get resource from graph"); + log.info("get resource from graph"); ResponseFormat errorResponse; Either<? extends Component, ResponseFormat> eitherResourceResponse = getComponentForChange(componentType, componentId, modifier, lifeCycleTransition, changeInfo); @@ -325,110 +204,133 @@ public class LifecycleBusinessLogic { String resourceCurrVersion = component.getVersion(); LifecycleStateEnum resourceCurrState = component.getLifecycleState(); + log.info("lock component {}", componentId); // lock resource if (inTransaction == false && needLock) { Either<Boolean, ResponseFormat> eitherLockResource = lockComponent(componentType, component); if (eitherLockResource.isRight()) { errorResponse = eitherLockResource.right().value(); componentUtils.auditComponent(errorResponse, modifier, component, resourceCurrState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, null); + log.error("lock component {} failed", componentId); return Either.right(errorResponse); } - // needToUnlockResource = true; } + log.info("after lock component {}", componentId); try { Either<String, ResponseFormat> commentValidationResult = validateComment(changeInfo, transitionEnum); if (commentValidationResult.isRight()) { errorResponse = commentValidationResult.right().value(); - EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class); + EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<>(AuditingFieldsKeysEnum.class); auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, changeInfo.getUserRemarks()); componentUtils.auditComponent(errorResponse, modifier, component, resourceCurrState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, auditingFields); return Either.right(errorResponse); } changeInfo.setUserRemarks(commentValidationResult.left().value()); - + log.info("after validate component"); Either<Boolean, ResponseFormat> validateHighestVersion = validateHighestVersion(modifier, lifeCycleTransition, component, resourceCurrVersion, componentType); if (validateHighestVersion.isRight()) { return Either.right(validateHighestVersion.right().value()); } - - Either<User, ResponseFormat> ownerResult = lifeCycleTransition.getComponentOwner(component, componentType, inTransaction); - if (ownerResult.isRight()) { - return Either.right(ownerResult.right().value()); - } - User owner = ownerResult.left().value(); - log.debug("owner of resource {} is {}", component.getUniqueId(), owner.getUserId()); - - LifecycleStateEnum oldState = component.getLifecycleState(); - - Either<Boolean, ResponseFormat> stateValidationResult = lifeCycleTransition.validateBeforeTransition(component, componentType, modifier, owner, oldState, changeInfo); - if (stateValidationResult.isRight()) { - errorResponse = stateValidationResult.right().value(); - EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class); - auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, changeInfo.getUserRemarks()); - componentUtils.auditComponent(errorResponse, modifier, component, resourceCurrState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, auditingFields); - return Either.right(errorResponse); - - } - - operationResult = lifeCycleTransition.changeState(componentType, component, bl, modifier, owner, false, inTransaction); - - if (operationResult.isRight()) { - errorResponse = operationResult.right().value(); - log.debug("audit before sending response"); - componentUtils.auditComponentAdmin(errorResponse, modifier, component, resourceCurrState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType); - - return Either.right(errorResponse); + log.info("after validate Highest Version"); + if (isComponentVFCMT(component,componentType)){ + Either<? extends Component, ResponseFormat> changeVFCMTStateResponse = changeVFCMTState(componentType, modifier, transitionEnum, changeInfo, inTransaction, component); + if (changeVFCMTStateResponse.isRight()){ + return changeVFCMTStateResponse; + } } - Component resourceAfterOperation = operationResult.left().value(); - EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class); - auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, changeInfo.getUserRemarks()); - componentUtils.auditComponent(componentUtils.getResponseFormat(ActionStatus.OK), modifier, resourceAfterOperation, resourceCurrState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, auditingFields); - return operationResult; + return changeState(component, lifeCycleTransition, componentType, modifier, changeInfo, inTransaction); } finally { - log.debug("unlock component {}", componentId); + log.info("unlock component {}", componentId); if (inTransaction == false && needLock && component != null) { component.setUniqueId(componentId); NodeTypeEnum nodeType = componentType.getNodeType(); + log.info("During change state, another component {} has been created/updated", componentId); + graphLockOperation.unlockComponent(componentId, nodeType); - // Handle component change in the cache of the side affect of - // the operation - if (operationResult != null && operationResult.isLeft()) { - Component componentAfterOpertion = operationResult.left().value(); - String uniqueId = componentAfterOpertion.getUniqueId(); - if (false == componentId.equals(uniqueId)) { - log.debug("During change state, another component {} has been created/updated", uniqueId); - if (uniqueId != null) { - cacheManagerOperation.updateComponentInCache(uniqueId, componentAfterOpertion.getLastUpdateDate(), nodeType); - } - } - } + } + } - graphLockOperation.unlockComponent(componentId, nodeType); + } + /* + * special case for certification of VFCMT - VFCMT can be certified by Designer or Tester right after checkin + * in case the operation "submit for test" / "start testing" is done to "VFCMT" - please return error 400 + */ + private Either<? extends Component, ResponseFormat> changeVFCMTState(ComponentTypeEnum componentType, User modifier, + LifeCycleTransitionEnum transitionEnum, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction, + Component component) { + LifecycleStateEnum oldState = component.getLifecycleState(); + if (transitionEnum.equals(LifeCycleTransitionEnum.START_CERTIFICATION) || + transitionEnum.equals(LifeCycleTransitionEnum.CERTIFICATION_REQUEST)){ + return Either.right(componentUtils.getResponseFormat( + ActionStatus.RESOURCE_VFCMT_LIFECYCLE_STATE_NOT_VALID, transitionEnum.getDisplayName())); + } //certify is done directly from checkin + else if (transitionEnum.equals(LifeCycleTransitionEnum.CERTIFY) && oldState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN)){ + //we will call for submit for testing first and then for certify + Either<? extends Component, ResponseFormat> actionResponse = changeState(component, + stateTransitions.get(LifeCycleTransitionEnum.CERTIFICATION_REQUEST.name()), + componentType, modifier, changeInfo, inTransaction); + if (actionResponse.isRight()) { + return actionResponse; } + actionResponse = changeState(component, + stateTransitions.get(LifeCycleTransitionEnum.START_CERTIFICATION.name()), + componentType, modifier, changeInfo, inTransaction); + if (actionResponse.isRight()) { + return actionResponse; + } } + return Either.left(null); + } + + private Either<? extends Component, ResponseFormat> changeState(Component component, LifeCycleTransition lifeCycleTransition, + ComponentTypeEnum componentType, User modifier, LifecycleChangeInfoWithAction changeInfo,boolean inTransaction){ + ResponseFormat errorResponse; + + LifecycleStateEnum oldState = component.getLifecycleState(); + String resourceCurrVersion = component.getVersion(); + ComponentBusinessLogic bl = getComponentBL(componentType); + + Either<User, ResponseFormat> ownerResult = lifeCycleTransition.getComponentOwner(component, componentType, inTransaction); + if (ownerResult.isRight()) { + return Either.right(ownerResult.right().value()); + } + User owner = ownerResult.left().value(); + log.info("owner of resource {} is {}", component.getUniqueId(), owner.getUserId()); + + Either<Boolean, ResponseFormat> stateValidationResult = lifeCycleTransition.validateBeforeTransition(component, componentType, modifier, owner, oldState, changeInfo); + if (stateValidationResult.isRight()) { + log.error("Failed to validateBeforeTransition"); + errorResponse = stateValidationResult.right().value(); + EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<>(AuditingFieldsKeysEnum.class); + auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, changeInfo.getUserRemarks()); + componentUtils.auditComponent(errorResponse, modifier, component, oldState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, auditingFields); + return Either.right(errorResponse); + } + + Either<? extends Component, ResponseFormat> operationResult = lifeCycleTransition.changeState(componentType, component, bl, modifier, owner, false, inTransaction); + + if (operationResult.isRight()) { + errorResponse = operationResult.right().value(); + log.info("audit before sending error response"); + componentUtils.auditComponentAdmin(errorResponse, modifier, component, oldState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType); + + return Either.right(errorResponse); + } + Component resourceAfterOperation = operationResult.left().value(); + EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class); + auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, changeInfo.getUserRemarks()); + componentUtils.auditComponent(componentUtils.getResponseFormat(ActionStatus.OK), modifier, resourceAfterOperation, oldState.name(), resourceCurrVersion, lifeCycleTransition.getAuditingAction(), componentType, auditingFields); + return operationResult; } private Either<? extends Component, ResponseFormat> getComponentForChange(ComponentTypeEnum componentType, String componentId, User modifier, LifeCycleTransition lifeCycleTransition, LifecycleChangeInfoWithAction changeInfo) { - Either<? extends Component, StorageOperationStatus> eitherResourceResponse = Either.right(StorageOperationStatus.GENERAL_ERROR); - switch (componentType) { - case SERVICE: - eitherResourceResponse = serviceOperation.getComponent(componentId, true); - break; - case PRODUCT: - eitherResourceResponse = productOperation.getComponent(componentId, true); - break; - case RESOURCE: - eitherResourceResponse = resourceOperation.getComponent(componentId, true); - break; - default: - break; - } + Either<? extends Component, StorageOperationStatus> eitherResourceResponse = toscaOperationFacade.getToscaElement(componentId); - ResponseFormat errorResponse = null; + ResponseFormat errorResponse; if (eitherResourceResponse.isRight()) { ActionStatus actionStatus = componentUtils.convertFromStorageResponse(eitherResourceResponse.right().value(), componentType); errorResponse = componentUtils.getResponseFormat(actionStatus, Constants.EMPTY_STRING); @@ -494,28 +396,6 @@ public class LifecycleBusinessLogic { } - private Either<Resource, ResponseFormat> getResourceForChange(String resourceId, User modifier, LifeCycleTransition lifeCycleTransition) { - Either<Resource, StorageOperationStatus> eitherResourceResponse = resourceOperation.getResource(resourceId, true); - - ResponseFormat errorResponse = null; - if (eitherResourceResponse.isRight()) { - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(eitherResourceResponse.right().value()); - errorResponse = componentUtils.getResponseFormatByResource(actionStatus, ""); - log.debug("audit before sending response"); - // For audit of not found, resourceName should be uniqueID according - // to Ella - EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class); - auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceId); - componentUtils.auditResource(errorResponse, modifier, null, "", "", lifeCycleTransition.getAuditingAction(), null); - - return Either.right(errorResponse); - } - Resource resource = eitherResourceResponse.left().value(); - - return Either.left(resource); - - } - private Either<String, ResponseFormat> validateComment(LifecycleChangeInfoWithAction changeInfo, LifeCycleTransitionEnum transitionEnum) { String comment = changeInfo.getUserRemarks(); if (LifeCycleTransitionEnum.CANCEL_CERTIFICATION == transitionEnum || LifeCycleTransitionEnum.CERTIFY == transitionEnum || LifeCycleTransitionEnum.FAIL_CERTIFICATION == transitionEnum || LifeCycleTransitionEnum.CHECKIN == transitionEnum @@ -548,25 +428,39 @@ public class LifecycleBusinessLogic { private ComponentBusinessLogic getComponentBL(ComponentTypeEnum componentTypeEnum) { ComponentBusinessLogic businessLogic; switch (componentTypeEnum) { - case RESOURCE: { - businessLogic = this.resourceBusinessLogic; - break; - } - case SERVICE: { - businessLogic = this.serviceBusinessLogic; - break; - } - case PRODUCT: { - businessLogic = this.productBusinessLogic; - break; - } - - default: { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeSystemError, "getComponentBL"); - throw new IllegalArgumentException("Illegal component type:" + componentTypeEnum.getValue()); - } + case RESOURCE: { + businessLogic = this.resourceBusinessLogic; + break; + } + case SERVICE: { + businessLogic = this.serviceBusinessLogic; + break; + } + case PRODUCT: { + businessLogic = this.productBusinessLogic; + break; + } + + default: { + BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeSystemError, "getComponentBL"); + throw new IllegalArgumentException("Illegal component type:" + componentTypeEnum.getValue()); + } } return businessLogic; } + + public Either<Component, ResponseFormat> getLatestComponentByUuid(ComponentTypeEnum componentTypeEnum, String uuid) { + + Either<Component, StorageOperationStatus> latestVersionEither = toscaOperationFacade.getLatestComponentByUuid(uuid); + + if (latestVersionEither.isRight()) { + + return Either.right(componentUtils.getResponseFormat(componentUtils.convertFromStorageResponse(latestVersionEither.right().value(), componentTypeEnum), uuid)); + } + + Component latestComponent = latestVersionEither.left().value(); + + return Either.left(latestComponent); + } } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/StartCertificationTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/StartCertificationTransition.java index 918140b0af..8a80e0bb64 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/StartCertificationTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/StartCertificationTransition.java @@ -22,15 +22,23 @@ package org.openecomp.sdc.be.components.lifecycle; import java.util.Arrays; +import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; +import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.User; +import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; @@ -45,14 +53,18 @@ public class StartCertificationTransition extends LifeCycleTransition { private static Logger log = LoggerFactory.getLogger(StartCertificationTransition.class.getName()); - public StartCertificationTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { - super(componentUtils, lifecycleOperation); + public StartCertificationTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); // authorized roles Role[] rsrcServiceStartCertificationRoles = { Role.ADMIN, Role.TESTER }; addAuthorizedRoles(ComponentTypeEnum.RESOURCE, Arrays.asList(rsrcServiceStartCertificationRoles)); addAuthorizedRoles(ComponentTypeEnum.SERVICE, Arrays.asList(rsrcServiceStartCertificationRoles)); // TODO to be later defined for product + + //additional authorized roles for resource type + Role[] resourceRoles = { Role.DESIGNER}; + addResouceAuthorizedRoles(ResourceTypeEnum.VFCMT, Arrays.asList(resourceRoles)); } @Override @@ -69,22 +81,38 @@ public class StartCertificationTransition extends LifeCycleTransition { public Either<? extends Component, ResponseFormat> changeState(ComponentTypeEnum componentType, Component component, ComponentBusinessLogic componentBl, User modifier, User owner, boolean shouldLock, boolean inTransaction) { log.debug("start performing certification test for resource {}", component.getUniqueId()); - - NodeTypeEnum nodeType = (componentType.equals(ComponentTypeEnum.SERVICE)) ? NodeTypeEnum.Service : NodeTypeEnum.Resource; - Either<? extends Component, StorageOperationStatus> stateChangeResult = lifeCycleOperation.startComponentCertification(nodeType, component, modifier, owner, inTransaction); - if (stateChangeResult.isRight()) { - log.debug("start certification failed on graph"); - StorageOperationStatus response = stateChangeResult.right().value(); - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); - - if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { - actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + Either<? extends Component, ResponseFormat> result = null; + try{ + Either<ToscaElement, StorageOperationStatus> stateChangeResult = lifeCycleOperation.startCertificationToscaElement(component.getUniqueId(), modifier.getUserId(), owner.getUserId()); + if (stateChangeResult.isRight()) { + log.debug("start certification failed on graph"); + StorageOperationStatus response = stateChangeResult.right().value(); + ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); + + if (response.equals(StorageOperationStatus.ENTITY_ALREADY_EXISTS)) { + actionStatus = ActionStatus.COMPONENT_VERSION_ALREADY_EXIST; + } + ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); + result = Either.right(responseFormat); + } + else { + result = Either.left(ModelConverter.convertFromToscaElement(stateChangeResult.left().value())); + } + } finally { + if (result == null || result.isRight()) { + BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState"); + if (inTransaction == false) { + log.debug("operation failed. do rollback"); + titanDao.rollback(); + } + } else { + if (inTransaction == false) { + log.debug("operation success. do commit"); + titanDao.commit(); + } } - ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - return Either.right(responseFormat); } - - return Either.left(stateChangeResult.left().value()); + return result; } @Override @@ -93,11 +121,11 @@ public class StartCertificationTransition extends LifeCycleTransition { log.debug("validate before start certification test. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier,component, componentType, lifecycleChangeInfo); if (userValidationResponse.isRight()) { return userValidationResponse; } - + if (oldState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN) || oldState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT)) { ResponseFormat error = componentUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_READY_FOR_CERTIFICATION, componentName, componentType.name().toLowerCase()); return Either.right(error); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/UndoCheckoutTransition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/UndoCheckoutTransition.java index fcb211bc3e..277cd173aa 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/UndoCheckoutTransition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/lifecycle/UndoCheckoutTransition.java @@ -21,25 +21,24 @@ package org.openecomp.sdc.be.components.lifecycle; import java.util.Arrays; -import java.util.List; - import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; -import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; -import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.User; -import org.openecomp.sdc.be.model.operations.api.ILifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation; +import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; +import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; -import org.openecomp.sdc.common.config.EcompErrorName; import org.openecomp.sdc.exception.ResponseFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,8 +49,8 @@ public class UndoCheckoutTransition extends LifeCycleTransition { private static Logger log = LoggerFactory.getLogger(CheckoutTransition.class.getName()); private ArtifactsBusinessLogic artifactsManager; - public UndoCheckoutTransition(ComponentsUtils componentUtils, ILifecycleOperation lifecycleOperation) { - super(componentUtils, lifecycleOperation); + public UndoCheckoutTransition(ComponentsUtils componentUtils, ToscaElementLifecycleOperation lifecycleOperation, ToscaOperationFacade toscaOperationFacade, TitanDao titanDao) { + super(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao); // authorized roles Role[] resourceServiceCheckoutRoles = { Role.ADMIN, Role.DESIGNER }; @@ -86,7 +85,7 @@ public class UndoCheckoutTransition extends LifeCycleTransition { log.debug("validate before undo checkout. resource name={}, oldState={}, owner userId={}", componentName, oldState, owner.getUserId()); // validate user - Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier, componentType, lifecycleChangeInfo); + Either<Boolean, ResponseFormat> userValidationResponse = userRoleValidation(modifier,component, componentType, lifecycleChangeInfo); if (userValidationResponse.isRight()) { return userValidationResponse; } @@ -111,59 +110,29 @@ public class UndoCheckoutTransition extends LifeCycleTransition { Either<? extends Component, ResponseFormat> result = null; log.debug("start performing undo-checkout for resource {}", component.getUniqueId()); - Either<List<ArtifactDefinition>, StorageOperationStatus> artifactsRes = lifeCycleOperation.getComponentOperation(componentType.getNodeType()).getComponentArtifactsForDelete(component.getUniqueId(), componentType.getNodeType(), true); - if (artifactsRes.isRight()) { - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(artifactsRes.right().value()); - ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - result = Either.right(responseFormat); - return result; - } - // TODO - start transaction try { - NodeTypeEnum nodeType = componentType.getNodeType(); - - // 1. perform undo checkout on graph (update status and delete - // current version) - Either<? extends Component, StorageOperationStatus> undoCheckoutResourceResult = lifeCycleOperation.undoCheckout(nodeType, component, modifier, owner, true); + Either<ToscaElement, StorageOperationStatus> undoCheckoutResourceResult = lifeCycleOperation.undoCheckout(component.getUniqueId()); if (undoCheckoutResourceResult.isRight()) { log.debug("checkout failed on graph"); StorageOperationStatus response = undoCheckoutResourceResult.right().value(); ActionStatus actionStatus = componentUtils.convertFromStorageResponse(response); ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - result = Either.right(responseFormat); - return result; + result = Either.right(responseFormat); } - - // 2. delete unrelated artifacts - // use artifacts API to delete artifacts from swift / elasticsearch - - if (artifactsRes.left().value() != null) { - List<ArtifactDefinition> artifacts = artifactsRes.left().value(); - StorageOperationStatus deleteAllResourceArtifacts = artifactsManager.deleteAllComponentArtifactsIfNotOnGraph(artifacts); - - if (!deleteAllResourceArtifacts.equals(StorageOperationStatus.OK)) { - ActionStatus actionStatus = componentUtils.convertFromStorageResponse(deleteAllResourceArtifacts); - ResponseFormat responseFormat = componentUtils.getResponseFormatByComponent(actionStatus, component, componentType); - result = Either.right(responseFormat); - return result; - } + else { + result = Either.left(ModelConverter.convertFromToscaElement(undoCheckoutResourceResult.left().value())); } - - result = Either.left(undoCheckoutResourceResult.left().value()); } finally { if (result == null || result.isRight()) { - BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeDaoSystemError, "Change LifecycleState - Undo Checkout failed on graph"); BeEcompErrorManager.getInstance().logBeDaoSystemError("Change LifecycleState - Undo Checkout failed on graph"); - log.debug("operation failed. do rollback"); - lifeCycleOperation.getResourceOperation().getTitanGenericDao().rollback(); + titanDao.rollback(); } else { log.debug("operation success. do commit"); - lifeCycleOperation.getResourceOperation().getTitanGenericDao().commit(); + titanDao.commit(); } } - return result; } |