From 38b25f3466ade179345cf5d3c6d8de6e424b6325 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Tue, 22 Nov 2011 15:19:57 -0800 Subject: [PATCH] bug 11289: return only Free ip addresses as available Ips as a part of listAccounts status 11289: resolved fixed --- server/src/com/cloud/api/ApiDBUtils.java | 6 +++-- .../src/com/cloud/api/ApiResponseHelper.java | 13 ++++++++++- .../com/cloud/network/dao/IPAddressDao.java | 1 + .../cloud/network/dao/IPAddressDaoImpl.java | 23 ++++++++++++++++--- .../cloud/projects/dao/ProjectDaoImpl.java | 1 - 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 6ff46be579b..7305d042a5d 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -18,13 +18,11 @@ package com.cloud.api; -import java.util.EnumSet; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Set; -import com.cloud.api.ApiConstants.VMDetails; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; import com.cloud.capacity.CapacityVO; @@ -721,4 +719,8 @@ public class ApiDBUtils { return new Pair(map.getDomainId(), subdomainAccess); } + + public static long countFreePublicIps() { + return _ipAddressDao.countFreeIPs(); + } } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c0400fa7fdc..cafe772cb33 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -272,7 +272,18 @@ public class ApiResponseHelper implements ResponseGenerator { Long ipLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.public_ip, account.getId()); String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit); Long ipTotal = ApiDBUtils.getResourceCount(ResourceType.public_ip, account.getId()); - String ipAvail = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit - ipTotal); + + Long ips = ipLimit - ipTotal; + //check how many free ips are left, and if it's less than max allowed number of ips from account - use this value + Long ipsLeft = ApiDBUtils.countFreePublicIps(); + boolean unlimited = true; + if (ips.longValue() > ipsLeft.longValue()) { + ips = ipsLeft; + unlimited = false; + } + + String ipAvail = ((accountIsAdmin || ipLimit == -1) && unlimited) ? "Unlimited" : String.valueOf(ips); + accountResponse.setIpLimit(ipLimitDisplay); accountResponse.setIpTotal(ipTotal); accountResponse.setIpAvailable(ipAvail); diff --git a/server/src/com/cloud/network/dao/IPAddressDao.java b/server/src/com/cloud/network/dao/IPAddressDao.java index 00cab334831..6ac5b4cd94d 100755 --- a/server/src/com/cloud/network/dao/IPAddressDao.java +++ b/server/src/com/cloud/network/dao/IPAddressDao.java @@ -57,4 +57,5 @@ public interface IPAddressDao extends GenericDao { List listByPhysicalNetworkId(long physicalNetworkId); + long countFreeIPs(); } diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java index 0a89f849228..751aa972e28 100755 --- a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -27,8 +27,8 @@ import javax.ejb.Local; import org.apache.log4j.Logger; -import com.cloud.dc.VlanVO; import com.cloud.dc.Vlan.VlanType; +import com.cloud.dc.VlanVO; import com.cloud.dc.dao.VlanDaoImpl; import com.cloud.network.IPAddressVO; import com.cloud.network.IpAddress.State; @@ -40,9 +40,9 @@ import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; @@ -58,6 +58,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen protected final GenericSearchBuilder AllIpCountForDashboard; protected final GenericSearchBuilder AllocatedIpCountForAccount; protected final VlanDaoImpl _vlanDao = ComponentLocator.inject(VlanDaoImpl.class); + protected GenericSearchBuilder CountFreePublicIps; // make it public for JUnit test @@ -113,6 +114,14 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen AllocatedIpCountForAccount.and("allocated", AllocatedIpCountForAccount.entity().getAllocatedTime(), Op.NNULL); AllocatedIpCountForAccount.and("network", AllocatedIpCountForAccount.entity().getAssociatedWithNetworkId(), Op.NNULL); AllocatedIpCountForAccount.done(); + + CountFreePublicIps = createSearchBuilder(Long.class); + CountFreePublicIps.select(null, Func.COUNT, null); + CountFreePublicIps.and("state", CountFreePublicIps.entity().getState(), SearchCriteria.Op.EQ); + SearchBuilder join = _vlanDao.createSearchBuilder(); + join.and("vlanType", join.entity().getVlanType(), Op.EQ); + CountFreePublicIps.join("vlans", join, CountFreePublicIps.entity().getVlanId(), join.entity().getId(), JoinBuilder.JoinType.INNER); + CountFreePublicIps.done(); } @Override @@ -309,5 +318,13 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("physicalNetworkId", physicalNetworkId); return listBy(sc); - } + } + + @Override + public long countFreeIPs() { + SearchCriteria sc = CountFreePublicIps.create(); + sc.setParameters("state", State.Free); + sc.setJoinParameters("vlans", "vlanType", VlanType.VirtualNetwork); + return customSearch(sc, null).get(0); + } } diff --git a/server/src/com/cloud/projects/dao/ProjectDaoImpl.java b/server/src/com/cloud/projects/dao/ProjectDaoImpl.java index 6760a918d67..e0df0b98407 100644 --- a/server/src/com/cloud/projects/dao/ProjectDaoImpl.java +++ b/server/src/com/cloud/projects/dao/ProjectDaoImpl.java @@ -7,7 +7,6 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.projects.Project; -import com.cloud.projects.ProjectInvitationVO; import com.cloud.projects.ProjectVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase;