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 @@
/>
-
+
-
+