ofri masad has uploaded a new change for review. Change subject: core: Quota refactor - parameters ......................................................................
core: Quota refactor - parameters First step to Quota refactor. Adding Objects for Quota consumption parameters Adding InvalidQuotaParametersException Change-Id: Iebfc85569ba1aa8bd840f7239f83b7f921a4bd8e Signed-off-by: Ofri Masad <oma...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/InvalidQuotaParametersException.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameter.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameters.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParametersMetaData.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageConsumptionParameter.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageDependent.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsConsumptionParameter.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsDependent.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 10 files changed, 517 insertions(+), 10 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/8775/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java index fcffeed..e397a70 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java @@ -22,7 +22,12 @@ import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.job.ExecutionContext; import org.ovirt.engine.core.bll.job.ExecutionHandler; -import org.ovirt.engine.core.bll.quota.QuotaManager; +import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter; +import org.ovirt.engine.core.bll.quota.QuotaVdsConsumptionParameter; +import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; +import org.ovirt.engine.core.bll.quota.QuotaVdsDependent; +import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameters; +import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter; import org.ovirt.engine.core.bll.quota.Quotable; import org.ovirt.engine.core.bll.session.SessionDataContainer; import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils; @@ -509,7 +514,7 @@ try { returnValue = isUserAuthorizedToRunAction() && isBackwardsCompatible() && validateInputs() && acquireLock() - && canDoAction(); + && internalValidateAndSetQuota() && canDoAction(); if (returnValue && this instanceof Quotable) { returnValue &= ((Quotable) this).validateAndSetQuota(); } @@ -534,6 +539,67 @@ return returnValue; } + private boolean internalValidateAndSetQuota() { + if (isInternalExecution()) { + return true; + } + + VdcActionType.QuotaDependency quotaDependency = this.getActionType().getQuotaDependency(); + List<QuotaConsumptionParameter> consumptionParameters = new ArrayList<QuotaConsumptionParameter>(); + QuotaConsumptionParameters quotaConsumptionParameters = new QuotaConsumptionParameters( + this.getStoragePool(), this.getStoragePool().getId(), + this.getReturnValue().getCanDoActionMessages(), this); + + try { + switch (quotaDependency) { + case NONE: + return true; + case STORAGE: + getInternalStorageParameters(consumptionParameters); + break; + case VDS: + getInternalVdsParameters(consumptionParameters); + break; + case BOTH: + getInternalStorageParameters(consumptionParameters); + getInternalStorageParameters(consumptionParameters); + break; + } + } catch (ClassCastException e) { + log.error("Command: " + this.getClass().getName() + + ". Quota handling was expected - class does not implement the expected interface"); + } + + if (!consumptionParameters.isEmpty()) { + // TODO - implemented in next patch - return QuotaManager.getInstance().consume(quotaConsumptionParameters); + return true; + } else { + return true; + } + } + + private void getInternalVdsParameters(List<QuotaConsumptionParameter> consumptionParameters) { + List<QuotaVdsConsumptionParameter> vdsParameters; + vdsParameters = ((QuotaVdsDependent) this).getQuotaVdsConsumptionParameters(); + if (null == vdsParameters || vdsParameters.isEmpty()) { + log.error("Command: " + this.getClass().getName() + + ". Quota handling was expected - returned empty parameters"); + } else { + consumptionParameters.addAll(vdsParameters); + } + } + + private void getInternalStorageParameters(List<QuotaConsumptionParameter> consumptionParameters) { + List<QuotaStorageConsumptionParameter> storageParameters; + storageParameters = ((QuotaStorageDependent) this).getQuotaStorageConsumptionParameters(); + if (null == storageParameters || storageParameters.isEmpty()) { + log.error("Command: " + this.getClass().getName() + + ". Quota handling was expected - returned empty parameters"); + } else { + consumptionParameters.addAll(storageParameters); + } + } + /** * @return true if all parameters class and its inner members passed * validation diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/InvalidQuotaParametersException.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/InvalidQuotaParametersException.java new file mode 100644 index 0000000..1a6a4bf --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/InvalidQuotaParametersException.java @@ -0,0 +1,18 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.compat.ApplicationException; + +public class InvalidQuotaParametersException extends ApplicationException implements java.io.Serializable { + private static final long serialVersionUID = -1759699263394287888L; + + public InvalidQuotaParametersException() { + } + + public InvalidQuotaParametersException(String errorStr){ + super(errorStr); + } + + public InvalidQuotaParametersException(String errorStr, Throwable cause) { + super("InvalidQuotaParametersException: " + errorStr, cause); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameter.java new file mode 100644 index 0000000..abb079b --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameter.java @@ -0,0 +1,53 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.compat.Guid; + +public abstract class QuotaConsumptionParameter { + protected Guid quotaGuid; + protected Quota quota; + protected Action action = Action.CONSUME; + protected boolean approved; + + public Guid getQuotaGuid() { + return quotaGuid; + } + + public void setQuotaGuid(Guid quotaGuid) { + this.quotaGuid = quotaGuid; + } + + public Quota getQuota() { + return quota; + } + + public void setQuota(Quota quota) { + this.quota = quota; + } + + public Action getAction() { + return this.action; + } + + public void setAction(Action action) { + this.action = action; + } + + public abstract QuotaConsumptionParameter clone(); + + public void revert() { + this.action = Action.CONSUME.equals(action) ? Action.RELEASE : Action.CONSUME; + } + + public enum Action { + CONSUME, RELEASE + } + + public boolean isApproved() { + return this.approved; + } + + public void setApproved(boolean approved) { + this.approved = approved; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameters.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameters.java new file mode 100644 index 0000000..b3bbb76 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParameters.java @@ -0,0 +1,118 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; + +import java.util.ArrayList; +import java.util.List; + +public class QuotaConsumptionParameters { + + private List<QuotaConsumptionParameter> parameters; + + private QuotaConsumptionParametersMetaData metaData; + + public QuotaConsumptionParameters(storage_pool storage_pool, + Guid storagePoolGuid, + ArrayList<String> canDoActionMessages, + AuditLogableBase auditLogable) { + this.metaData.setStorage_pool(storage_pool); + this.metaData.setStoragePoolGuid(storagePoolGuid); + this.metaData.setCanDoActionMessages(canDoActionMessages); + this.metaData.setAuditLogable(auditLogable); + } + + public storage_pool getStorage_pool() { + return metaData.getStorage_pool(); + } + + public void setStorage_pool(storage_pool storage_pool) { + this.metaData.setStorage_pool(storage_pool); + } + + public Guid getStoragePoolGuid() { + return metaData.getStoragePoolGuid(); + } + + public List<QuotaConsumptionParameter> getParameters() { + return parameters; + } + + public void setParameters(List<QuotaConsumptionParameter> parameters) { + this.parameters = parameters; + } + + public List<QuotaStorageConsumptionParameter> getQuotaStorageConsumptionParameters() { + List<QuotaStorageConsumptionParameter> list = new ArrayList<QuotaStorageConsumptionParameter>(); + for (QuotaConsumptionParameter parameter : getParameters()){ + if (parameter instanceof QuotaStorageConsumptionParameter) { + list.add((QuotaStorageConsumptionParameter) parameter); + } + } + return list; + } + + public List<QuotaVdsConsumptionParameter> getQuotaVdsConsumptionParameters() { + List<QuotaVdsConsumptionParameter> list = new ArrayList<QuotaVdsConsumptionParameter>(); + for (QuotaConsumptionParameter parameter : getParameters()){ + if (parameter instanceof QuotaVdsConsumptionParameter) { + list.add((QuotaVdsConsumptionParameter) parameter); + } + } + return list; + } + + public ArrayList<String> getCanDoActionMessages() { + return metaData.getCanDoActionMessages(); + } + + public void setCanDoActionMessages(ArrayList<String> canDoActionMessages) { + this.metaData.setCanDoActionMessages(canDoActionMessages); + } + + public AuditLogableBase getAuditLogable() { + return metaData.getAuditLogable(); + } + + public void setAuditLogable(AuditLogableBase auditLogable) { + this.metaData.setAuditLogable(auditLogable); + } + + public QuotaConsumptionParameters clone() { + QuotaConsumptionParameters clone = new QuotaConsumptionParameters( + this.getStorage_pool(), + this.getStoragePoolGuid(), + this.getCanDoActionMessages(), + this.getAuditLogable()); + clone.setParameters(new ArrayList<QuotaConsumptionParameter>()); + + for (QuotaConsumptionParameter parameter : this.getParameters()) { + clone.getParameters().add(parameter.clone()); + } + + return clone; + } + + /** + * Revert the numbers of all requested cpu, memory and storage + */ + public void revert() { + for (QuotaConsumptionParameter parameter : this.getParameters()) { + parameter.revert(); + } + } + + public QuotaConsumptionParametersMetaData getMetaData() { + return metaData; + } + + public void setMetaData(QuotaConsumptionParametersMetaData metaData) { + this.metaData = metaData; + } + + public Guid getTransactionId() { + return this.metaData.getTransactionID(); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParametersMetaData.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParametersMetaData.java new file mode 100644 index 0000000..b0109ed --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaConsumptionParametersMetaData.java @@ -0,0 +1,69 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; + +import java.util.ArrayList; + +public class QuotaConsumptionParametersMetaData { + private org.ovirt.engine.core.common.businessentities.storage_pool storage_pool; + private Guid storagePoolGuid; + private ArrayList<String> canDoActionMessages; + private AuditLogableBase auditLogable; + private Guid transactionID = Guid.NewGuid(); + + public QuotaConsumptionParametersMetaData(storage_pool storage_pool, + Guid storagePoolGuid, + ArrayList<String> canDoActionMessages, + AuditLogableBase auditLogable) { + this.storage_pool = storage_pool; + this.storagePoolGuid = storagePoolGuid; + this.canDoActionMessages = canDoActionMessages; + this.auditLogable = auditLogable; + } + + public storage_pool getStorage_pool() { + return storage_pool; + } + + public void setStorage_pool(storage_pool storage_pool) { + this.storage_pool = storage_pool; + } + + public Guid getStoragePoolGuid() { + return storagePoolGuid; + } + + public void setStoragePoolGuid(Guid storagePoolGuid) { + this.storagePoolGuid = storagePoolGuid; + } + + public ArrayList<String> getCanDoActionMessages() { + return canDoActionMessages; + } + + public void setCanDoActionMessages(ArrayList<String> canDoActionMessages) { + this.canDoActionMessages = canDoActionMessages; + } + + public AuditLogableBase getAuditLogable() { + return auditLogable; + } + + public void setAuditLogable(AuditLogableBase auditLogable) { + this.auditLogable = auditLogable; + } + + public QuotaConsumptionParametersMetaData clone() { + return new QuotaConsumptionParametersMetaData( + this.storage_pool, + this.storagePoolGuid, + this.canDoActionMessages, + this.auditLogable); + } + + public Guid getTransactionID() { + return transactionID; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageConsumptionParameter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageConsumptionParameter.java new file mode 100644 index 0000000..66de6ac --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageConsumptionParameter.java @@ -0,0 +1,49 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.compat.Guid; + +public class QuotaStorageConsumptionParameter extends QuotaConsumptionParameter { + + private Guid storageDomainId; + private long requestedStorageGB; + + public QuotaStorageConsumptionParameter(Guid quotaGuid, + Quota quota, + Action action, + Guid storageDomainId, + long requestedStorageGB) { + this.quotaGuid = quotaGuid; + this.quota = quota; + this.action = action; + this.storageDomainId = storageDomainId; + this.requestedStorageGB = requestedStorageGB; + } + + public Guid getStorageDomainId() { + return storageDomainId; + } + + public void setStorageDomainId(Guid storageDomainId) { + this.storageDomainId = storageDomainId; + } + + public long getRequestedStorageGB() { + return requestedStorageGB; + } + + public void setRequestedStorageGB(long requestedStorageGB) { + this.requestedStorageGB = requestedStorageGB; + } + + @Override + public QuotaStorageConsumptionParameter clone() { + return new QuotaStorageConsumptionParameter( + this.quotaGuid, + this.quota, + this.action, + this.storageDomainId, + this.requestedStorageGB); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageDependent.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageDependent.java new file mode 100644 index 0000000..f172623 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaStorageDependent.java @@ -0,0 +1,24 @@ +package org.ovirt.engine.core.bll.quota; + + +import java.util.List; + +/** + * Implement the QuotaStorageDependent interface to identify your command as one that dependent on + * Storage Quota calculation in order to run. If a Command handles disks, images, snapshots and so on - + * it should be QuotaStorageDependent. + */ +public interface QuotaStorageDependent { + + /** + * Get a list of the storage consumption parameters. + * Override this method in order to set the storage consumption parameters for the quota check. + * This method is called by CommandBase during the canDoAction check in order to make sure the + * command has sufficient quota resources in order to run. + * + * return null if the command does consume any storage resources. + * + * @return - list of storage consumption parameters. null if no consumption. + */ + public List<QuotaStorageConsumptionParameter> getQuotaStorageConsumptionParameters(); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsConsumptionParameter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsConsumptionParameter.java new file mode 100644 index 0000000..e4dafe4 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsConsumptionParameter.java @@ -0,0 +1,61 @@ +package org.ovirt.engine.core.bll.quota; + +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.compat.Guid; + +public class QuotaVdsConsumptionParameter extends QuotaConsumptionParameter { + + private Guid vdsGroupId; + private int requestedCpu; + private long requestedMemory; + + public QuotaVdsConsumptionParameter(Guid quotaGuid, + Quota quota, + Action action, + Guid vdsGroupId, + int requestedCpu, + long requestedMemory) { + this.quotaGuid = quotaGuid; + this.quota = quota; + this.action = action; + this.vdsGroupId = vdsGroupId; + this.requestedCpu = requestedCpu; + this.requestedMemory = requestedMemory; + } + + public Guid getVdsGroupId() { + return vdsGroupId; + } + + public void setVdsGroupId(Guid vdsGroupId) { + this.vdsGroupId = vdsGroupId; + } + + public int getRequestedCpu() { + return requestedCpu; + } + + public void setRequestedCpu(int requestedCpu) { + this.requestedCpu = requestedCpu; + } + + public long getRequestedMemory() { + return requestedMemory; + } + + public void setRequestedMemory(long requestedMemory) { + this.requestedMemory = requestedMemory; + } + + @Override + public QuotaVdsConsumptionParameter clone() { + return new QuotaVdsConsumptionParameter( + this.quotaGuid, + this.quota, + this.action, + this.vdsGroupId, + this.requestedCpu, + this.requestedMemory); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsDependent.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsDependent.java new file mode 100644 index 0000000..d878b66 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/quota/QuotaVdsDependent.java @@ -0,0 +1,24 @@ +package org.ovirt.engine.core.bll.quota; + + +import java.util.List; + +/** + * Implement the QuotaVdsDependent interface to identify your command as one that dependent on + * Vds(vcpu and/or memory) Quota calculation in order to run. If a Command handles vcpus and memory - + * it should be QuotaVdsDependent. + */ +public interface QuotaVdsDependent { + + /** + * Get a list of the vds consumption parameters. + * Override this method in order to set the vds consumption parameters for the quota check. + * This method is called by CommandBase during the canDoAction check in order to make sure the + * command has sufficient quota resources in order to run. + * + * return null if the command does consume any vds resources. + * + * @return - list of vds consumption parameters. null if no consumption. + */ + public List<QuotaVdsConsumptionParameter> getQuotaVdsConsumptionParameters(); +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index aea2376..c685c1d 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -262,6 +262,7 @@ private ActionGroup actionGroup; private boolean isActionMonitored = true; private static java.util.HashMap<Integer, VdcActionType> mappings = new HashMap<Integer, VdcActionType>(); + private QuotaDependency quotaDependency; static { for (VdcActionType action : values()) { @@ -270,24 +271,41 @@ } private VdcActionType(int value) { - this(value, null); + this(value, (ActionGroup) null); + } + + private VdcActionType(int value , QuotaDependency quotaDependency) { + this(value, null, quotaDependency); } private VdcActionType(int value, boolean isActionMonitored) { - this(value, null); - this.isActionMonitored = isActionMonitored; + this(value, null, isActionMonitored); + } + + private VdcActionType(int value, boolean isActionMonitored, QuotaDependency quotaDependency) { + this(value, null, isActionMonitored, quotaDependency); } private VdcActionType(int value, ActionGroup actionGroupValue) { - intValue = value; - actionGroup = actionGroupValue; + this(value, actionGroupValue, true); + } + + private VdcActionType(int value, ActionGroup actionGroupValue, QuotaDependency quotaDependency) { + this(value, actionGroupValue, true, quotaDependency); } private VdcActionType(int value, ActionGroup actionGroupValue, boolean isActionMonitored) { - intValue = value; - actionGroup = actionGroupValue; - this.isActionMonitored = isActionMonitored; + this(value, actionGroupValue, isActionMonitored, QuotaDependency.BOTH); } + + private VdcActionType(int value, ActionGroup actionGroupValue, boolean isActionMonitored, QuotaDependency quotaDependency) { + this.intValue = value; + this.actionGroup = actionGroupValue; + this.isActionMonitored = isActionMonitored; + this.quotaDependency = quotaDependency; + } + + public int getValue() { return intValue; @@ -305,4 +323,11 @@ return mappings.get(value); } + public QuotaDependency getQuotaDependency() { + return this.quotaDependency; + } + + public enum QuotaDependency { + NONE, STORAGE, VDS, BOTH + } } -- To view, visit http://gerrit.ovirt.org/8775 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iebfc85569ba1aa8bd840f7239f83b7f921a4bd8e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: ofri masad <oma...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches