From 3f68965b94944fadfc9219181dc2ef7fc3903fd0 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 18 Feb 2020 18:31:55 +0530 Subject: [PATCH 1/9] Fixed count value in the list apis --- .../admin/cluster/ListClustersCmd.java | 8 +- .../com/cloud/vm/dao/DomainRouterDao.java | 6 ++ .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 7 ++ .../api/ListClustersMetricsCmd.java | 8 +- .../cloudstack/api/ListHostsMetricsCmd.java | 6 +- .../api/ListStoragePoolsMetricsCmd.java | 6 +- .../cloudstack/api/ListVMsMetricsCmd.java | 6 +- .../cloudstack/api/ListVolumesMetricsCmd.java | 6 +- .../cloudstack/api/ListZonesMetricsCmd.java | 6 +- .../cloudstack/metrics/MetricsService.java | 3 +- .../metrics/MetricsServiceImpl.java | 13 ++- .../response/InfrastructureResponse.java | 12 +++ .../com/cloud/api/query/QueryManagerImpl.java | 6 +- .../cloud/server/ManagementServerImpl.java | 89 ++++++++++++++++++- 14 files changed, 156 insertions(+), 26 deletions(-) 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 74ad764608cf..dadc208e71bf 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 String getCommandName() { return s_name; } - protected List getClusterResponses() { + protected Pair, Integer> getClusterResponses() { Pair, Integer> result = _mgr.searchForClusters(this); List clusterResponses = new ArrayList(); for (Cluster cluster : result.first()) { @@ -133,14 +133,14 @@ protected List getClusterResponses() { clusterResponse.setObjectName("cluster"); clusterResponses.add(clusterResponse); } - return clusterResponses; + return new Pair, Integer>(clusterResponses, result.second()); } @Override public void execute() { - List clusterResponses = getClusterResponses(); + Pair, Integer> clusterResponses = getClusterResponses(); ListResponse response = new ListResponse(); - 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/vm/dao/DomainRouterDao.java b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDao.java index ef8829ef0189..cfb19c69e186 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 @@ -37,6 +37,12 @@ public interface DomainRouterDao extends GenericDao { */ public List listByDataCenter(long dcId); + /** + * gets the DomainRouterVO by role of the domain router + * @Param role Domain Router role + * @return list of DomainRouterVO + */ + public List listByRole(Role role); /** * gets the DomainRouterVO by account id and data center * @param account id of the user. 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 85a8a936b5cc..d752c095360b 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 @@ -185,6 +185,13 @@ public List listByDataCenter(final long dcId) { return listBy(sc); } + @Override + public List listByRole(final Role role) { + final SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("role", role); + return listBy(sc); + } + @Override public List findBy(final long accountId, final long dcId) { final SearchCriteria sc = AllFieldsSearch.create(); 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 ef259e19a739..cdd5a67e933e 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 @@ 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 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 String getCommandName() { @Override public void execute() { - final List metricsResponses = metricsService.listClusterMetrics(getClusterResponses()); + Pair, Integer> clusterResponses = getClusterResponses(); + final List metricsResponses = metricsService.listClusterMetrics(clusterResponses); ListResponse 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 90100631d6b7..db80395a2976 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 @@ 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 String getCommandName() { @Override public void execute() { setType(Host.Type.Routing.toString()); - final List metricsResponses = metricsService.listHostMetrics(getHostResponses().getResponses()); + ListResponse hosts = getHostResponses(); + final List metricsResponses = metricsService.listHostMetrics(hosts.getResponses()); ListResponse 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 420656800fa1..35f2f7634f97 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 @@ 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 String getCommandName() { @Override public void execute() { - final List metricsResponses = metricsService.listStoragePoolMetrics(_queryService.searchForStoragePools(this).getResponses()); + ListResponse storagePools = _queryService.searchForStoragePools(this); + final List metricsResponses = metricsService.listStoragePoolMetrics(storagePools.getResponses()); ListResponse 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 2321f519472a..1cec5a316129 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 @@ 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 String getCommandName() { @Override public void execute() { - final List metricsResponses = metricsService.listVmMetrics(_queryService.searchForUserVMs(this).getResponses()); + ListResponse userVms = _queryService.searchForUserVMs(this); + final List metricsResponses = metricsService.listVmMetrics(userVms.getResponses()); ListResponse 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 df0adec0a775..efa65c0a6b60 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 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 String getCommandName() { @Override public void execute() { - final List metricsResponses = metricsService.listVolumeMetrics(_queryService.searchForVolumes(this).getResponses()); + ListResponse volumes = _queryService.searchForVolumes(this); + final List metricsResponses = metricsService.listVolumeMetrics(volumes.getResponses()); ListResponse 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 1a51a5fbe009..c63d05c71dda 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 @@ 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 String getCommandName() { @Override public void execute() { - final List metricsResponses = metricsService.listZoneMetrics(_queryService.listDataCenters(this).getResponses()); + ListResponse zones = _queryService.listDataCenters(this); + final List metricsResponses = metricsService.listZoneMetrics(zones.getResponses()); ListResponse 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 deb1da89c9fb..a1e0289ff172 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 listVmMetrics(List vmResponses); List listStoragePoolMetrics(List poolResponses); List listHostMetrics(List poolResponses); - List listClusterMetrics(List poolResponses); + List listClusterMetrics(Pair, Integer> clusterResponses); List listZoneMetrics(List 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 9f20fc3efa05..569ad18108d2 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.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.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(); @@ -140,7 +145,9 @@ public InfrastructureResponse listInfrastructure() { response.setStoragePools(storagePoolDao.listAll().size()); response.setImageStores(imageStoreDao.listImageStores().size()); response.setSystemvms(vmInstanceDao.listByTypes(VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm).size()); - response.setRouters(domainRouterDao.listAll().size()); + response.setRouters(domainRouterDao.listByRole(VirtualRouter.Role.VIRTUAL_ROUTER).size()); + response.setInternalLbs(domainRouterDao.listByRole(VirtualRouter.Role.INTERNAL_LB_VM).size()); + response.setAlerts(alertDao.listAll().size()); int cpuSockets = 0; for (final Host host : hostDao.listByType(Host.Type.Routing)) { if (host.getCpuSockets() != null) { @@ -308,9 +315,9 @@ private CapacityDaoImpl.SummedCapacity getCapacity(final int capacityType, final } @Override - public List listClusterMetrics(List clusterResponses) { + public List listClusterMetrics(Pair, Integer> clusterResponses) { final List 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 03b54abd2ec3..6d407d3528a4 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("internallb") + @Param(description = "Number of Internal Load Balancers") + 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 void setCpuSockets(final Integer cpuSockets) { 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 90285659790e..5819beeafb3b 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -2661,7 +2661,7 @@ private Pair, Integer> searchForDiskOfferingsInternal(L } } } - return new Pair<>(result.first(), result.first().size()); + return new Pair<>(result.first(), result.second()); } private List filterOfferingsOnCurrentTags(List offerings, ServiceOfferingVO currentVmOffering) { @@ -2872,7 +2872,7 @@ private Pair, Integer> searchForServiceOfferingsInte } } } - return new Pair<>(filteredOfferings, filteredOfferings.size()); + return new Pair<>(filteredOfferings, result.second()); } @Override @@ -3626,7 +3626,7 @@ public Pair, Integer> searchForAffinityGroupsInternal( affinityGroups.addAll(listDomainLevelAffinityGroups(scDomain, searchFilter, domainId)); } - return new Pair, Integer>(affinityGroups, affinityGroups.size()); + return new Pair, 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 147c527b2739..47caea2b1ad4 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -1248,7 +1248,7 @@ public Ternary, Integer>, List, Map requiresStorageMotion = new HashMap(); DataCenterDeployment plan = null; if (canMigrateWithStorage) { - allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, null, keyword, null, null, srcHost.getHypervisorType(), + allHostsPair = searchForServersExcluding(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, srcHostId, keyword, null, null, srcHost.getHypervisorType(), srcHost.getHypervisorVersion()); allHosts = allHostsPair.first(); allHosts.remove(srcHost); @@ -1296,14 +1296,14 @@ public Ternary, Integer>, List, Map, Integer> otherHosts = new Pair, Integer>(allHosts, new Integer(allHosts.size())); + final Pair, Integer> otherHosts = new Pair, Integer>(allHosts, allHostsPair.second()); List suitableHosts = new ArrayList(); final ExcludeList excludes = new ExcludeList(); excludes.addHost(srcHostId); @@ -1515,6 +1515,89 @@ private List findAllSuitableStoragePoolsForVm(final VolumeVO volume return suitablePools; } + + private Pair, Integer> searchForServersExcluding(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, + final Object cluster, final Long id, final Object keyword, final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion) { + final Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); + + final SearchBuilder sb = _hostDao.createSearchBuilder(); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.NEQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("type", sb.entity().getType(), SearchCriteria.Op.LIKE); + sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); + sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); + sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); + sb.and("resourceState", sb.entity().getResourceState(), SearchCriteria.Op.EQ); + sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); + sb.and("hypervisorVersion", sb.entity().getHypervisorVersion(), SearchCriteria.Op.GTEQ); + + final String haTag = _haMgr.getHaTag(); + SearchBuilder hostTagSearch = null; + if (haHosts != null && haTag != null && !haTag.isEmpty()) { + hostTagSearch = _hostTagsDao.createSearchBuilder(); + if ((Boolean)haHosts) { + hostTagSearch.and().op("tag", hostTagSearch.entity().getTag(), SearchCriteria.Op.EQ); + } else { + hostTagSearch.and().op("tag", hostTagSearch.entity().getTag(), SearchCriteria.Op.NEQ); + hostTagSearch.or("tagNull", hostTagSearch.entity().getTag(), SearchCriteria.Op.NULL); + } + + hostTagSearch.cp(); + sb.join("hostTagSearch", hostTagSearch, sb.entity().getId(), hostTagSearch.entity().getHostId(), JoinBuilder.JoinType.LEFTOUTER); + } + + final SearchCriteria sc = sb.create(); + + if (keyword != null) { + final SearchCriteria ssc = _hostDao.createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("status", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + if (id != null) { + sc.setParameters("id", id); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + if (type != null) { + sc.setParameters("type", "%" + type); + } + if (state != null) { + sc.setParameters("status", state); + } + if (zone != null) { + sc.setParameters("dataCenterId", zone); + } + if (pod != null) { + sc.setParameters("podId", pod); + } + if (cluster != null) { + sc.setParameters("clusterId", cluster); + } + if (hypervisorType != null) { + sc.setParameters("hypervisorType", hypervisorType); + } + if (hypervisorVersion != null) { + sc.setParameters("hypervisorVersion", hypervisorVersion); + } + + if (resourceState != null) { + sc.setParameters("resourceState", resourceState); + } + + if (haHosts != null && haTag != null && !haTag.isEmpty()) { + sc.setJoinParameters("hostTagSearch", "tag", haTag); + } + + return _hostDao.searchAndCount(sc, searchFilter); + } + private Pair, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, final Object cluster, final Object id, final Object keyword, final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion) { final Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); From 54d269a4ccf20b7967823b35896d660e07bb7125 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 18 Feb 2020 19:54:56 +0530 Subject: [PATCH 2/9] Update InfrastructureResponse.java --- .../apache/cloudstack/response/InfrastructureResponse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 6d407d3528a4..280b7998fbbe 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,8 +55,8 @@ public class InfrastructureResponse extends BaseResponse { @Param(description = "Number of routers") private Integer routers; - @SerializedName("internallb") - @Param(description = "Number of Internal Load Balancers") + @SerializedName("ilbvms") + @Param(description = "Number of internal LBs") private Integer internalLbs; @SerializedName("cpusockets") From 4135bb7b376829220328d8d15043950caaa187ee Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 18 Feb 2020 21:50:05 +0530 Subject: [PATCH 3/9] partial revert hosts for migration code to exclude srcHost Signed-off-by: Rohit Yadav --- .../cloud/server/ManagementServerImpl.java | 87 +------------------ 1 file changed, 2 insertions(+), 85 deletions(-) diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 47caea2b1ad4..5bed8d63c69b 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -1248,7 +1248,7 @@ public Ternary, Integer>, List, Map requiresStorageMotion = new HashMap(); DataCenterDeployment plan = null; if (canMigrateWithStorage) { - allHostsPair = searchForServersExcluding(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, srcHostId, keyword, null, null, srcHost.getHypervisorType(), + allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, null, keyword, null, null, srcHost.getHypervisorType(), srcHost.getHypervisorVersion()); allHosts = allHostsPair.first(); allHosts.remove(srcHost); @@ -1296,7 +1296,7 @@ public Ternary, Integer>, List, Map findAllSuitableStoragePoolsForVm(final VolumeVO volume return suitablePools; } - - private Pair, Integer> searchForServersExcluding(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, - final Object cluster, final Long id, final Object keyword, final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion) { - final Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); - - final SearchBuilder sb = _hostDao.createSearchBuilder(); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.NEQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); - sb.and("type", sb.entity().getType(), SearchCriteria.Op.LIKE); - sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); - sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); - sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); - sb.and("resourceState", sb.entity().getResourceState(), SearchCriteria.Op.EQ); - sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); - sb.and("hypervisorVersion", sb.entity().getHypervisorVersion(), SearchCriteria.Op.GTEQ); - - final String haTag = _haMgr.getHaTag(); - SearchBuilder hostTagSearch = null; - if (haHosts != null && haTag != null && !haTag.isEmpty()) { - hostTagSearch = _hostTagsDao.createSearchBuilder(); - if ((Boolean)haHosts) { - hostTagSearch.and().op("tag", hostTagSearch.entity().getTag(), SearchCriteria.Op.EQ); - } else { - hostTagSearch.and().op("tag", hostTagSearch.entity().getTag(), SearchCriteria.Op.NEQ); - hostTagSearch.or("tagNull", hostTagSearch.entity().getTag(), SearchCriteria.Op.NULL); - } - - hostTagSearch.cp(); - sb.join("hostTagSearch", hostTagSearch, sb.entity().getId(), hostTagSearch.entity().getHostId(), JoinBuilder.JoinType.LEFTOUTER); - } - - final SearchCriteria sc = sb.create(); - - if (keyword != null) { - final SearchCriteria ssc = _hostDao.createSearchCriteria(); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("status", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - - sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } - - if (id != null) { - sc.setParameters("id", id); - } - - if (name != null) { - sc.setParameters("name", "%" + name + "%"); - } - if (type != null) { - sc.setParameters("type", "%" + type); - } - if (state != null) { - sc.setParameters("status", state); - } - if (zone != null) { - sc.setParameters("dataCenterId", zone); - } - if (pod != null) { - sc.setParameters("podId", pod); - } - if (cluster != null) { - sc.setParameters("clusterId", cluster); - } - if (hypervisorType != null) { - sc.setParameters("hypervisorType", hypervisorType); - } - if (hypervisorVersion != null) { - sc.setParameters("hypervisorVersion", hypervisorVersion); - } - - if (resourceState != null) { - sc.setParameters("resourceState", resourceState); - } - - if (haHosts != null && haTag != null && !haTag.isEmpty()) { - sc.setJoinParameters("hostTagSearch", "tag", haTag); - } - - return _hostDao.searchAndCount(sc, searchFilter); - } - private Pair, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, final Object cluster, final Object id, final Object keyword, final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion) { final Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); From ec9fbd92fc52cc5d1528e13370f9636303f32fed Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 18 Feb 2020 22:16:24 +0530 Subject: [PATCH 4/9] wip: make get count from db efficient, no need to get all rows; simply get the total count Signed-off-by: Rohit Yadav --- .../main/java/com/cloud/host/dao/HostDao.java | 2 ++ .../java/com/cloud/host/dao/HostDaoImpl.java | 13 +++++++++++++ .../java/com/cloud/vm/dao/DomainRouterDao.java | 13 +++++++------ .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 9 +++++---- .../storage/datastore/db/ImageStoreDao.java | 2 ++ .../datastore/db/ImageStoreDaoImpl.java | 8 ++++++++ .../java/com/cloud/utils/db/GenericDao.java | 2 ++ .../com/cloud/utils/db/GenericDaoBase.java | 9 +++++++++ .../cloudstack/metrics/MetricsServiceImpl.java | 18 +++++++++--------- 9 files changed, 57 insertions(+), 19 deletions(-) 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 dd45c0987adf..781f82fc3be3 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 @@ public interface HostDao extends GenericDao, StateDao { 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 71f0aef39d67..2b2a80bb69ad 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 implements HostDao protected SearchBuilder UnmanagedDirectConnectSearch; protected SearchBuilder UnmanagedApplianceSearch; protected SearchBuilder MaintenanceCountSearch; + protected SearchBuilder HostTypeCountSearch; protected SearchBuilder ClusterStatusSearch; protected SearchBuilder TypeNameZoneSearch; protected SearchBuilder AvailHypevisorInZone; @@ -159,6 +160,11 @@ public void init() { 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); @@ -429,6 +435,13 @@ public long countBy(long clusterId, ResourceState... states) { return hosts.size(); } + @Override + public Integer countAllByType(final Host.Type type) { + SearchCriteria sc = HostTypeCountSearch.create(); + sc.setParameters("type", type); + return getCount(sc); + } + @Override public List listByDataCenterId(long id) { SearchCriteria sc = DcSearch.create(); 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 cfb19c69e186..c4fd2f6c974d 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 @@ -37,12 +37,6 @@ public interface DomainRouterDao extends GenericDao { */ public List listByDataCenter(long dcId); - /** - * gets the DomainRouterVO by role of the domain router - * @Param role Domain Router role - * @return list of DomainRouterVO - */ - public List listByRole(Role role); /** * gets the DomainRouterVO by account id and data center * @param account id of the user. @@ -102,6 +96,13 @@ public interface DomainRouterDao extends GenericDao { */ public List listRunningByDomain(Long id); + /** + * gets the total count by role + * @Param role Router role + * @return count of resources + */ + Integer countAllByRole(Role role); + List findBy(long accountId, long dcId, Role role); List 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 d752c095360b..17f0ffdeff4a 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,10 +186,11 @@ public List listByDataCenter(final long dcId) { } @Override - public List listByRole(final Role role) { - final SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("role", role); - return listBy(sc); + public Integer countAllByRole(final Role role) { + final SearchCriteria sc = createSearchCriteria(); + sc.addAnd("role", SearchCriteria.Op.EQ, role); + sc.addAnd("removed", Op.NULL); + return getCount(sc); } @Override 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 d0f8fe878506..1861b21a38ad 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 { List findImageCacheByScope(ZoneScope scope); + Integer countAllImageStores(); + List listImageStores(); List 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 9d532625c0ab..38124ea49e0e 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 @@ -110,6 +110,14 @@ public List findImageCacheByScope(ZoneScope scope) { return listBy(sc); } + @Override + public Integer countAllImageStores() { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image); + sc.addAnd("removed", SearchCriteria.Op.NULL); + return getCount(sc); + } + @Override public List listImageStores() { SearchCriteria sc = createSearchCriteria(); 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 63047e7c699b..04c0882f22c5 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 { Map getAllAttributes(); Pair, Integer> searchAndDistinctCount(final SearchCriteria 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 fb923c6f0683..32b19843d274 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 Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) } } + public Integer countAll() { + SearchCriteria sc = null; + if (_removed != null) { + sc = createSearchCriteria(); + sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); + } + return getCount(sc); + } + public Integer getCount(SearchCriteria 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/metrics/MetricsServiceImpl.java b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java index 569ad18108d2..1a9cd27dbc8d 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 @@ -138,16 +138,16 @@ private void updateHostMetrics(final Metrics metrics, final HostJoinVO host) { @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.listByRole(VirtualRouter.Role.VIRTUAL_ROUTER).size()); - response.setInternalLbs(domainRouterDao.listByRole(VirtualRouter.Role.INTERNAL_LB_VM).size()); - response.setAlerts(alertDao.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) { From 0c983177d26eb449eaa242a61c53338d4d49c3fe Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 18 Feb 2020 22:27:55 +0530 Subject: [PATCH 5/9] fix build Signed-off-by: Rohit Yadav --- server/src/test/java/com/cloud/user/MockUsageEventDao.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/test/java/com/cloud/user/MockUsageEventDao.java b/server/src/test/java/com/cloud/user/MockUsageEventDao.java index 5d8ed6c45553..ab844ee69e33 100644 --- a/server/src/test/java/com/cloud/user/MockUsageEventDao.java +++ b/server/src/test/java/com/cloud/user/MockUsageEventDao.java @@ -283,6 +283,11 @@ public Pair, Integer> searchAndDistinctCount(SearchCriteria listLatestEvents(Date endDate) { return null; From a73ff27b777a3d9cf720424d777cb2558346aa97 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 19 Feb 2020 00:27:11 +0530 Subject: [PATCH 6/9] patch to allow listing of all resources including project when projectid=-1 and listall=true for non-user accounts Signed-off-by: Rohit Yadav --- api/src/main/java/com/cloud/projects/Project.java | 2 +- server/src/main/java/com/cloud/user/AccountManagerImpl.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/cloud/projects/Project.java b/api/src/main/java/com/cloud/projects/Project.java index 5fff3082c367..7cc370c8df13 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 enum State { } public enum ListProjectResourcesCriteria { - ListProjectResourcesOnly, SkipProjectResources + ListProjectResourcesOnly, SkipProjectResources, ListAllIncludingProjectResources } String getDisplayText(); diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index 20d769f09efa..5ec74a9d3b0e 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -2670,7 +2670,7 @@ public void buildACLSearchParameters(Account caller, Long id, String accountName // set project information if (projectId != null) { if (!forProjectInvitation) { - if (projectId.longValue() == -1) { + if (projectId == -1L) { if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { permittedAccounts.addAll(_projectMgr.listPermittedProjectAccounts(caller.getId())); @@ -2680,6 +2680,9 @@ public void buildACLSearchParameters(Account caller, Long id, String accountName } } else { domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly); + if (listAll) { + domainIdRecursiveListProject.third(ListProjectResourcesCriteria.ListAllIncludingProjectResources); + } } } else { Project project = _projectMgr.getProject(projectId); From 6c6be1513190e98a0a00e0adcc3373d5c1a46049 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 19 Feb 2020 00:39:55 +0530 Subject: [PATCH 7/9] ui: don't pass both listall=true and projectid=-1 Passing both would return all the resources including those from all projects Signed-off-by: Rohit Yadav --- ui/scripts/system.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index fe9b35912cee..e016b22ff6c1 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) { From fdc0be4d1b31d2cc8456c5b1e83d6ca070167e38 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Sun, 23 Feb 2020 13:46:33 +0530 Subject: [PATCH 8/9] return all items only for the root admin Signed-off-by: Rohit Yadav --- server/src/main/java/com/cloud/user/AccountManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index 5ec74a9d3b0e..e40d66be664c 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -2680,7 +2680,7 @@ public void buildACLSearchParameters(Account caller, Long id, String accountName } } else { domainIdRecursiveListProject.third(Project.ListProjectResourcesCriteria.ListProjectResourcesOnly); - if (listAll) { + if (listAll && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { domainIdRecursiveListProject.third(ListProjectResourcesCriteria.ListAllIncludingProjectResources); } } From e38b087ff0b1ca8d4a3b8a4e92b34cbd0d05d6ad Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 25 Feb 2020 14:49:03 +0530 Subject: [PATCH 9/9] server: list project resources listing for non-root-admin accounts Signed-off-by: Rohit Yadav --- .../com/cloud/api/query/QueryManagerImpl.java | 6 +++--- .../java/com/cloud/user/AccountManagerImpl.java | 15 +++++++-------- 2 files changed, 10 insertions(+), 11 deletions(-) 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 5819beeafb3b..c815be8d9a5c 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 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.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.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; diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index e40d66be664c..77f21f00bc83 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -2671,18 +2671,17 @@ public void buildACLSearchParameters(Account caller, Long id, String accountName if (projectId != null) { if (!forProjectInvitation) { if (projectId == -1L) { - if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { + 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); - if (listAll && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { - domainIdRecursiveListProject.third(ListProjectResourcesCriteria.ListAllIncludingProjectResources); - } } } else { Project project = _projectMgr.getProject(projectId);