package org.ovirt.engine.core.bll; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.action.QuotaCRUDParameters; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.common.businessentities.QuotaCluster; import org.ovirt.engine.core.common.businessentities.QuotaStorage; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.QuotaDao; public abstract class QuotaCRUDCommand extends CommandBase<QuotaCRUDParameters> { private Quota quota; @Inject private QuotaDao quotaDao; public QuotaCRUDCommand(QuotaCRUDParameters parameters, CommandContext cmdContext) { super(parameters, cmdContext); setStoragePoolId(getParameters().getQuota().getStoragePoolId()); } public Quota getQuota() { if (quota == null) { setQuota(quotaDao.getById(getParameters().getQuotaId())); } return quota; } public void setQuota(Quota quota) { this.quota = quota; } @Override protected boolean validate() { Quota quota = getParameters().getQuota(); // Cannot add or update a quota to be default using this command if (quota.isDefault()) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_QUOTA_IS_NOT_VALID); return false; } // Check if quota name exists or // If specific Quota for storage is specified or // If specific Quota for cluster is specific return validateQuotaNameIsUnique(quota) && validateQuotaStorageLimitation(quota) && validateQuotaClusterLimitation(quota); } public boolean validateQuotaNameIsUnique(Quota quota) { Quota quotaByName = quotaDao.getQuotaByQuotaName(quota.getQuotaName(), quota.getStoragePoolId()); // Check if there is no quota with the same name that already exists. if ((quotaByName != null) && !quotaByName.getId().equals(quota.getId())) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_NAME_ALREADY_USED); return false; } return true; } /** * Validate Quota storage restrictions. */ private boolean validateQuotaStorageLimitation(Quota quota) { boolean isValid = true; List<QuotaStorage> quotaStorageList = quota.getQuotaStorages(); if (quota.isGlobalStorageQuota() && (quotaStorageList != null && !quotaStorageList.isEmpty())) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_QUOTA_LIMIT_IS_SPECIFIC_AND_GENERAL); isValid = false; } return isValid; } /** * Validate Quota vds group restrictions. * * @param quota * - Quota we validate * @return Boolean value if the quota is valid or not. */ private boolean validateQuotaClusterLimitation(Quota quota) { boolean isValid = true; List<QuotaCluster> quotaClusterList = quota.getQuotaClusters(); if (quotaClusterList != null && !quotaClusterList.isEmpty()) { boolean isSpecificVirtualCpu = false; boolean isSpecificVirtualRam = false; for (QuotaCluster quotaCluster : quotaClusterList) { isSpecificVirtualCpu = quotaCluster.getVirtualCpu() != null; isSpecificVirtualRam = quotaCluster.getMemSizeMB() != null; } // if the global vds group limit was not specified, then specific limitation must be specified. if (quota.isGlobalClusterQuota() && (isSpecificVirtualRam || isSpecificVirtualCpu)) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_QUOTA_LIMIT_IS_SPECIFIC_AND_GENERAL); isValid = false; } } return isValid; } protected Guid getQuotaId() { return getQuota().getId(); } @Override public void addQuotaPermissionSubject(List<PermissionSubject> quotaPermissionList) { } public String getQuotaName() { return quota.getQuotaName(); } }