Copilot commented on code in PR #13332:
URL: https://github.com/apache/cloudstack/pull/13332#discussion_r3410002663


##########
api/src/main/java/org/apache/cloudstack/backup/BackupManager.java:
##########
@@ -57,9 +58,16 @@ public interface BackupManager extends BackupService, 
Configurable, PluggableSer
     ConfigKey<String> BackupProviderPlugin = new 
ValidatedConfigKey<>("Advanced", String.class,
             "backup.framework.provider.plugin",
             "dummy",
-            "The backup and recovery provider plugin. Valid plugin values: 
dummy, veeam, networker and nas",
+            "The backup and recovery provider plugin. Default built-in 
plugins: dummy, veeam, networker, nas. Additional plugins can be allowed via 
backup.framework.provider.plugin.allowed setting.",
             true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key(), value -> 
validateBackupProviderConfig((String)value));
 
+    ConfigKey<String> AllowedBackupProviderPlugins = new ConfigKey<>(
+            "Advanced", String.class,
+            "backup.framework.provider.plugin.allowed",
+            "dummy,veeam,networker,nas",
+            "Comma-separated list of allowed backup provider plugins.",
+            true, ConfigKey.Scope.Zone);

Review Comment:
   `AllowedBackupProviderPlugins` is declared with `ConfigKey.Scope.Zone`, but 
`validateBackupProviderConfig` reads it via 
`AllowedBackupProviderPlugins.value()`, which (per ConfigKey.value()) always 
fetches the **Global** scope. As a result, any per-zone value of 
`backup.framework.provider.plugin.allowed` will be ignored during validation, 
which is confusing and can block intended zone-specific configuration.



##########
api/src/main/java/org/apache/cloudstack/backup/BackupManager.java:
##########
@@ -254,9 +262,14 @@ 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));
+        String allowed = AllowedBackupProviderPlugins.value();
+        if (allowed != null && value != null) {
+            List<String> validPlugins = Arrays.asList(allowed.split(","));
+            if (!validPlugins.contains(value.trim())) {
+                throw new IllegalArgumentException("Invalid backup provider 
plugin: " + value +
+                    ". Valid plugin values are: " + allowed +
+                    ". You can add more plugins via 
backup.framework.provider.plugin.allowed setting.");
+            }
         }

Review Comment:
   `allowed.split(",")` does not trim entries, so an allowed list like `dummy, 
veeam` (common for comma-separated configs) yields `" veeam"` and incorrectly 
rejects `veeam`. Also, when `allowed` is null/blank the current guard can skip 
validation entirely (null) or produce an unhelpful error message (blank). 
Normalize the allowed list by trimming/filtering blanks and always validate 
when `value` is non-null.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to