This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.13
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.13 by this push:
     new 4d8a2da  api: Fix count and item issues returned by list APIs (#3894)
4d8a2da is described below

commit 4d8a2da133b74f2de9ecc599eebafdfc68e6fa60
Author: Pearl Dsilva <[email protected]>
AuthorDate: Wed Feb 26 20:44:23 2020 +0530

    api: Fix count and item issues returned by list APIs (#3894)
---
 api/src/main/java/com/cloud/projects/Project.java  |  2 +-
 .../api/command/admin/cluster/ListClustersCmd.java |  8 +++----
 .../src/main/java/com/cloud/host/dao/HostDao.java  |  2 ++
 .../main/java/com/cloud/host/dao/HostDaoImpl.java  | 13 +++++++++++
 .../java/com/cloud/vm/dao/DomainRouterDao.java     |  7 ++++++
 .../java/com/cloud/vm/dao/DomainRouterDaoImpl.java |  8 +++++++
 .../storage/datastore/db/ImageStoreDao.java        |  2 ++
 .../storage/datastore/db/ImageStoreDaoImpl.java    |  8 +++++++
 .../main/java/com/cloud/utils/db/GenericDao.java   |  2 ++
 .../java/com/cloud/utils/db/GenericDaoBase.java    |  9 ++++++++
 .../cloudstack/api/ListClustersMetricsCmd.java     |  8 +++++--
 .../apache/cloudstack/api/ListHostsMetricsCmd.java |  6 ++++--
 .../cloudstack/api/ListStoragePoolsMetricsCmd.java |  6 ++++--
 .../apache/cloudstack/api/ListVMsMetricsCmd.java   |  6 ++++--
 .../cloudstack/api/ListVolumesMetricsCmd.java      |  6 ++++--
 .../apache/cloudstack/api/ListZonesMetricsCmd.java |  6 ++++--
 .../apache/cloudstack/metrics/MetricsService.java  |  3 ++-
 .../cloudstack/metrics/MetricsServiceImpl.java     | 25 ++++++++++++++--------
 .../response/InfrastructureResponse.java           | 12 +++++++++++
 .../java/com/cloud/api/query/QueryManagerImpl.java | 12 +++++------
 .../com/cloud/server/ManagementServerImpl.java     |  2 +-
 .../java/com/cloud/user/AccountManagerImpl.java    | 14 ++++++------
 .../java/com/cloud/user/MockUsageEventDao.java     |  5 +++++
 ui/scripts/system.js                               | 12 +++++------
 24 files changed, 138 insertions(+), 46 deletions(-)

diff --git a/api/src/main/java/com/cloud/projects/Project.java 
b/api/src/main/java/com/cloud/projects/Project.java
index 5fff308..7cc370c 100644
--- a/api/src/main/java/com/cloud/projects/Project.java
+++ b/api/src/main/java/com/cloud/projects/Project.java
@@ -29,7 +29,7 @@ public interface Project extends PartOf, Identity, 
InternalIdentity {
     }
 
     public enum ListProjectResourcesCriteria {
-        ListProjectResourcesOnly, SkipProjectResources
+        ListProjectResourcesOnly, SkipProjectResources, 
ListAllIncludingProjectResources
     }
 
     String getDisplayText();
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
index 74ad764..dadc208 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
@@ -125,7 +125,7 @@ public class ListClustersCmd extends BaseListCmd {
         return s_name;
     }
 
-    protected List<ClusterResponse> getClusterResponses() {
+    protected Pair<List<ClusterResponse>, Integer> getClusterResponses() {
         Pair<List<? extends Cluster>, Integer> result = 
_mgr.searchForClusters(this);
         List<ClusterResponse> clusterResponses = new 
ArrayList<ClusterResponse>();
         for (Cluster cluster : result.first()) {
@@ -133,14 +133,14 @@ public class ListClustersCmd extends BaseListCmd {
             clusterResponse.setObjectName("cluster");
             clusterResponses.add(clusterResponse);
         }
-        return clusterResponses;
+        return new Pair<List<ClusterResponse>, Integer>(clusterResponses, 
result.second());
     }
 
     @Override
     public void execute() {
-        List<ClusterResponse> clusterResponses = getClusterResponses();
+        Pair<List<ClusterResponse>, Integer> clusterResponses = 
getClusterResponses();
         ListResponse<ClusterResponse> response = new 
ListResponse<ClusterResponse>();
-        response.setResponses(clusterResponses, clusterResponses.size());
+        response.setResponses(clusterResponses.first(), 
clusterResponses.second());
         response.setResponseName(getCommandName());
         this.setResponseObject(response);
     }
diff --git a/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java 
b/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
index dd45c09..781f82f 100644
--- a/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
+++ b/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
@@ -37,6 +37,8 @@ import com.cloud.utils.fsm.StateDao;
 public interface HostDao extends GenericDao<HostVO, Long>, StateDao<Status, 
Status.Event, Host> {
     long countBy(long clusterId, ResourceState... states);
 
+    Integer countAllByType(final Host.Type type);
+
     /**
      * Mark all hosts associated with a certain management server
      * as disconnected.
diff --git a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java 
b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
index 71f0aef..2b2a80b 100644
--- a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
@@ -105,6 +105,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
     protected SearchBuilder<HostVO> UnmanagedDirectConnectSearch;
     protected SearchBuilder<HostVO> UnmanagedApplianceSearch;
     protected SearchBuilder<HostVO> MaintenanceCountSearch;
+    protected SearchBuilder<HostVO> HostTypeCountSearch;
     protected SearchBuilder<HostVO> ClusterStatusSearch;
     protected SearchBuilder<HostVO> TypeNameZoneSearch;
     protected SearchBuilder<HostVO> AvailHypevisorInZone;
@@ -159,6 +160,11 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
         MaintenanceCountSearch.and("resourceState", 
MaintenanceCountSearch.entity().getResourceState(), SearchCriteria.Op.IN);
         MaintenanceCountSearch.done();
 
+        HostTypeCountSearch = createSearchBuilder();
+        HostTypeCountSearch.and("type", 
HostTypeCountSearch.entity().getType(), SearchCriteria.Op.EQ);
+        HostTypeCountSearch.and("removed", 
HostTypeCountSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+        HostTypeCountSearch.done();
+
         TypePodDcStatusSearch = createSearchBuilder();
         HostVO entity = TypePodDcStatusSearch.entity();
         TypePodDcStatusSearch.and("type", entity.getType(), 
SearchCriteria.Op.EQ);
@@ -430,6 +436,13 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
     }
 
     @Override
+    public Integer countAllByType(final Host.Type type) {
+        SearchCriteria<HostVO> sc = HostTypeCountSearch.create();
+        sc.setParameters("type", type);
+        return getCount(sc);
+    }
+
+    @Override
     public List<HostVO> listByDataCenterId(long id) {
         SearchCriteria<HostVO> sc = DcSearch.create();
         sc.setParameters("dc", id);
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDao.java 
b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDao.java
index ef8829e..c4fd2f6 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDao.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDao.java
@@ -96,6 +96,13 @@ public interface DomainRouterDao extends 
GenericDao<DomainRouterVO, Long> {
      */
     public List<DomainRouterVO> listRunningByDomain(Long id);
 
+    /**
+     * gets the total count by role
+     * @Param role Router role
+     * @return count of resources
+     */
+    Integer countAllByRole(Role role);
+
     List<DomainRouterVO> findBy(long accountId, long dcId, Role role);
 
     List<DomainRouterVO> findByNetwork(long networkId);
diff --git 
a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java 
b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
index 85a8a93..17f0ffd 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -186,6 +186,14 @@ public class DomainRouterDaoImpl extends 
GenericDaoBase<DomainRouterVO, Long> im
     }
 
     @Override
+    public Integer countAllByRole(final Role role) {
+        final SearchCriteria<DomainRouterVO> sc = createSearchCriteria();
+        sc.addAnd("role", SearchCriteria.Op.EQ, role);
+        sc.addAnd("removed", Op.NULL);
+        return getCount(sc);
+    }
+
+    @Override
     public List<DomainRouterVO> findBy(final long accountId, final long dcId) {
         final SearchCriteria<DomainRouterVO> sc = AllFieldsSearch.create();
         sc.setParameters("account", accountId);
diff --git 
a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
 
b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
index d0f8fe8..1861b21 100644
--- 
a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
+++ 
b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
@@ -35,6 +35,8 @@ public interface ImageStoreDao extends 
GenericDao<ImageStoreVO, Long> {
 
     List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
 
+    Integer countAllImageStores();
+
     List<ImageStoreVO> listImageStores();
 
     List<ImageStoreVO> listImageCacheStores();
diff --git 
a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
 
b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
index 9d53262..38124ea 100644
--- 
a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
+++ 
b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
@@ -111,6 +111,14 @@ public class ImageStoreDaoImpl extends 
GenericDaoBase<ImageStoreVO, Long> implem
     }
 
     @Override
+    public Integer countAllImageStores() {
+        SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
+        sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image);
+        sc.addAnd("removed", SearchCriteria.Op.NULL);
+        return getCount(sc);
+    }
+
+    @Override
     public List<ImageStoreVO> listImageStores() {
         SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
         sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image);
diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDao.java 
b/framework/db/src/main/java/com/cloud/utils/db/GenericDao.java
index 63047e7..04c0882 100644
--- a/framework/db/src/main/java/com/cloud/utils/db/GenericDao.java
+++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDao.java
@@ -278,4 +278,6 @@ public interface GenericDao<T, ID extends Serializable> {
     Map<String, Attribute> getAllAttributes();
 
     Pair<List<T>, Integer> searchAndDistinctCount(final SearchCriteria<T> sc, 
final Filter filter, final String[] distinctColumns);
+
+    Integer countAll();
 }
diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java 
b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
index fb923c6..32b1984 100644
--- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
+++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
@@ -1996,6 +1996,15 @@ public abstract class GenericDaoBase<T, ID extends 
Serializable> extends Compone
         }
     }
 
+    public Integer countAll() {
+        SearchCriteria<T> sc = null;
+        if (_removed != null) {
+            sc = createSearchCriteria();
+            sc.addAnd(_removed.second().field.getName(), 
SearchCriteria.Op.NULL);
+        }
+        return getCount(sc);
+    }
+
     public Integer getCount(SearchCriteria<T> sc) {
         String clause = sc != null ? sc.getWhereClause() : null;
         if (clause != null && clause.length() == 0) {
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListClustersMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListClustersMetricsCmd.java
index ef259e1..cdd5a67 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListClustersMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListClustersMetricsCmd.java
@@ -19,6 +19,7 @@ package org.apache.cloudstack.api;
 
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
+import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.ClusterMetricsResponse;
@@ -26,6 +27,8 @@ import org.apache.cloudstack.response.ClusterMetricsResponse;
 import javax.inject.Inject;
 import java.util.List;
 
+import com.cloud.utils.Pair;
+
 @APICommand(name = ListClustersMetricsCmd.APINAME, description = "Lists 
clusters metrics", responseObject = ClusterMetricsResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,  
responseView = ResponseObject.ResponseView.Full,
         since = "4.9.3", authorized = {RoleType.Admin})
@@ -42,9 +45,10 @@ public class ListClustersMetricsCmd extends ListClustersCmd {
 
     @Override
     public void execute() {
-        final List<ClusterMetricsResponse> metricsResponses = 
metricsService.listClusterMetrics(getClusterResponses());
+        Pair<List<ClusterResponse>, Integer> clusterResponses = 
getClusterResponses();
+        final List<ClusterMetricsResponse> metricsResponses = 
metricsService.listClusterMetrics(clusterResponses);
         ListResponse<ClusterMetricsResponse> response = new ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, clusterResponses.second());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListHostsMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListHostsMetricsCmd.java
index 9010063..db80395 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListHostsMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListHostsMetricsCmd.java
@@ -21,6 +21,7 @@ package org.apache.cloudstack.api;
 import com.cloud.host.Host;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
+import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.HostMetricsResponse;
@@ -45,9 +46,10 @@ public class ListHostsMetricsCmd extends ListHostsCmd {
     @Override
     public void execute() {
         setType(Host.Type.Routing.toString());
-        final List<HostMetricsResponse> metricsResponses = 
metricsService.listHostMetrics(getHostResponses().getResponses());
+        ListResponse<HostResponse> hosts = getHostResponses();
+        final List<HostMetricsResponse> metricsResponses = 
metricsService.listHostMetrics(hosts.getResponses());
         ListResponse<HostMetricsResponse> response = new ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, hosts.getCount());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListStoragePoolsMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListStoragePoolsMetricsCmd.java
index 4206568..35f2f76 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListStoragePoolsMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListStoragePoolsMetricsCmd.java
@@ -20,6 +20,7 @@ package org.apache.cloudstack.api;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.StoragePoolMetricsResponse;
 
@@ -42,9 +43,10 @@ public class ListStoragePoolsMetricsCmd extends 
ListStoragePoolsCmd {
 
     @Override
     public void execute() {
-        final List<StoragePoolMetricsResponse> metricsResponses = 
metricsService.listStoragePoolMetrics(_queryService.searchForStoragePools(this).getResponses());
+        ListResponse<StoragePoolResponse> storagePools = 
_queryService.searchForStoragePools(this);
+        final List<StoragePoolMetricsResponse> metricsResponses = 
metricsService.listStoragePoolMetrics(storagePools.getResponses());
         ListResponse<StoragePoolMetricsResponse> response = new 
ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, storagePools.getCount());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
index 2321f51..1cec5a3 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
@@ -20,6 +20,7 @@ package org.apache.cloudstack.api;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.admin.vm.ListVMsCmdByAdmin;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.VmMetricsResponse;
 
@@ -42,9 +43,10 @@ public class ListVMsMetricsCmd extends ListVMsCmdByAdmin {
 
     @Override
     public void execute() {
-        final List<VmMetricsResponse> metricsResponses = 
metricsService.listVmMetrics(_queryService.searchForUserVMs(this).getResponses());
+        ListResponse<UserVmResponse> userVms = 
_queryService.searchForUserVMs(this);
+        final List<VmMetricsResponse> metricsResponses = 
metricsService.listVmMetrics(userVms.getResponses());
         ListResponse<VmMetricsResponse> response = new ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, userVms.getCount());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVolumesMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVolumesMetricsCmd.java
index df0adec..efa65c0 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVolumesMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVolumesMetricsCmd.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.VolumeMetricsResponse;
 
@@ -47,9 +48,10 @@ public class ListVolumesMetricsCmd extends ListVolumesCmd {
 
     @Override
     public void execute() {
-        final List<VolumeMetricsResponse> metricsResponses = 
metricsService.listVolumeMetrics(_queryService.searchForVolumes(this).getResponses());
+        ListResponse<VolumeResponse> volumes = 
_queryService.searchForVolumes(this);
+        final List<VolumeMetricsResponse> metricsResponses = 
metricsService.listVolumeMetrics(volumes.getResponses());
         ListResponse<VolumeMetricsResponse> response = new ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, volumes.getCount());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListZonesMetricsCmd.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListZonesMetricsCmd.java
index 1a51a5f..c63d05c 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListZonesMetricsCmd.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListZonesMetricsCmd.java
@@ -20,6 +20,7 @@ package org.apache.cloudstack.api;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.command.user.zone.ListZonesCmd;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.metrics.MetricsService;
 import org.apache.cloudstack.response.ZoneMetricsResponse;
 
@@ -42,9 +43,10 @@ public class ListZonesMetricsCmd extends ListZonesCmd {
 
     @Override
     public void execute() {
-        final List<ZoneMetricsResponse> metricsResponses = 
metricsService.listZoneMetrics(_queryService.listDataCenters(this).getResponses());
+        ListResponse<ZoneResponse> zones = _queryService.listDataCenters(this);
+        final List<ZoneMetricsResponse> metricsResponses = 
metricsService.listZoneMetrics(zones.getResponses());
         ListResponse<ZoneMetricsResponse> response = new ListResponse<>();
-        response.setResponses(metricsResponses, metricsResponses.size());
+        response.setResponses(metricsResponses, zones.getCount());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsService.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsService.java
index deb1da8..a1e0289 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsService.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsService.java
@@ -17,6 +17,7 @@
 
 package org.apache.cloudstack.metrics;
 
+import com.cloud.utils.Pair;
 import com.cloud.utils.component.PluggableService;
 import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.HostResponse;
@@ -41,6 +42,6 @@ public interface MetricsService extends PluggableService {
     List<VmMetricsResponse> listVmMetrics(List<UserVmResponse> vmResponses);
     List<StoragePoolMetricsResponse> 
listStoragePoolMetrics(List<StoragePoolResponse> poolResponses);
     List<HostMetricsResponse> listHostMetrics(List<HostResponse> 
poolResponses);
-    List<ClusterMetricsResponse> listClusterMetrics(List<ClusterResponse> 
poolResponses);
+    List<ClusterMetricsResponse> 
listClusterMetrics(Pair<List<ClusterResponse>, Integer> clusterResponses);
     List<ZoneMetricsResponse> listZoneMetrics(List<ZoneResponse> 
poolResponses);
 }
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
index 9f20fc3..1a9cd27 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
@@ -51,6 +51,7 @@ import 
org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.commons.beanutils.BeanUtils;
 
 import com.cloud.alert.AlertManager;
+import com.cloud.alert.dao.AlertDao;
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.query.dao.HostJoinDao;
 import com.cloud.api.query.vo.HostJoinVO;
@@ -68,11 +69,13 @@ import com.cloud.host.Host;
 import com.cloud.host.HostStats;
 import com.cloud.host.Status;
 import com.cloud.host.dao.HostDao;
+import com.cloud.network.router.VirtualRouter;
 import com.cloud.org.Cluster;
 import com.cloud.org.Grouping;
 import com.cloud.org.Managed;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
+import com.cloud.utils.Pair;
 import com.cloud.utils.component.ComponentLifecycleBase;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
@@ -105,6 +108,8 @@ public class MetricsServiceImpl extends 
ComponentLifecycleBase implements Metric
     private AccountManager accountMgr;
     @Inject
     private ManagementServerHostDao managementServerHostDao;
+    @Inject
+    private AlertDao alertDao;
 
     protected MetricsServiceImpl() {
         super();
@@ -133,14 +138,16 @@ public class MetricsServiceImpl extends 
ComponentLifecycleBase implements Metric
     @Override
     public InfrastructureResponse listInfrastructure() {
         final InfrastructureResponse response = new InfrastructureResponse();
-        response.setZones(dataCenterDao.listAllZones().size());
-        response.setPods(podDao.listAllPods(null).size());
-        response.setClusters(clusterDao.listAllClusters(null).size());
-        response.setHosts(hostDao.listByType(Host.Type.Routing).size());
-        response.setStoragePools(storagePoolDao.listAll().size());
-        response.setImageStores(imageStoreDao.listImageStores().size());
+        response.setZones(dataCenterDao.countAll());
+        response.setPods(podDao.countAll());
+        response.setClusters(clusterDao.countAll());
+        response.setHosts(hostDao.countAllByType(Host.Type.Routing));
+        response.setStoragePools(storagePoolDao.countAll());
+        response.setImageStores(imageStoreDao.countAllImageStores());
         
response.setSystemvms(vmInstanceDao.listByTypes(VirtualMachine.Type.ConsoleProxy,
 VirtualMachine.Type.SecondaryStorageVm).size());
-        response.setRouters(domainRouterDao.listAll().size());
+        
response.setRouters(domainRouterDao.countAllByRole(VirtualRouter.Role.VIRTUAL_ROUTER));
+        
response.setInternalLbs(domainRouterDao.countAllByRole(VirtualRouter.Role.INTERNAL_LB_VM));
+        response.setAlerts(alertDao.countAll());
         int cpuSockets = 0;
         for (final Host host : hostDao.listByType(Host.Type.Routing)) {
             if (host.getCpuSockets() != null) {
@@ -308,9 +315,9 @@ public class MetricsServiceImpl extends 
ComponentLifecycleBase implements Metric
     }
 
     @Override
-    public List<ClusterMetricsResponse> 
listClusterMetrics(List<ClusterResponse> clusterResponses) {
+    public List<ClusterMetricsResponse> 
listClusterMetrics(Pair<List<ClusterResponse>, Integer> clusterResponses) {
         final List<ClusterMetricsResponse> metricsResponses = new 
ArrayList<>();
-        for (final ClusterResponse clusterResponse: clusterResponses) {
+        for (final ClusterResponse clusterResponse: clusterResponses.first()) {
             ClusterMetricsResponse metricsResponse = new 
ClusterMetricsResponse();
 
             try {
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
index 03b54ab..280b799 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
@@ -55,6 +55,10 @@ public class InfrastructureResponse extends BaseResponse {
     @Param(description = "Number of routers")
     private Integer routers;
 
+    @SerializedName("ilbvms")
+    @Param(description = "Number of internal LBs")
+    private Integer internalLbs;
+
     @SerializedName("cpusockets")
     @Param(description = "Number of cpu sockets")
     private Integer cpuSockets;
@@ -63,6 +67,10 @@ public class InfrastructureResponse extends BaseResponse {
     @Param(description = "Number of management servers")
     private Integer managementServers;
 
+    @SerializedName("alerts")
+    @Param(description = "Number of Alerts")
+    private Integer alerts;
+
     public InfrastructureResponse() {
         setObjectName("infrastructure");
     }
@@ -106,4 +114,8 @@ public class InfrastructureResponse extends BaseResponse {
     public void setManagementServers(Integer managementServers) {
         this.managementServers = managementServers;
     }
+
+    public void setAlerts(Integer alerts) { this.alerts = alerts; }
+
+    public void setInternalLbs(Integer internalLbs) { this.internalLbs = 
internalLbs; }
 }
diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java 
b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
index 9028565..c815be8 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -31,9 +31,6 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import com.cloud.agent.api.storage.OVFProperty;
-import com.cloud.storage.TemplateOVFPropertyVO;
-import com.cloud.storage.dao.TemplateOVFPropertiesDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -123,6 +120,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.agent.api.storage.OVFProperty;
 import com.cloud.api.query.dao.AccountJoinDao;
 import com.cloud.api.query.dao.AffinityGroupJoinDao;
 import com.cloud.api.query.dao.AsyncJobJoinDao;
@@ -206,9 +204,11 @@ import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
 import com.cloud.storage.StoragePoolTagVO;
+import com.cloud.storage.TemplateOVFPropertyVO;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.dao.StoragePoolTagsDao;
+import com.cloud.storage.dao.TemplateOVFPropertiesDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
@@ -2661,7 +2661,7 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
                 }
             }
         }
-        return new Pair<>(result.first(), result.first().size());
+        return new Pair<>(result.first(), result.second());
     }
 
     private List<ServiceOfferingJoinVO> 
filterOfferingsOnCurrentTags(List<ServiceOfferingJoinVO> offerings, 
ServiceOfferingVO currentVmOffering) {
@@ -2872,7 +2872,7 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
                 }
             }
         }
-        return new Pair<>(filteredOfferings, filteredOfferings.size());
+        return new Pair<>(filteredOfferings, result.second());
     }
 
     @Override
@@ -3626,7 +3626,7 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
             affinityGroups.addAll(listDomainLevelAffinityGroups(scDomain, 
searchFilter, domainId));
         }
 
-        return new Pair<List<AffinityGroupJoinVO>, Integer>(affinityGroups, 
affinityGroups.size());
+        return new Pair<List<AffinityGroupJoinVO>, Integer>(affinityGroups, 
uniqueGroupsPair.second());
 
     }
 
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java 
b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index 147c527..5bed8d6 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -1303,7 +1303,7 @@ public class ManagementServerImpl extends ManagerBase 
implements ManagementServe
             plan = new DataCenterDeployment(srcHost.getDataCenterId(), 
srcHost.getPodId(), srcHost.getClusterId(), null, null, null);
         }
 
-        final Pair<List<? extends Host>, Integer> otherHosts = new Pair<List<? 
extends Host>, Integer>(allHosts, new Integer(allHosts.size()));
+        final Pair<List<? extends Host>, Integer> otherHosts = new Pair<List<? 
extends Host>, Integer>(allHosts, allHostsPair.second());
         List<Host> suitableHosts = new ArrayList<Host>();
         final ExcludeList excludes = new ExcludeList();
         excludes.addHost(srcHostId);
diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java 
b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
index 20d769f..77f21f0 100644
--- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
@@ -2670,16 +2670,18 @@ public class AccountManagerImpl extends ManagerBase 
implements AccountManager, M
         // set project information
         if (projectId != null) {
             if (!forProjectInvitation) {
-                if (projectId.longValue() == -1) {
-                    if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) {
+                if (projectId == -1L) {
+                    if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+                        
domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly);
+                        if (listAll) {
+                            
domainIdRecursiveListProject.third(ListProjectResourcesCriteria.ListAllIncludingProjectResources);
+                        }
+                    } else {
                         
permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId()));
-
-                        //permittedAccounts can be empty when the caller is 
not a part of any project (a domain account)
+                        // permittedAccounts can be empty when the caller is 
not a part of any project (a domain account)
                         if (permittedAccounts.isEmpty()) {
                             permittedAccounts.add(caller.getId());
                         }
-                    } else {
-                        
domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly);
                     }
                 } else {
                     Project project = _projectMgr.getProject(projectId);
diff --git a/server/src/test/java/com/cloud/user/MockUsageEventDao.java 
b/server/src/test/java/com/cloud/user/MockUsageEventDao.java
index 5d8ed6c..ab844ee 100644
--- a/server/src/test/java/com/cloud/user/MockUsageEventDao.java
+++ b/server/src/test/java/com/cloud/user/MockUsageEventDao.java
@@ -284,6 +284,11 @@ public class MockUsageEventDao implements UsageEventDao{
     }
 
     @Override
+    public Integer countAll() {
+        return null;
+    }
+
+    @Override
     public List<UsageEventVO> listLatestEvents(Date endDate) {
         return null;
     }
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index fe9b359..e016b22 100755
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -2455,7 +2455,7 @@
                                                  */
                                                 if (cloudStack.context && 
cloudStack.context.projects == null) { //non-project view
                                                 $.ajax({
-                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + 
args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
+                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + 
"&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                     data: data2,
                                                         async: false,
                                                     success: function (json) {
@@ -3039,7 +3039,7 @@
 
                                                 // Get project routers
                                                 $.ajax({
-                                                    url: 
createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + 
"&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + 
"&projectid=-1"),
+                                                    url: 
createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&page=" 
+ args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                     success: function (json) {
                                                         var items = 
json.listinternallbvmsresponse.internalloadbalancervm ?
                                                         
json.listinternallbvmsresponse.internalloadbalancervm:[];
@@ -3592,7 +3592,7 @@
                                                  */
                                                 if (cloudStack.context && 
cloudStack.context.projects == null) { //non-project view
                                                 $.ajax({
-                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + 
args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
+                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + 
"&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                     dataType: 'json',
                                                     data: data2,
                                                         async: false,
@@ -6521,7 +6521,7 @@
 
                                                 // Get project routers
                                                 $.ajax({
-                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + 
args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
+                                                    url: 
createURL("listRouters&zoneid=" + selectedZoneObj.id + "&page=" + args.page + 
"&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                     data: data2,
                                                     success: function (json) {
                                                         var items = 
json.listroutersresponse.router ?
@@ -9454,7 +9454,7 @@
                                                              */
                                                             if 
(cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                                             $.ajax({
-                                                                    url: 
createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + 
pageSize + "&projectid=-1"),
+                                                                    url: 
createURL("listRouters&page=" + args.page + "&pagesize=" + pageSize + 
"&projectid=-1"),
                                                                 async: false,
                                                                 success: 
function (json) {
                                                                     var items 
= json.listroutersresponse.router ? json.listroutersresponse.router:[];
@@ -9877,7 +9877,7 @@
                                     }
 
                                     $.ajax({
-                                            url: 
createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + 
pageSize + array1.join("") + "&projectid=-1"),
+                                            url: createURL("listRouters&page=" 
+ args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                             data: data2,
                                         async: false,
                                             success: function (json) {

Reply via email to