diff --git a/api/src/main/java/org/apache/cloudstack/backup/BackupProvider.java b/api/src/main/java/org/apache/cloudstack/backup/BackupProvider.java index 614e2d5963d..e98d9269290 100644 --- a/api/src/main/java/org/apache/cloudstack/backup/BackupProvider.java +++ b/api/src/main/java/org/apache/cloudstack/backup/BackupProvider.java @@ -42,7 +42,7 @@ public interface BackupProvider { * Returns the list of existing backup policies on the provider * @return backup policies list */ - List listBackupPolicies(); + List listBackupPolicies(Long zoneId); /** * True if policy with id uuid exists on the backup provider diff --git a/plugins/backup/dummy/src/main/java/org/apache/cloudstack/backup/DummyBackupProvider.java b/plugins/backup/dummy/src/main/java/org/apache/cloudstack/backup/DummyBackupProvider.java index b5ea7cdc9b2..69ef7d0c60b 100644 --- a/plugins/backup/dummy/src/main/java/org/apache/cloudstack/backup/DummyBackupProvider.java +++ b/plugins/backup/dummy/src/main/java/org/apache/cloudstack/backup/DummyBackupProvider.java @@ -43,7 +43,7 @@ public class DummyBackupProvider extends AdapterBase implements BackupProvider { } @Override - public List listBackupPolicies() { + public List listBackupPolicies(Long zoneId) { s_logger.debug("Listing backup policies on Dummy B&R Plugin"); BackupPolicy policy1 = new BackupPolicyTO("aaaa-aaaa", "Golden Policy", "Gold description"); BackupPolicy policy2 = new BackupPolicyTO("bbbb-bbbb", "Silver Policy", "Silver description"); diff --git a/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/VeeamBackupProvider.java b/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/VeeamBackupProvider.java index be97994e128..546b1b55412 100644 --- a/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/VeeamBackupProvider.java +++ b/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/VeeamBackupProvider.java @@ -20,7 +20,9 @@ package org.apache.cloudstack.backup; import java.net.URISyntaxException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.cloudstack.backup.veeam.VeeamClient; import org.apache.cloudstack.framework.config.ConfigKey; @@ -33,6 +35,8 @@ import com.cloud.utils.exception.CloudRuntimeException; public class VeeamBackupProvider extends AdapterBase implements BackupProvider, Configurable { private static final Logger LOG = Logger.getLogger(VeeamBackupProvider.class); + private Map zoneClientMap = new HashMap(); + private ConfigKey VeeamUrl = new ConfigKey<>("Advanced", String.class, "backup.plugin.veeam.url", "http://localhost:9399/api/", @@ -57,8 +61,14 @@ public class VeeamBackupProvider extends AdapterBase implements BackupProvider, private VeeamClient getClient(final Long zoneId) { try { - return new VeeamClient(VeeamUrl.valueIn(zoneId), VeeamUsername.valueIn(zoneId), VeeamPassword.valueIn(zoneId), - VeeamValidateSSLSecurity.valueIn(zoneId), VeeamApiRequestTimeout.valueIn(zoneId)); + if (zoneClientMap.containsKey(zoneId)) { + return zoneClientMap.get(zoneId); + } else { + VeeamClient client = new VeeamClient(VeeamUrl.valueIn(zoneId), VeeamUsername.valueIn(zoneId), VeeamPassword.valueIn(zoneId), + VeeamValidateSSLSecurity.valueIn(zoneId), VeeamApiRequestTimeout.valueIn(zoneId)); + zoneClientMap.put(zoneId, client); + return client; + } } catch (URISyntaxException e) { throw new CloudRuntimeException("Failed to parse Veeam API URL: " + e.getMessage()); } catch (NoSuchAlgorithmException | KeyManagementException e) { @@ -73,8 +83,8 @@ public class VeeamBackupProvider extends AdapterBase implements BackupProvider, } @Override - public List listBackupPolicies() { - return null; + public List listBackupPolicies(Long zoneId) { + return getClient(zoneId).listBackupPolicies(); } @Override diff --git a/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/veeam/VeeamClient.java b/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/veeam/VeeamClient.java index f8f22f9a2ce..15b4b3d9016 100644 --- a/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/veeam/VeeamClient.java +++ b/plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/veeam/VeeamClient.java @@ -32,7 +32,6 @@ import javax.net.ssl.X509TrustManager; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.backup.Backup; import org.apache.cloudstack.backup.BackupPolicy; import org.apache.cloudstack.backup.veeam.api.EntityReferences; import org.apache.cloudstack.backup.veeam.api.Ref; 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 fbf8817162e..0a761534fad 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -75,7 +75,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { public BackupPolicy addBackupPolicy(Long zoneId, String policyExternalId, String policyName, String policyDescription) { BackupProvider provider = getBackupProvider(zoneId); if (!provider.isBackupPolicy(policyExternalId)) { - throw new CloudRuntimeException("Policy " + policyExternalId + " does not exist on provider " + provider.getName()); + throw new CloudRuntimeException("Policy " + policyExternalId + " does not exist on provider " + provider.getName() + " on zone " + zoneId); } BackupPolicyVO policy = new BackupPolicyVO(zoneId, policyExternalId, policyName, policyDescription); @@ -129,7 +129,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { } BackupProvider backupProvider = getBackupProvider(zoneId); LOG.debug("Listing external backup policies for the backup provider registered in zone " + zoneId); - return backupProvider.listBackupPolicies(); + return backupProvider.listBackupPolicies(zoneId); } /**