package org.ovirt.engine.core.common.businessentities;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.ovirt.engine.core.common.validation.annotation.ValidName;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.compat.Guid;
/**
* Quota business entity which reflects the <code>Quota</code> limitations for storage pool. <BR/>
* The limitation are separated to two different types
* <ul>
* <li>General Limitation - Indicates the general limitation of the quota cross all the storage pool</li>
* <li>Specific Limitation - Indicates specific limitation of the quota for specific storage or vds group</li>
* </ul>
* <BR/>
* Quota entity encapsulate the specific limitations of the storage pool with lists, general limitations are configured
* in the field members.<BR/>
* <BR/>
* Take in notice there can not be general limitation and specific limitation on the same resource type.
*/
public class Quota implements IVdcQueryable, BusinessEntity<Guid>, Nameable {
/**
* Automatic generated serial version ID.
*/
private static final long serialVersionUID = 6637198348072059199L;
/**
* The quota id.
*/
private Guid id;
/**
* The storage pool id the quota is enforced on.
*/
@NotNull
private Guid storagePoolId;
/**
* The storage pool name the quota is enforced on, for GUI use.
*/
private String storagePoolName;
/**
* Flag if this quota is default for storage pool
*/
private boolean isDefault;
/**
* The quota name.
*/
@Size(min = 1, max = BusinessEntitiesDefinitions.QUOTA_NAME_SIZE)
@ValidName(message = "VALIDATION_QUOTA_NAME_INVALID", groups = { CreateEntity.class, UpdateEntity.class })
private String quotaName;
/**
* The quota description.
*/
@Size(min = 0, max = BusinessEntitiesDefinitions.QUOTA_DESCRIPTION_SIZE)
private String description;
/**
* The threshold of vds group in percentages.
*/
@Min(0)
@Max(100)
private int thresholdClusterPercentage;
/**
* The threshold of storage in percentages.
*/
@Min(0)
@Max(100)
private int thresholdStoragePercentage;
/**
* The grace of vds group in percentages.
*/
@Min(0)
@Max(100)
private int graceClusterPercentage;
/**
* The grace of storage in percentages.
*/
@Min(0)
@Max(100)
private int graceStoragePercentage;
/**
* The global quota vds group limit.
*/
private QuotaCluster globalQuotaCluster;
/**
* The global quota storage limit.
*/
private QuotaStorage globalQuotaStorage;
/**
* The quota enforcement type.
*/
private QuotaEnforcementTypeEnum quotaEnforcementType;
/**
* List of all the specific Cluster limitations.
*/
private List<QuotaCluster> quotaClusterList;
/**
* List of all the specific storage limitations.
*/
private List<QuotaStorage> quotaStorageList;
/**
* Default constructor of Quota, which initialize empty lists for specific limitations, and no user assigned.
*/
public Quota() {
setQuotaStorages(new ArrayList<QuotaStorage>());
setQuotaClusters(new ArrayList<QuotaCluster>());
id = Guid.Empty;
}
/**
* @return the quota id.
*/
public Guid getId() {
return id;
}
/**
* @param id
* the quota Id to set.
*/
public void setId(Guid id) {
this.id = id;
}
/**
* @return the thresholdClusterPercentage
*/
public int getThresholdClusterPercentage() {
return thresholdClusterPercentage;
}
/**
* @param thresholdClusterPercentage
* the thresholdClusterPercentage to set
*/
public void setThresholdClusterPercentage(int thresholdClusterPercentage) {
this.thresholdClusterPercentage = thresholdClusterPercentage;
}
/**
* @return the thresholdStoragePercentage
*/
public int getThresholdStoragePercentage() {
return thresholdStoragePercentage;
}
/**
* @param thresholdStoragePercentage
* the thresholdStoragePercentage to set
*/
public void setThresholdStoragePercentage(int thresholdStoragePercentage) {
this.thresholdStoragePercentage = thresholdStoragePercentage;
}
/**
* @return the graceClusterPercentage
*/
public int getGraceClusterPercentage() {
return graceClusterPercentage;
}
/**
* @param graceClusterPercentage
* the graceClusterPercentage to set
*/
public void setGraceClusterPercentage(int graceClusterPercentage) {
this.graceClusterPercentage = graceClusterPercentage;
}
/**
* @return the graceStoragePercentage
*/
public int getGraceStoragePercentage() {
return graceStoragePercentage;
}
/**
* @param graceStoragePercentage
* the graceStoragePercentage to set
*/
public void setGraceStoragePercentage(int graceStoragePercentage) {
this.graceStoragePercentage = graceStoragePercentage;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description
* the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return the quotaName
*/
public String getQuotaName() {
return quotaName;
}
@Override
public String getName() {
return getQuotaName();
}
/**
* @param quotaName
* the quotaName to set
*/
public void setQuotaName(String quotaName) {
this.quotaName = quotaName;
}
/**
* @return the storagePoolId
*/
public Guid getStoragePoolId() {
return storagePoolId;
}
/**
* @param storagePoolId
* the storagePoolId to set
*/
public void setStoragePoolId(Guid storagePoolId) {
this.storagePoolId = storagePoolId;
}
/**
* @return the storagePoolName
*/
public String getStoragePoolName() {
return storagePoolName;
}
/**
* @param storagePoolName
* the storagePoolName to set
*/
public void setStoragePoolName(String storagePoolName) {
this.storagePoolName = storagePoolName;
}
public boolean isDefault() {
return isDefault;
}
public void setDefault(boolean value) {
this.isDefault = value;
}
/**
* @return the quotaStorageList
*/
public List<QuotaStorage> getQuotaStorages() {
return quotaStorageList;
}
/**
* @param quotaStorages
* the quotaStorages to set
*/
public void setQuotaStorages(List<QuotaStorage> quotaStorages) {
this.quotaStorageList = quotaStorages;
}
/**
* @return the quotaClusters
*/
public List<QuotaCluster> getQuotaClusters() {
return quotaClusterList;
}
/**
* @param quotaClusters
* the quotaClusters to set
*/
public void setQuotaClusters(List<QuotaCluster> quotaClusters) {
this.quotaClusterList = quotaClusters;
}
/**
* @return the quotaEnforcementType
*/
public QuotaEnforcementTypeEnum getQuotaEnforcementType() {
return this.quotaEnforcementType;
}
/**
* @param quotaEnforcementType
* the quotaEnforcementType to set
*/
public void setQuotaEnforcementType(QuotaEnforcementTypeEnum quotaEnforcementType) {
this.quotaEnforcementType = quotaEnforcementType;
}
@Override
public Object getQueryableId() {
return getId();
}
/**
* @return If this there is a global storage limitation in the quota, returns true.
*/
public boolean isGlobalStorageQuota() {
return globalQuotaStorage != null;
}
/**
* @return If this there is a global vds group limitation in the quota, returns true.
*/
public boolean isGlobalClusterQuota() {
return globalQuotaCluster != null;
}
/**
* @return If the storage quota is empty, returns true.
*/
public boolean isEmptyStorageQuota() {
return globalQuotaStorage == null && (getQuotaStorages() == null || getQuotaStorages().isEmpty());
}
/**
* @return If the cluster quota is empty, returns true.
*/
public boolean isEmptyClusterQuota() {
return globalQuotaCluster == null && (getQuotaClusters() == null || getQuotaClusters().isEmpty());
}
@Override
public int hashCode() {
return Objects.hash(
id,
description,
globalQuotaStorage,
globalQuotaCluster,
graceStoragePercentage,
graceClusterPercentage,
quotaName,
quotaStorageList,
quotaClusterList,
storagePoolId,
thresholdStoragePercentage,
thresholdClusterPercentage
);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Quota)) {
return false;
}
Quota other = (Quota) obj;
return Objects.equals(id, other.id)
&& Objects.equals(description, other.description)
&& Objects.equals(globalQuotaStorage, other.globalQuotaStorage)
&& Objects.equals(globalQuotaCluster, other.globalQuotaCluster)
&& graceStoragePercentage == other.graceStoragePercentage
&& graceClusterPercentage == other.graceClusterPercentage
&& Objects.equals(quotaName, other.quotaName)
&& Objects.equals(quotaStorageList, other.quotaStorageList)
&& Objects.equals(quotaClusterList, other.quotaClusterList)
&& Objects.equals(storagePoolId, other.storagePoolId)
&& thresholdStoragePercentage == other.thresholdStoragePercentage
&& thresholdClusterPercentage == other.thresholdClusterPercentage;
}
public QuotaCluster getGlobalQuotaCluster() {
return globalQuotaCluster;
}
public void setGlobalQuotaCluster(QuotaCluster globalQuotaCluster) {
this.globalQuotaCluster = globalQuotaCluster;
}
public QuotaStorage getGlobalQuotaStorage() {
return globalQuotaStorage;
}
public void setGlobalQuotaStorage(QuotaStorage globalQuotaStorage) {
this.globalQuotaStorage = globalQuotaStorage;
}
}