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

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


The following commit(s) were added to refs/heads/main by this push:
     new c6237c48aca Retrieve only resource count on user dashboard (#7617)
c6237c48aca is described below

commit c6237c48acac8b405e1f12492835c86ea33b9829
Author: Daniel Augusto Veronezi Salvador 
<[email protected]>
AuthorDate: Fri Jun 30 11:09:55 2023 -0300

    Retrieve only resource count on user dashboard (#7617)
    
    * Allow retrieving only the count of resources on APIs 
listPublicIpAddresses, listNetworks, listVirtualMachines and listVolumes
    
    * Use parameter to retrieve only the count of resources in the dashboard
    
    * Create abstract class
---
 .../org/apache/cloudstack/api/ApiConstants.java    |  1 +
 .../api/BaseListRetrieveOnlyResourceCountCmd.java  | 28 +++++++++++++++++++++
 .../user/address/ListPublicIpAddressesCmd.java     | 19 +++++++-------
 .../api/command/user/network/ListNetworksCmd.java  | 29 ++++++++++++----------
 .../cloudstack/api/command/user/vm/ListVMsCmd.java | 13 ++++------
 .../api/command/user/volume/ListVolumesCmd.java    | 11 ++++----
 .../java/com/cloud/api/query/QueryManagerImpl.java | 15 +++++++++--
 ui/src/views/dashboard/UsageDashboard.vue          | 12 ++++-----
 8 files changed, 83 insertions(+), 45 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java 
b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 509c2a35d20..d3ce4d3c7c7 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -372,6 +372,7 @@ public class ApiConstants {
     public static final String RESOURCE_TYPE = "resourcetype";
     public static final String RESOURCE_TYPE_NAME = "resourcetypename";
     public static final String RESPONSE = "response";
+    public static final String RETRIEVE_ONLY_RESOURCE_COUNT = 
"retrieveonlyresourcecount";
     public static final String REVERTABLE = "revertable";
     public static final String REVOKED = "revoked";
     public static final String REGISTERED = "registered";
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/BaseListRetrieveOnlyResourceCountCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/BaseListRetrieveOnlyResourceCountCmd.java
new file mode 100644
index 00000000000..0e8e136a6c1
--- /dev/null
+++ 
b/api/src/main/java/org/apache/cloudstack/api/BaseListRetrieveOnlyResourceCountCmd.java
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api;
+
+import org.apache.commons.lang3.BooleanUtils;
+
+public abstract class BaseListRetrieveOnlyResourceCountCmd extends 
BaseListTaggedResourcesCmd {
+    @Parameter(name = ApiConstants.RETRIEVE_ONLY_RESOURCE_COUNT, type = 
CommandType.BOOLEAN, description = "makes the API's response contains only the 
resource count")
+    private Boolean retrieveOnlyResourceCount;
+
+    public Boolean getRetrieveOnlyResourceCount() {
+        return BooleanUtils.toBooleanDefaultIfNull(retrieveOnlyResourceCount, 
false);
+    }
+}
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
index 505de6829a0..22eb70cc0c2 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
@@ -25,7 +25,7 @@ import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandResourceType;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
+import org.apache.cloudstack.api.BaseListRetrieveOnlyResourceCountCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.UserCmd;
@@ -42,7 +42,7 @@ import com.cloud.utils.Pair;
 
 @APICommand(name = "listPublicIpAddresses", description = "Lists all public IP 
addresses", responseObject = IPAddressResponse.class, responseView = 
ResponseView.Restricted,
  requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, entityType 
= { IpAddress.class })
-public class ListPublicIpAddressesCmd extends BaseListTaggedResourcesCmd 
implements UserCmd {
+public class ListPublicIpAddressesCmd extends 
BaseListRetrieveOnlyResourceCountCmd implements UserCmd {
     public static final Logger s_logger = 
Logger.getLogger(ListPublicIpAddressesCmd.class.getName());
 
     private static final String s_name = "listpublicipaddressesresponse";
@@ -173,10 +173,6 @@ public class ListPublicIpAddressesCmd extends 
BaseListTaggedResourcesCmd impleme
         return forVirtualNetwork;
     }
 
-    public Boolean getForLoadBalancing() {
-        return forLoadBalancing;
-    }
-
     public String getState() {
         return state;
     }
@@ -194,10 +190,13 @@ public class ListPublicIpAddressesCmd extends 
BaseListTaggedResourcesCmd impleme
         Pair<List<? extends IpAddress>, Integer> result = 
_mgr.searchForIPAddresses(this);
         ListResponse<IPAddressResponse> response = new ListResponse<>();
         List<IPAddressResponse> ipAddrResponses = new ArrayList<>();
-        for (IpAddress ipAddress : result.first()) {
-            IPAddressResponse ipResponse = 
_responseGenerator.createIPAddressResponse(getResponseView(), ipAddress);
-            ipResponse.setObjectName("publicipaddress");
-            ipAddrResponses.add(ipResponse);
+
+        if (!getRetrieveOnlyResourceCount()) {
+            for (IpAddress ipAddress : result.first()) {
+                IPAddressResponse ipResponse = 
_responseGenerator.createIPAddressResponse(getResponseView(), ipAddress);
+                ipResponse.setObjectName("publicipaddress");
+                ipAddrResponses.add(ipResponse);
+            }
         }
 
         response.setResponses(ipAddrResponses, result.second());
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
index df82d9fd625..f370c037814 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
@@ -23,12 +23,13 @@ import com.cloud.server.ResourceIcon;
 import com.cloud.server.ResourceTag;
 import org.apache.cloudstack.api.response.NetworkOfferingResponse;
 import org.apache.cloudstack.api.response.ResourceIconResponse;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
+import org.apache.cloudstack.api.BaseListRetrieveOnlyResourceCountCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.UserCmd;
@@ -44,7 +45,7 @@ import org.apache.commons.lang3.StringUtils;
 
 @APICommand(name = "listNetworks", description = "Lists all available 
networks.", responseObject = NetworkResponse.class, responseView = 
ResponseView.Restricted, entityType = {Network.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
-public class ListNetworksCmd extends BaseListTaggedResourcesCmd implements 
UserCmd {
+public class ListNetworksCmd extends BaseListRetrieveOnlyResourceCountCmd 
implements UserCmd {
     public static final Logger s_logger = 
Logger.getLogger(ListNetworksCmd.class.getName());
     private static final String s_name = "listnetworksresponse";
 
@@ -190,14 +191,11 @@ public class ListNetworksCmd extends 
BaseListTaggedResourcesCmd implements UserC
 
     @Override
     public Boolean getDisplay() {
-        if (display != null) {
-            return display;
-        }
-        return super.getDisplay();
+        return BooleanUtils.toBooleanDefaultIfNull(display, 
super.getDisplay());
     }
 
     public Boolean getShowIcon() {
-        return showIcon != null ? showIcon : false;
+        return BooleanUtils.toBooleanDefaultIfNull(showIcon, false);
     }
 
     public String getNetworkFilter() {
@@ -215,16 +213,21 @@ public class ListNetworksCmd extends 
BaseListTaggedResourcesCmd implements UserC
     @Override
     public void execute() {
         Pair<List<? extends Network>, Integer> networks = 
_networkService.searchForNetworks(this);
-        ListResponse<NetworkResponse> response = new 
ListResponse<NetworkResponse>();
-        List<NetworkResponse> networkResponses = new 
ArrayList<NetworkResponse>();
-        for (Network network : networks.first()) {
-            NetworkResponse networkResponse = 
_responseGenerator.createNetworkResponse(getResponseView(), network);
-            networkResponses.add(networkResponse);
+        ListResponse<NetworkResponse> response = new ListResponse<>();
+        List<NetworkResponse> networkResponses = new ArrayList<>();
+
+        if (!getRetrieveOnlyResourceCount()) {
+            for (Network network : networks.first()) {
+                NetworkResponse networkResponse = 
_responseGenerator.createNetworkResponse(getResponseView(), network);
+                networkResponses.add(networkResponse);
+            }
         }
+
         response.setResponses(networkResponses, networks.second());
         response.setResponseName(getCommandName());
         setResponseObject(response);
-        if (response != null && response.getCount() > 0 && getShowIcon()) {
+
+        if (!getRetrieveOnlyResourceCount() && response.getCount() > 0 && 
getShowIcon()) {
             updateNetworkResponse(response.getResponses());
         }
     }
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java 
b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index e609655c580..07d83b47d3c 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@ -26,7 +26,7 @@ import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandResourceType;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiConstants.VMDetails;
-import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
+import org.apache.cloudstack.api.BaseListRetrieveOnlyResourceCountCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.UserCmd;
@@ -44,6 +44,7 @@ import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VpcResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.exception.InvalidParameterValueException;
@@ -54,7 +55,7 @@ import com.cloud.vm.VirtualMachine;
 
 @APICommand(name = "listVirtualMachines", description = "List the virtual 
machines owned by the account.", responseObject = UserVmResponse.class, 
responseView = ResponseView.Restricted, entityType = {VirtualMachine.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
-public class ListVMsCmd extends BaseListTaggedResourcesCmd implements UserCmd {
+public class ListVMsCmd extends BaseListRetrieveOnlyResourceCountCmd 
implements UserCmd {
     public static final Logger s_logger = 
Logger.getLogger(ListVMsCmd.class.getName());
 
     private static final String s_name = "listvirtualmachinesresponse";
@@ -148,7 +149,6 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd 
implements UserCmd {
     @Parameter(name = ApiConstants.USER_DATA, type = CommandType.BOOLEAN, 
description = "Whether to return the VMs' user data or not. By default, user 
data will not be returned.", since = "4.18.0.0")
     private Boolean showUserData;
 
-
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -255,14 +255,11 @@ public class ListVMsCmd extends 
BaseListTaggedResourcesCmd implements UserCmd {
 
     @Override
     public Boolean getDisplay() {
-        if (display != null) {
-            return display;
-        }
-        return super.getDisplay();
+        return BooleanUtils.toBooleanDefaultIfNull(display, 
super.getDisplay());
     }
 
     public Boolean getShowIcon() {
-        return showIcon != null ? showIcon : false;
+        return BooleanUtils.toBooleanDefaultIfNull(showIcon, false);
     }
 
     public Boolean getAccumulate() {
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
index fdac3ff2937..b62a909d71f 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
@@ -22,7 +22,7 @@ import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandResourceType;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
+import org.apache.cloudstack.api.BaseListRetrieveOnlyResourceCountCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.UserCmd;
@@ -35,13 +35,14 @@ import 
org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.storage.Volume;
 
 @APICommand(name = "listVolumes", description = "Lists all volumes.", 
responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, 
entityType = {
         Volume.class}, requestHasSensitiveInfo = false, 
responseHasSensitiveInfo = false)
-public class ListVolumesCmd extends BaseListTaggedResourcesCmd implements 
UserCmd {
+public class ListVolumesCmd extends BaseListRetrieveOnlyResourceCountCmd 
implements UserCmd {
     public static final Logger s_logger = 
Logger.getLogger(ListVolumesCmd.class.getName());
 
     private static final String s_name = "listvolumesresponse";
@@ -145,15 +146,13 @@ public class ListVolumesCmd extends 
BaseListTaggedResourcesCmd implements UserCm
 
     @Override
     public Boolean getDisplay() {
-        if (display != null) {
-            return display;
-        }
-        return super.getDisplay();
+        return BooleanUtils.toBooleanDefaultIfNull(display, 
super.getDisplay());
     }
 
     public String getState() {
         return state;
     }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
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 e78f6958e1a..63927f2f9ef 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -973,7 +973,13 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
     @Override
     public ListResponse<UserVmResponse> searchForUserVMs(ListVMsCmd cmd) {
         Pair<List<UserVmJoinVO>, Integer> result = 
searchForUserVMsInternal(cmd);
-        ListResponse<UserVmResponse> response = new 
ListResponse<UserVmResponse>();
+        ListResponse<UserVmResponse> response = new ListResponse<>();
+
+        if (cmd.getRetrieveOnlyResourceCount()) {
+            response.setResponses(new ArrayList<>(), result.second());
+            return response;
+        }
+
         ResponseView respView = ResponseView.Restricted;
         Account caller = CallContext.current().getCallingAccount();
         if (_accountMgr.isRootAdmin(caller.getId())) {
@@ -2062,7 +2068,12 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
     @Override
     public ListResponse<VolumeResponse> searchForVolumes(ListVolumesCmd cmd) {
         Pair<List<VolumeJoinVO>, Integer> result = 
searchForVolumesInternal(cmd);
-        ListResponse<VolumeResponse> response = new 
ListResponse<VolumeResponse>();
+        ListResponse<VolumeResponse> response = new ListResponse<>();
+
+        if (cmd.getRetrieveOnlyResourceCount()) {
+            response.setResponses(new ArrayList<>(), result.second());
+            return response;
+        }
 
         ResponseView respView = cmd.getResponseView();
         Account account = CallContext.current().getCallingAccount();
diff --git a/ui/src/views/dashboard/UsageDashboard.vue 
b/ui/src/views/dashboard/UsageDashboard.vue
index 4264a90f925..28a892ac71e 100644
--- a/ui/src/views/dashboard/UsageDashboard.vue
+++ b/ui/src/views/dashboard/UsageDashboard.vue
@@ -169,7 +169,7 @@ export default {
   methods: {
     fetchData () {
       this.stats = [{}, {}, {}, {}, {}, {}]
-      api('listVirtualMachines', { state: 'Running', listall: true 
}).then(json => {
+      api('listVirtualMachines', { state: 'Running', listall: true, 
retrieveonlyresourcecount: true }).then(json => {
         var count = 0
         if (json && json.listvirtualmachinesresponse) {
           count = json.listvirtualmachinesresponse.count
@@ -177,7 +177,7 @@ export default {
         var tileColor = this.$config.theme['@dashboard-tile-runningvms-bg'] || 
'#dfe9cc'
         this.stats.splice(0, 1, { name: this.$t('label.running.vms'), count: 
count, icon: 'desktop-outlined', bgcolor: tileColor, path: '/vm', query: { 
state: 'running', filter: 'running' } })
       })
-      api('listVirtualMachines', { state: 'Stopped', listall: true 
}).then(json => {
+      api('listVirtualMachines', { state: 'Stopped', listall: true, 
retrieveonlyresourcecount: true }).then(json => {
         var count = 0
         if (json && json.listvirtualmachinesresponse) {
           count = json.listvirtualmachinesresponse.count
@@ -185,7 +185,7 @@ export default {
         var tileColor = this.$config.theme['@dashboard-tile-stoppedvms-bg'] || 
'#edcbce'
         this.stats.splice(1, 1, { name: this.$t('label.stopped.vms'), count: 
count, icon: 'poweroff-outlined', bgcolor: tileColor, path: '/vm', query: { 
state: 'stopped', filter: 'stopped' } })
       })
-      api('listVirtualMachines', { listall: true }).then(json => {
+      api('listVirtualMachines', { listall: true, retrieveonlyresourcecount: 
true }).then(json => {
         var count = 0
         if (json && json.listvirtualmachinesresponse) {
           count = json.listvirtualmachinesresponse.count
@@ -193,7 +193,7 @@ export default {
         var tileColor = this.$config.theme['@dashboard-tile-totalvms-bg'] || 
'#ffffff'
         this.stats.splice(2, 1, { name: this.$t('label.total.vms'), count: 
count, icon: 'number-outlined', bgcolor: tileColor, path: '/vm' })
       })
-      api('listVolumes', { listall: true }).then(json => {
+      api('listVolumes', { listall: true, retrieveonlyresourcecount: true 
}).then(json => {
         var count = 0
         if (json && json.listvolumesresponse) {
           count = json.listvolumesresponse.count
@@ -201,7 +201,7 @@ export default {
         var tileColor = this.$config.theme['@dashboard-tile-totalvolumes-bg'] 
|| '#ffffff'
         this.stats.splice(3, 1, { name: this.$t('label.total.volume'), count: 
count, icon: 'database-outlined', bgcolor: tileColor, path: '/volume' })
       })
-      api('listNetworks', { listall: true }).then(json => {
+      api('listNetworks', { listall: true, retrieveonlyresourcecount: true 
}).then(json => {
         var count = 0
         if (json && json.listnetworksresponse) {
           count = json.listnetworksresponse.count
@@ -209,7 +209,7 @@ export default {
         var tileColor = this.$config.theme['@dashboard-tile-totalnetworks-bg'] 
|| '#ffffff'
         this.stats.splice(4, 1, { name: this.$t('label.total.network'), count: 
count, icon: 'apartment-outlined', bgcolor: tileColor, path: '/guestnetwork' })
       })
-      api('listPublicIpAddresses', { listall: true }).then(json => {
+      api('listPublicIpAddresses', { listall: true, retrieveonlyresourcecount: 
true }).then(json => {
         var count = 0
         if (json && json.listpublicipaddressesresponse) {
           count = json.listpublicipaddressesresponse.count

Reply via email to