/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.server.core.common;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import org.hibernate.validator.constraints.Range;
import com.abiquo.model.validation.LimitRange;
import com.softwarementors.validation.constraints.Required;
@MappedSuperclass
public abstract class DefaultEntityWithLimits extends DefaultEntityBase
{
public static final long NO_LIMIT = 0;
public final static String RAM_SOFT_LIMIT_IN_MB_PROPERTY = "ramSoftLimitInMb";
/* package */final static String RAM_SOFT_LIMIT_IN_MB_COLUMN = "ramSoft";
/* package */final static long RAM_SOFT_LIMIT_IN_MB_MIN = NO_LIMIT;
/* package */final static long RAM_SOFT_LIMIT_IN_MB_MAX = Long.MAX_VALUE;
/* package */final static boolean RAM_SOFT_LIMIT_IN_MB_REQUIRED = true;
@Column(name = RAM_SOFT_LIMIT_IN_MB_COLUMN, nullable = false)
@Range(min = RAM_SOFT_LIMIT_IN_MB_MIN, max = RAM_SOFT_LIMIT_IN_MB_MAX)
private Long ramSoftLimitInMb;
@Required(value = RAM_SOFT_LIMIT_IN_MB_REQUIRED)
public Long getRamSoftLimitInMb()
{
return this.ramSoftLimitInMb;
}
private void setRamSoftLimitInMb(Long ramSoftLimitInMb)
{
this.ramSoftLimitInMb = ramSoftLimitInMb;
}
public final static String CPU_COUNT_SOFT_LIMIT_PROPERTY = "cpuCountSoftLimit";
/* package */final static String CPU_COUNT_SOFT_LIMIT_COLUMN = "cpuSoft";
/* package */final static long CPU_COUNT_SOFT_LIMIT_MIN = NO_LIMIT;
/* package */final static long CPU_COUNT_SOFT_LIMIT_MAX = Long.MAX_VALUE;
/* package */final static boolean CPU_COUNT_SOFT_LIMIT_REQUIRED = true;
@Column(name = CPU_COUNT_SOFT_LIMIT_COLUMN, nullable = false)
@Range(min = CPU_COUNT_SOFT_LIMIT_MIN, max = CPU_COUNT_SOFT_LIMIT_MAX)
private Long cpuCountSoftLimit;
@Required(value = CPU_COUNT_SOFT_LIMIT_REQUIRED)
public Long getCpuCountSoftLimit()
{
return cpuCountSoftLimit;
}
private void setCpuCountSoftLimit(Long cpuCountSoftLimit)
{
this.cpuCountSoftLimit = cpuCountSoftLimit;
}
public final static String HD_SOFT_LIMIT_IN_MB_PROPERTY = "hdSoftLimitInMb";
/* package */final static String HD_SOFT_LIMIT_IN_MB_COLUMN = "hdSoft";
/* package */final static long HD_SOFT_LIMIT_IN_MB_MIN = NO_LIMIT;
/* package */final static long HD_SOFT_LIMIT_IN_MB_MAX = Long.MAX_VALUE;
/* package */final static boolean HD_SOFT_LIMIT_IN_MB_REQUIRED = true;
@Column(name = HD_SOFT_LIMIT_IN_MB_COLUMN, nullable = false)
@Range(min = HD_SOFT_LIMIT_IN_MB_MIN, max = HD_SOFT_LIMIT_IN_MB_MAX)
private long hdSoftLimitInMb;
@Required(value = HD_SOFT_LIMIT_IN_MB_REQUIRED)
public long getHdSoftLimitInMb()
{
return this.hdSoftLimitInMb;
}
private void setHdSoftLimitInMb(long hdSoftLimitInMb)
{
this.hdSoftLimitInMb = hdSoftLimitInMb;
}
public final static String RAM_HARD_LIMIT_IN_MB_PROPERTY = "ramHardLimitInMb";
/* package */final static String RAM_HARD_LIMIT_IN_MB_COLUMN = "ramHard";
/* package */final static long RAM_HARD_LIMIT_IN_MB_MIN = NO_LIMIT;
/* package */final static long RAM_HARD_LIMIT_IN_MB_MAX = Integer.MAX_VALUE;
/* package */final static boolean RAM_HARD_LIMIT_IN_MB_REQUIRED = true;
@Column(name = RAM_HARD_LIMIT_IN_MB_COLUMN, nullable = false)
@Range(min = RAM_HARD_LIMIT_IN_MB_MIN, max = RAM_HARD_LIMIT_IN_MB_MAX)
private Long ramHardLimitInMb;
@Required(value = RAM_HARD_LIMIT_IN_MB_REQUIRED)
public Long getRamHardLimitInMb()
{
return this.ramHardLimitInMb;
}
private void setRamHardLimitInMb(Long ramHardLimitInMb)
{
this.ramHardLimitInMb = ramHardLimitInMb;
}
public final static String CPU_COUNT_HARD_LIMIT_PROPERTY = "cpuCountHardLimit";
/* package */final static String CPU_COUNT_HARD_LIMIT_COLUMN = "cpuHard";
/* package */final static long CPU_COUNT_HARD_LIMIT_MIN = NO_LIMIT;
/* package */final static long CPU_COUNT_HARD_LIMIT_MAX = Long.MAX_VALUE;
/* package */final static boolean CPU_COUNT_HARD_LIMIT_REQUIRED = true;
@Column(name = CPU_COUNT_HARD_LIMIT_COLUMN, nullable = false)
@Range(min = CPU_COUNT_HARD_LIMIT_MIN, max = CPU_COUNT_HARD_LIMIT_MAX)
private Long cpuCountHardLimit;
@Required(value = CPU_COUNT_HARD_LIMIT_REQUIRED)
public Long getCpuCountHardLimit()
{
return this.cpuCountHardLimit;
}
private void setCpuCountHardLimit(Long cpuCountHardLimit)
{
this.cpuCountHardLimit = cpuCountHardLimit;
}
public final static String HD_HARD_LIMIT_IN_MB_PROPERTY = "hdHardLimitInMb";
/* package */final static String HD_HARD_LIMIT_IN_MB_COLUMN = "hdHard";
/* package */final static long HD_HARD_LIMIT_IN_MB_MIN = NO_LIMIT;
/* package */final static long HD_HARD_LIMIT_IN_MB_MAX = Long.MAX_VALUE;
/* package */final static boolean HD_HARD_LIMIT_IN_MB_REQUIRED = true;
@Column(name = HD_HARD_LIMIT_IN_MB_COLUMN, nullable = false)
@Range(min = HD_HARD_LIMIT_IN_MB_MIN, max = HD_HARD_LIMIT_IN_MB_MAX)
private long hdHardLimitInMb;
@Required(value = HD_HARD_LIMIT_IN_MB_REQUIRED)
public long getHdHardLimitInMb()
{
return this.hdHardLimitInMb;
}
private void setHdHardLimitInMb(long hdHardLimitInMb)
{
this.hdHardLimitInMb = hdHardLimitInMb;
}
public final static String STORAGE_HARD_PROPERTY = "storageHard";
/* package */final static String STORAGE_HARD_COLUMN = "storageHard";
/* package */final static long STORAGE_HARD_MIN = Long.MIN_VALUE;
/* package */final static long STORAGE_HARD_MAX = Long.MAX_VALUE;
/* package */final static boolean STORAGE_HARD_REQUIRED = true;
@Column(name = STORAGE_HARD_COLUMN, nullable = false)
@Range(min = STORAGE_HARD_MIN, max = STORAGE_HARD_MAX)
private long storageHard;
@Required(value = STORAGE_HARD_REQUIRED)
public long getStorageHard()
{
return this.storageHard;
}
private void setStorageHard(long storageHard)
{
this.storageHard = storageHard;
}
public final static String STORAGE_SOFT_PROPERTY = "storageSoft";
/* package */final static String STORAGE_SOFT_COLUMN = "storageSoft";
/* package */final static long STORAGE_SOFT_MIN = Long.MIN_VALUE;
/* package */final static long STORAGE_SOFT_MAX = Long.MAX_VALUE;
/* package */final static boolean STORAGE_SOFT_REQUIRED = true;
@Column(name = STORAGE_SOFT_COLUMN, nullable = false)
@Range(min = STORAGE_SOFT_MIN, max = STORAGE_SOFT_MAX)
private long storageSoft;
@Required(value = STORAGE_SOFT_REQUIRED)
public long getStorageSoft()
{
return this.storageSoft;
}
private void setStorageSoft(long storageSoft)
{
this.storageSoft = storageSoft;
}
public final static String PUBLIC_VLAN_HARD_PROPERTY = "vlanHard";
/* package */final static String PUBLIC_VLAN_HARD_COLUMN = "vlanHard";
/* package */final static long PUBLIC_VLAN_HARD_MIN = Long.MIN_VALUE;
/* package */final static long PUBLIC_VLAN_HARD_MAX = Long.MAX_VALUE;
/* package */final static boolean PUBLIC_VLAN_HARD_REQUIRED = true;
@Column(name = PUBLIC_VLAN_HARD_COLUMN, nullable = false)
@Range(min = PUBLIC_VLAN_HARD_MIN, max = PUBLIC_VLAN_HARD_MAX)
private long vlanHard;
@Required(value = PUBLIC_VLAN_HARD_REQUIRED)
public long getVlanHard()
{
return this.vlanHard;
}
private void setVlanHard(long vlanHard)
{
this.vlanHard = vlanHard;
}
public final static String PUBLIC_VLAN_SOFT_PROPERTY = "vlanSoft";
/* package */final static String PUBLIC_VLAN_SOFT_COLUMN = "vlanSoft";
/* package */final static long PUBLIC_VLAN_SOFT_MIN = Long.MIN_VALUE;
/* package */final static long PUBLIC_VLAN_SOFT_MAX = Long.MAX_VALUE;
/* package */final static boolean PUBLIC_VLAN_SOFT_REQUIRED = true;
@Column(name = PUBLIC_VLAN_SOFT_COLUMN, nullable = false)
@Range(min = PUBLIC_VLAN_SOFT_MIN, max = PUBLIC_VLAN_SOFT_MAX)
private long vlanSoft;
@Required(value = PUBLIC_VLAN_SOFT_REQUIRED)
public long getVlanSoft()
{
return this.vlanSoft;
}
private void setVlanSoft(long vlanSoft)
{
this.vlanSoft = vlanSoft;
}
public final static String PUBLIC_IP_HARD_PROPERTY = "publicIpsHard";
/* package */final static String PUBLIC_IP_HARD_COLUMN = "publicIpHard";
/* package */final static long PUBLIC_IP_HARD_MIN = Long.MIN_VALUE;
/* package */final static long PUBLIC_IP_HARD_MAX = Long.MAX_VALUE;
/* package */final static boolean PUBLIC_IP_HARD_REQUIRED = true;
@Column(name = PUBLIC_IP_HARD_COLUMN, nullable = false)
@Range(min = PUBLIC_IP_HARD_MIN, max = PUBLIC_IP_HARD_MAX)
private long publicIpsHard;
@Required(value = PUBLIC_IP_HARD_REQUIRED)
public long getPublicIpsHard()
{
return this.publicIpsHard;
}
private void setPublicIpsHard(long publicIPHard)
{
this.publicIpsHard = publicIPHard;
}
public final static String PUBLIC_IP_SOFT_PROPERTY = "publicIpsSoft";
/* package */final static String PUBLIC_IP_SOFT_COLUMN = "publicIpSoft";
/* package */final static long PUBLIC_IP_SOFT_MIN = Long.MIN_VALUE;
/* package */final static long PUBLIC_IP_SOFT_MAX = Long.MAX_VALUE;
/* package */final static boolean PUBLIC_IP_SOFT_REQUIRED = true;
@Column(name = PUBLIC_IP_SOFT_COLUMN, nullable = false)
@Range(min = PUBLIC_IP_SOFT_MIN, max = PUBLIC_IP_SOFT_MAX)
private long publicIpsSoft;
@Required(value = PUBLIC_IP_SOFT_REQUIRED)
public long getPublicIpsSoft()
{
return this.publicIpsSoft;
}
private void setPublicIpsSoft(long publicIPSoft)
{
this.publicIpsSoft = publicIPSoft;
}
@LimitRange(type = "storage")
public Limit getStorageLimits()
{
return new Limit(storageSoft, storageHard);
}
public void setStorageLimits(Limit limit)
{
setStorageLimits(limit.soft, limit.hard);
}
private void setStorageLimits(long softLimit, long hardLimit)
{
setStorageSoft(softLimit);
setStorageHard(hardLimit);
}
@LimitRange(type = "vlans")
public Limit getVlansLimits()
{
return new Limit(vlanSoft, vlanHard);
}
public void setVlansLimits(Limit limit)
{
setVlansLimits(limit.soft, limit.hard);
}
private void setVlansLimits(long softLimit, long hardLimit)
{
setVlanSoft(softLimit);
setVlanHard(hardLimit);
}
@LimitRange(type = "publicIP")
public Limit getPublicIPLimits()
{
return new Limit(publicIpsSoft, publicIpsHard);
}
public void setPublicIPLimits(Limit limit)
{
setPublicIPLimits(limit.soft, limit.hard);
}
private void setPublicIPLimits(long softLimit, long hardLimit)
{
setPublicIpsSoft(softLimit);
setPublicIpsHard(hardLimit);
}
@LimitRange(type = "ram")
public Limit getRamLimitsInMb()
{
return new Limit(ramSoftLimitInMb, ramHardLimitInMb);
}
public void setRamLimitsInMb(Limit limit)
{
setRamLimitsInMb(limit.soft, limit.hard);
}
private void setRamLimitsInMb(long softLimit, long hardLimit)
{
setRamSoftLimitInMb(softLimit);
setRamHardLimitInMb(hardLimit);
}
@LimitRange(type = "cpu")
public Limit getCpuCountLimits()
{
return new Limit(cpuCountSoftLimit, cpuCountHardLimit);
}
public void setCpuCountLimits(Limit limit)
{
setCpuCountLimits(limit.soft, limit.hard);
}
private void setCpuCountLimits(long softLimit, long hardLimit)
{
setCpuCountSoftLimit(softLimit);
setCpuCountHardLimit(hardLimit);
}
@LimitRange(type = "hd")
public Limit getHdLimitsInMb()
{
return new Limit(hdSoftLimitInMb, hdHardLimitInMb);
}
public void setHdLimitsInMb(Limit limit)
{
setHdLimitsInMb(limit.soft, limit.hard);
}
private void setHdLimitsInMb(long softLimit, long hardLimit)
{
setHdSoftLimitInMb(softLimit);
setHdHardLimitInMb(hardLimit);
}
public static boolean isValidLimitRange(long softLimit, long hardLimit)
{
if (softLimit < 0 || hardLimit < 0)
{
return false;
}
return (softLimit == NO_LIMIT && hardLimit == NO_LIMIT)
|| (softLimit >= NO_LIMIT && hardLimit == NO_LIMIT)
|| (softLimit != NO_LIMIT && softLimit <= hardLimit);
}
public enum LimitStatus
{
OK, SOFT_LIMIT, HARD_LIMIT
}
// Should be private, but made package for testing purposes
public static LimitStatus checkLimitStatus(long softLimit, long hardLimit, long current)
{
assert isValidLimitRange(softLimit, hardLimit);
if (softLimit == NO_LIMIT)
return LimitStatus.OK;
if (hardLimit == NO_LIMIT)
return LimitStatus.OK;
if (current > hardLimit)
return LimitStatus.HARD_LIMIT;
if (softLimit <= current)
return LimitStatus.SOFT_LIMIT;
return LimitStatus.OK;
}
public LimitStatus checkRamStatus(int currentUsedRam)
{
return checkLimitStatus(getRamSoftLimitInMb(), getRamHardLimitInMb(), currentUsedRam);
}
public LimitStatus checkCpuStatus(int currentUsedCpu)
{
return checkLimitStatus(getCpuCountSoftLimit(), getCpuCountHardLimit(), currentUsedCpu);
}
public LimitStatus checkHdStatus(long currentUsedHd)
{
return checkLimitStatus(getHdSoftLimitInMb(), getHdHardLimitInMb(), currentUsedHd);
}
public LimitStatus checkPublicIpStatus(long currentUsedIps)
{
return checkLimitStatus(getPublicIpsSoft(), getPublicIpsHard(), currentUsedIps);
}
public LimitStatus checkVlanStatus(long currentUsedVlan)
{
return checkLimitStatus(getVlanSoft(), getVlanHard(), currentUsedVlan);
}
public LimitStatus checkStorageStatus(long currentUsedStorage)
{
return checkLimitStatus(getStorageSoft(), getStorageHard(), currentUsedStorage);
}
}