From 9f8b04dedd91a159fb1eb43b345e0ee86f474b93 Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Tue, 21 Jul 2026 22:29:09 +0530 Subject: [PATCH 1/2] Don't set compressionstatus and validation status in backupVO and backupsResponse for non-kboss providers. These columns are hidden in UI if they are not set. --- .../java/org/apache/cloudstack/backup/BackupVO.java | 9 ++++----- .../cloudstack/backup/KbossBackupProvider.java | 3 ++- .../apache/cloudstack/backup/BackupManagerImpl.java | 12 ++++++++---- ui/src/views/AutogenView.vue | 10 ++++++++++ ui/src/views/compute/InstanceTab.vue | 4 +++- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupVO.java b/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupVO.java index c2b091700edc..b4cad92d8770 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupVO.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/backup/BackupVO.java @@ -128,11 +128,10 @@ public class BackupVO implements Backup { public BackupVO() { this.uuid = UUID.randomUUID().toString(); - this.compressionStatus = CompressionStatus.Uncompressed; - this.validationStatus = ValidationStatus.NotValidated; } - public BackupVO(String name, long vmId, long backupOfferingId, long accountId, long domainId, long zoneId, long virtualSize, Status status, Long backupScheduleId) { + public BackupVO(String name, long vmId, long backupOfferingId, long accountId, long domainId, long zoneId, long virtualSize, + Status status, Long backupScheduleId, CompressionStatus compressionStatus, ValidationStatus validationStatus) { this.name = name; this.vmId = vmId; this.backupOfferingId = backupOfferingId; @@ -144,8 +143,8 @@ public BackupVO(String name, long vmId, long backupOfferingId, long accountId, l this.setType("FULL"); this.uuid = UUID.randomUUID().toString(); this.backupScheduleId = backupScheduleId; - this.compressionStatus = CompressionStatus.Uncompressed; - this.validationStatus = ValidationStatus.NotValidated; + this.compressionStatus = compressionStatus; + this.validationStatus = validationStatus; } @Override diff --git a/plugins/backup/kboss/src/main/java/org/apache/cloudstack/backup/KbossBackupProvider.java b/plugins/backup/kboss/src/main/java/org/apache/cloudstack/backup/KbossBackupProvider.java index 60bfb7a0b584..0569c318935e 100644 --- a/plugins/backup/kboss/src/main/java/org/apache/cloudstack/backup/KbossBackupProvider.java +++ b/plugins/backup/kboss/src/main/java/org/apache/cloudstack/backup/KbossBackupProvider.java @@ -1071,7 +1071,8 @@ protected Outcome createBackupThroughJobQueue(VirtualMachine vm, boolean quie long vmId = vm.getId(); BackupVO backup = new BackupVO(String.format("%s-%s", vm.getHostName(), DateUtil.getDateInSystemTimeZone()), vmId, vm.getBackupOfferingId(), accountId, - vm.getDomainId(), vm.getDataCenterId(), 0, Backup.Status.Queued, backupScheduleId); + vm.getDomainId(), vm.getDataCenterId(), 0, Backup.Status.Queued, backupScheduleId, + Backup.CompressionStatus.Uncompressed, Backup.ValidationStatus.NotValidated); VmWorkJobVO workJob = new VmWorkJobVO(AsyncJobExecutionContext.getOriginJobId(), userId, accountId, VmWorkTakeBackup.class.getName(), vmId, VirtualMachine.Type.Instance, VmWorkJobVO.Step.Starting); 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..58bad20e4f1a 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -2653,11 +2653,15 @@ public BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails) response.setProtectedSize(backup.getProtectedSize()); response.setStatus(backup.getStatus()); response.setIntervalType("MANUAL"); - response.setCompressionStatus(backup.getCompressionStatus()); - if (backup.getUncompressedSize() != null && backup.getUncompressedSize() > 0) { - response.setUncompressedSize(backup.getUncompressedSize()); + if (backup.getCompressionStatus() != null) { + response.setCompressionStatus(backup.getCompressionStatus()); + if (backup.getUncompressedSize() != null && backup.getUncompressedSize() > 0) { + response.setUncompressedSize(backup.getUncompressedSize()); + } + } + if (backup.getValidationStatus() != null) { + response.setValidationStatus(backup.getValidationStatus()); } - response.setValidationStatus(backup.getValidationStatus()); if (backup.getBackupScheduleId() != null) { BackupScheduleVO scheduleVO = backupScheduleDao.findById(backup.getBackupScheduleId()); if (scheduleVO != null) { diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index 284aee4ffa38..8b492d507a2e 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -1267,6 +1267,16 @@ export default { }) } + if (this.apiName === 'listBackups') { + const kbossFields = ['compressionstatus', 'validationstatus'] + const hasKbossData = this.items.some(backup => kbossFields.some(field => backup[field])) + if (!hasKbossData) { + this.columns = this.columns.filter(col => !kbossFields.includes(col.dataIndex)) + this.allColumns = this.allColumns.filter(col => !kbossFields.includes(col.dataIndex)) + this.selectedColumns = this.selectedColumns.filter(key => !kbossFields.includes(key)) + } + } + for (let idx = 0; idx < this.items.length; idx++) { this.items[idx].key = idx for (const key in customRender) { diff --git a/ui/src/views/compute/InstanceTab.vue b/ui/src/views/compute/InstanceTab.vue index 85710db933ea..d125995e3e1c 100644 --- a/ui/src/views/compute/InstanceTab.vue +++ b/ui/src/views/compute/InstanceTab.vue @@ -74,7 +74,9 @@ apiName="listBackups" :resource="resource" :params="{virtualmachineid: dataResource.id}" - :columns="['name', 'status', 'compressionstatus', 'validationstatus', 'size', 'virtualsize', 'type', 'intervaltype', 'created']" + :columns="dataResource.backupprovider === 'kboss' + ? ['name', 'status', 'compressionstatus', 'validationstatus', 'size', 'virtualsize', 'type', 'intervaltype', 'created'] + : ['name', 'status', 'size', 'virtualsize', 'type', 'intervaltype', 'created']" :routerlinks="(record) => { return { name: '/backup/' + record.id } }" :showSearch="false"/> From f3db06dead6f36383e7f73b4523d5168e0af07be Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Wed, 22 Jul 2026 11:08:56 +0530 Subject: [PATCH 2/2] Show compressionstatus and validation status as Unknown if not present and if column is being shown --- ui/src/components/view/ListView.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index f6fd6be3583a..9272617900f1 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -484,10 +484,10 @@ />