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..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 @@ -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.24.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',