From 0d3eaa63d6691cf79564bfa92e4387d292f98c4a Mon Sep 17 00:00:00 2001 From: Kishan Kavala Date: Fri, 18 Jan 2013 16:24:36 +0530 Subject: [PATCH] CLOUDSTACK-1010: Fix count issue for listHosts command --- .../com/cloud/api/commands/ListHostsCmd.java | 14 ++++++------- .../com/cloud/server/ManagementService.java | 5 +++-- .../cloud/server/ManagementServerImpl.java | 21 ++++++++++++------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListHostsCmd.java b/api/src/com/cloud/api/commands/ListHostsCmd.java index 87f13302a97..4f808ca11f8 100755 --- a/api/src/com/cloud/api/commands/ListHostsCmd.java +++ b/api/src/com/cloud/api/commands/ListHostsCmd.java @@ -161,11 +161,11 @@ public class ListHostsCmd extends BaseListCmd { @Override public void execute(){ - List result = new ArrayList(); - List hostsWithCapacity = new ArrayList(); - - if(getVirtualMachineId() != null){ - Pair, List> hostsForMigration = _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal()); + Pair,Integer> result; + List hostsWithCapacity = new ArrayList(); + + if(getVirtualMachineId() != null){ + Pair,Integer>, List> hostsForMigration = _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal()); result = hostsForMigration.first(); hostsWithCapacity = hostsForMigration.second(); }else{ @@ -174,7 +174,7 @@ public class ListHostsCmd extends BaseListCmd { ListResponse response = new ListResponse(); List hostResponses = new ArrayList(); - for (Host host : result) { + for (Host host : result.first()) { HostResponse hostResponse = _responseGenerator.createHostResponse(host, getDetails()); Boolean suitableForMigration = false; if(hostsWithCapacity.contains(host)){ @@ -185,7 +185,7 @@ public class ListHostsCmd extends BaseListCmd { hostResponses.add(hostResponse); } - response.setResponses(hostResponses); + response.setResponses(hostResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index 7532cae2a64..d4a8e1b04a9 100755 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -87,6 +87,7 @@ import com.cloud.storage.GuestOsCategory; import com.cloud.storage.StoragePool; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.SSHKeyPair; +import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.vm.InstanceGroup; import com.cloud.vm.VirtualMachine; @@ -154,7 +155,7 @@ public interface ManagementService { * @param cmd * @return List of Hosts */ - List searchForServers(ListHostsCmd cmd); + Pair, Integer> searchForServers(ListHostsCmd cmd); /** * Creates a new template @@ -435,7 +436,7 @@ public interface ManagementService { * @return Pair, List> List of all Hosts in VM's cluster and list of Hosts with * enough capacity */ - Pair, List> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize); + Pair, Integer>, List> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize); String[] listEventTypes(); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 500c067fbb7..10bd17e0a98 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -223,6 +223,7 @@ import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; +import com.cloud.uservm.UserVm; import com.cloud.utils.EnumUtils; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -897,7 +898,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForServers(ListHostsCmd cmd) { + public Pair, Integer> searchForServers(ListHostsCmd cmd) { Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId()); Object name = cmd.getHostName(); @@ -910,11 +911,12 @@ public class ManagementServerImpl implements ManagementServer { Object resourceState = cmd.getResourceState(); Object haHosts = cmd.getHaHost(); - return searchForServers(cmd.getStartIndex(), cmd.getPageSizeVal(), name, type, state, zoneId, pod, cluster, id, keyword, resourceState, haHosts); + Pair, Integer> result = searchForServers(cmd.getStartIndex(), cmd.getPageSizeVal(), name, type, state, zoneId, pod, cluster, id, keyword, resourceState, haHosts); + return new Pair, Integer>(result.first(), result.second()); } @Override - public Pair, List> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) { + public Pair, Integer>, List> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) { // access check - only root admin can migrate VM Account caller = UserContext.current().getCaller(); if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { @@ -972,9 +974,12 @@ public class ManagementServerImpl implements ManagementServer { s_logger.debug("Searching for all hosts in cluster: " + cluster + " for migrating VM " + vm); } - List allHostsInCluster = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, null, null, null); - // filter out the current host + Pair, Integer> allHostsInClusterPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, null, null, null); + + // filter out the current host + List allHostsInCluster = allHostsInClusterPair.first(); allHostsInCluster.remove(srcHost); + Pair, Integer> otherHostsInCluster = new Pair, Integer>(allHostsInCluster, new Integer(allHostsInClusterPair.second().intValue()-1)); if (s_logger.isDebugEnabled()) { s_logger.debug("Other Hosts in this cluster: " + allHostsInCluster); @@ -1008,10 +1013,10 @@ public class ManagementServerImpl implements ManagementServer { } } - return new Pair, List>(allHostsInCluster, suitableHosts); + return new Pair, Integer>, List>(otherHostsInCluster, suitableHosts); } - private List searchForServers(Long startIndex, Long pageSize, Object name, Object type, Object state, Object zone, Object pod, Object cluster, Object id, Object keyword, + private Pair, Integer> searchForServers(Long startIndex, Long pageSize, Object name, Object type, Object state, Object zone, Object pod, Object cluster, Object id, Object keyword, Object resourceState, Object haHosts) { Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); @@ -1082,7 +1087,7 @@ public class ManagementServerImpl implements ManagementServer { sc.setJoinParameters("hostTagSearch", "tag", haTag); } - return _hostDao.search(sc, searchFilter); + return _hostDao.searchAndCount(sc, searchFilter); } @Override