bug 11289: return only Free ip addresses as available Ips as a part of listAccounts

status 11289: resolved fixed
This commit is contained in:
Alena Prokharchyk 2011-11-22 15:19:57 -08:00
parent 1642afacc6
commit 38b25f3466
5 changed files with 37 additions and 7 deletions

View File

@ -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<Long, Boolean>(map.getDomainId(), subdomainAccess);
}
public static long countFreePublicIps() {
return _ipAddressDao.countFreeIPs();
}
}

View File

@ -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);

View File

@ -57,4 +57,5 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
List<IPAddressVO> listByPhysicalNetworkId(long physicalNetworkId);
long countFreeIPs();
}

View File

@ -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<IPAddressVO, Long> implemen
protected final GenericSearchBuilder<IPAddressVO, Integer> AllIpCountForDashboard;
protected final GenericSearchBuilder<IPAddressVO, Long> AllocatedIpCountForAccount;
protected final VlanDaoImpl _vlanDao = ComponentLocator.inject(VlanDaoImpl.class);
protected GenericSearchBuilder<IPAddressVO, Long> CountFreePublicIps;
// make it public for JUnit test
@ -113,6 +114,14 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> 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<VlanVO> 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<IPAddressVO, Long> implemen
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
sc.setParameters("physicalNetworkId", physicalNetworkId);
return listBy(sc);
}
}
@Override
public long countFreeIPs() {
SearchCriteria<Long> sc = CountFreePublicIps.create();
sc.setParameters("state", State.Free);
sc.setJoinParameters("vlans", "vlanType", VlanType.VirtualNetwork);
return customSearch(sc, null).get(0);
}
}

View File

@ -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;