From f324f5c3ef908bccd3ae9b8b5412964dbd7258fe Mon Sep 17 00:00:00 2001 From: Gean Jair Silva Date: Fri, 17 Jul 2026 11:03:05 -0300 Subject: [PATCH 1/2] Add filter by type to listBackups API and expand the UI to be able to filter by VM --- .../api/command/user/backup/ListBackupsCmd.java | 10 ++++++++++ .../apache/cloudstack/backup/BackupManagerImpl.java | 4 ++++ ui/src/components/view/SearchView.vue | 2 +- ui/src/config/section/storage.js | 6 ++---- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java index 35cadd9f2e5e..aa36ea38a52b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java @@ -95,6 +95,12 @@ public class ListBackupsCmd extends BaseListProjectAndAccountResourcesCmd { description = "list backups by status") private String backupStatus; + @Parameter(name = ApiConstants.TYPE, + type = CommandType.STRING, + since = "4.23.0", + description = "list backups by type") + private String backupType; + @Parameter(name = ApiConstants.LIST_VM_DETAILS, type = CommandType.BOOLEAN, since = "4.21.0", @@ -129,6 +135,10 @@ public String getBackupStatus() { return backupStatus; } + public String getBackupType() { + return backupType; + } + public Boolean getListVmDetails() { return listVmDetails; } diff --git a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java index 9be4c7ea083c..a8b8153a0286 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -1232,6 +1232,7 @@ public Pair, Integer> listBackups(final ListBackupsCmd cmd) { final Long zoneId = cmd.getZoneId(); final Long backupOfferingId = cmd.getBackupOfferingId(); final Backup.Status backupStatus = validateBackupStatus(cmd.getBackupStatus()); + final String backupType = cmd.getBackupType(); final Account caller = CallContext.current().getCallingAccount(); final String keyword = cmd.getKeyword(); List permittedAccounts = new ArrayList(); @@ -1264,6 +1265,7 @@ public Pair, Integer> listBackups(final ListBackupsCmd cmd) { // incremental chain GC can sweep them once their last descendant is deleted. sb.and("statusNeq", sb.entity().getStatus(), SearchCriteria.Op.NEQ); sb.and("backupStatus", sb.entity().getStatus(), SearchCriteria.Op.EQ); + sb.and("backupType", sb.entity().getType(), SearchCriteria.Op.EQ); if (keyword != null) { sb.and().op("keywordName", sb.entity().getName(), SearchCriteria.Op.LIKE); @@ -1299,6 +1301,8 @@ public Pair, Integer> listBackups(final ListBackupsCmd cmd) { sc.setParametersIfNotNull("backupStatus", backupStatus); + sc.setParametersIfNotNull("backupType", backupType); + if (keyword != null) { String keywordMatch = "%" + keyword + "%"; sc.setParameters("keywordName", keywordMatch); diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue index 227ee0a75fa5..7cd5db96f483 100644 --- a/ui/src/components/view/SearchView.vue +++ b/ui/src/components/view/SearchView.vue @@ -334,7 +334,7 @@ export default { } if (['zoneid', 'domainid', 'imagestoreid', 'storageid', 'state', 'account', 'hypervisor', 'level', 'clusterid', 'podid', 'groupid', 'entitytype', 'accounttype', 'systemvmtype', 'scope', 'provider', - 'type', 'scope', 'managementserverid', 'serviceofferingid', + 'scope', 'managementserverid', 'serviceofferingid', 'diskofferingid', 'networkid', 'usagetype', 'restartrequired', 'gpuenabled', 'displaynetwork', 'guestiptype', 'usersource', 'arch', 'oscategoryid', 'templatetype', 'gpucardid', 'vgpuprofileid', 'extensionid', 'backupoffering', 'volumeid', 'virtualmachineid', 'hsmprofileid', 'kmskeyid', 'status'].includes(item) diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js index 702b782690af..4acb357bafd4 100644 --- a/ui/src/config/section/storage.js +++ b/ui/src/config/section/storage.js @@ -495,10 +495,8 @@ export default { params: { listvmdetails: 'true' }, columns: ['name', 'status', 'compressionstatus', 'validationstatus', 'size', 'virtualsize', 'virtualmachinename', 'backupofferingname', 'intervaltype', 'type', 'created', 'account', 'domain', 'zone'], details: ['name', 'description', 'virtualmachinename', 'id', 'intervaltype', 'type', 'externalid', 'size', 'virtualsize', 'volumes', 'backupofferingname', 'zone', 'account', 'domain', 'created'], - searchFilters: () => { - var filters = ['name', 'zoneid', 'domainid', 'account', 'backupofferingid', 'status'] - return filters - }, + searchFilters: ['name', 'zoneid', 'domainid', 'account', 'backupofferingid', 'status', 'type', 'virtualmachineid'], + tabs: [ { name: 'details', From 16caf332f82cdb0f8c5da0220574d2e348348efa Mon Sep 17 00:00:00 2001 From: Gean Jair Silva <89494158+GeanJair@users.noreply.github.com> Date: Tue, 21 Jul 2026 10:35:15 -0300 Subject: [PATCH 2/2] Update api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bernardo De Marco Gonçalves --- .../cloudstack/api/command/user/backup/ListBackupsCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java index aa36ea38a52b..1893589f2fd9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java @@ -97,7 +97,7 @@ public class ListBackupsCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, - since = "4.23.0", + since = "4.24.0", description = "list backups by type") private String backupType;