This is an automated email from the ASF dual-hosted git repository.
weizhouapache 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 20e9980b60a backup: allow third-party backup provider plugins in
configuration (#13332)
20e9980b60a is described below
commit 20e9980b60a5b646a6f73f85d72dd42efe2d82ec
Author: Yiğit can BAŞALMA <[email protected]>
AuthorDate: Fri Jul 10 09:22:35 2026 +0300
backup: allow third-party backup provider plugins in configuration (#13332)
* Fix
* fix: validate backup provider plugin via Spring bean instead of allowed
list
* fix: unused import error
* fix: handle missing backup provider gracefully to prevent dashboard
failure
* fix: handle missing backup provider gracefully in
getBackupStorageUsedStats
---------
Co-authored-by: Yiğit Can Başalma <yigit.basalma@local>
---
.../org/apache/cloudstack/backup/BackupManager.java | 17 +++--------------
.../org/apache/cloudstack/backup/BackupManagerImpl.java | 11 ++++++++---
2 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
index 0da11bbd651..3d520f30626 100644
--- a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
+++ b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
@@ -33,7 +33,6 @@ import
org.apache.cloudstack.api.command.user.backup.ListBackupScheduleCmd;
import org.apache.cloudstack.api.command.user.backup.ListBackupsCmd;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.ValidatedConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
import com.cloud.exception.ResourceUnavailableException;
@@ -55,11 +54,11 @@ public interface BackupManager extends BackupService,
Configurable, PluggableSer
"false",
"Is backup and recovery framework enabled.", false,
ConfigKey.Scope.Zone);
- ConfigKey<String> BackupProviderPlugin = new
ValidatedConfigKey<>("Advanced", String.class,
+ ConfigKey<String> BackupProviderPlugin = new ConfigKey<>("Advanced",
String.class,
"backup.framework.provider.plugin",
"dummy",
- "The backup and recovery provider plugin. Valid plugin values:
dummy, veeam, networker and nas",
- true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key(), value ->
validateBackupProviderConfig((String)value));
+ "The backup and recovery provider plugin.",
+ true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key());
ConfigKey<Long> BackupSyncPollingInterval = new ConfigKey<>("Advanced",
Long.class,
"backup.framework.sync.interval",
@@ -258,14 +257,4 @@ public interface BackupManager extends BackupService,
Configurable, PluggableSer
Capacity getBackupStorageUsedStats(Long zoneId);
void checkAndRemoveBackupOfferingBeforeExpunge(VirtualMachine vm);
-
- static void validateBackupProviderConfig(String value) {
- if (value != null && (value.contains(",") || value.trim().contains("
"))) {
- throw new IllegalArgumentException("Multiple backup provider
plugins are not supported. Please provide a single plugin value.");
- }
- List<String> validPlugins = List.of("dummy", "veeam", "networker",
"nas");
- if (value != null && !validPlugins.contains(value)) {
- throw new IllegalArgumentException("Invalid backup provider
plugin: " + value + ". Valid plugin values are: " + String.join(", ",
validPlugins));
- }
- }
}
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 0636ffdc3c1..ed3d8558cc5 100644
--- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
@@ -2507,9 +2507,14 @@ public class BackupManagerImpl extends ManagerBase
implements BackupManager {
if (isDisabled(zoneId)) {
return new CapacityVO(null, zoneId, null, null, 0L, 0L,
Capacity.CAPACITY_TYPE_BACKUP_STORAGE);
}
- final BackupProvider backupProvider = getBackupProvider(zoneId);
- Pair<Long, Long> backupUsage =
backupProvider.getBackupStorageStats(zoneId);
- return new CapacityVO(null, zoneId, null, null, backupUsage.first(),
backupUsage.second(), Capacity.CAPACITY_TYPE_BACKUP_STORAGE);
+ try {
+ final BackupProvider backupProvider = getBackupProvider(zoneId);
+ Pair<Long, Long> backupUsage =
backupProvider.getBackupStorageStats(zoneId);
+ return new CapacityVO(null, zoneId, null, null,
backupUsage.first(), backupUsage.second(),
Capacity.CAPACITY_TYPE_BACKUP_STORAGE);
+ } catch (CloudRuntimeException e) {
+ logger.warn("Backup provider not found for zone {}: {}", zoneId,
e.getMessage());
+ return new CapacityVO(null, zoneId, null, null, 0L, 0L,
Capacity.CAPACITY_TYPE_BACKUP_STORAGE);
+ }
}
@Override