From a60fc8c9697a52e42a54943dd3ba4fc1daf4b9f2 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Sun, 5 Jul 2020 19:50:29 +0530 Subject: [PATCH 1/6] server: don't export APIs if feature is not enabled in any zones This change will ensure that B&R APIs are not exported if the feature is not enabled in any of the zones. Signed-off-by: Rohit Yadav --- .../org/apache/cloudstack/backup/BackupManager.java | 2 +- .../apache/cloudstack/backup/BackupManagerImpl.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 7c9d3b6d0a1f..1ed061687adc 100644 --- a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java +++ b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java @@ -38,7 +38,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer ConfigKey BackupFrameworkEnabled = new ConfigKey<>("Advanced", Boolean.class, "backup.framework.enabled", "false", - "Is backup and recovery framework enabled.", true, ConfigKey.Scope.Zone); + "Is backup and recovery framework enabled. Restart management server on global value change.", true, ConfigKey.Scope.Zone); ConfigKey BackupProviderPlugin = new ConfigKey<>("Advanced", String.class, "backup.framework.provider.plugin", 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 f3b0a3c4abcb..fb282e37ddf1 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -769,6 +769,19 @@ public BackupProvider getBackupProvider(final String name) { @Override public List> getCommands() { final List> cmdList = new ArrayList>(); + if (!BackupFrameworkEnabled.value()) { + boolean featureEnabled = false; + for (final DataCenter dataCenter : dataCenterDao.listAllZones()) { + if (BackupFrameworkEnabled.valueIn(dataCenter.getId())) { + featureEnabled = true; + break; + } + } + if (!featureEnabled) { + return cmdList; + } + } + // Offerings cmdList.add(ListBackupProvidersCmd.class); cmdList.add(ListBackupProviderOfferingsCmd.class); From 549d822a823b90784174303651d28f6ded7bdcac Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Mon, 6 Jul 2020 14:16:02 +0530 Subject: [PATCH 2/6] don't enable feature if it's globally disabled Signed-off-by: Rohit Yadav --- .../org/apache/cloudstack/backup/BackupManager.java | 2 +- .../apache/cloudstack/backup/BackupManagerImpl.java | 13 ++----------- 2 files changed, 3 insertions(+), 12 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 1ed061687adc..7b4c1c5c6854 100644 --- a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java +++ b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java @@ -38,7 +38,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer ConfigKey BackupFrameworkEnabled = new ConfigKey<>("Advanced", Boolean.class, "backup.framework.enabled", "false", - "Is backup and recovery framework enabled. Restart management server on global value change.", true, ConfigKey.Scope.Zone); + "Is backup and recovery framework enabled. Restart management server on global value change.", false, ConfigKey.Scope.Zone); ConfigKey BackupProviderPlugin = new ConfigKey<>("Advanced", String.class, "backup.framework.provider.plugin", 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 fb282e37ddf1..b11d1bca150f 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -736,7 +736,7 @@ public boolean configure(String name, Map params) throws Configu } public boolean isDisabled(final Long zoneId) { - return !BackupFrameworkEnabled.valueIn(zoneId); + return !(BackupFrameworkEnabled.value() && BackupFrameworkEnabled.valueIn(zoneId)); } private void validateForZone(final Long zoneId) { @@ -770,16 +770,7 @@ public BackupProvider getBackupProvider(final String name) { public List> getCommands() { final List> cmdList = new ArrayList>(); if (!BackupFrameworkEnabled.value()) { - boolean featureEnabled = false; - for (final DataCenter dataCenter : dataCenterDao.listAllZones()) { - if (BackupFrameworkEnabled.valueIn(dataCenter.getId())) { - featureEnabled = true; - break; - } - } - if (!featureEnabled) { - return cmdList; - } + return cmdList; } // Offerings From 85aa93143a3de1b8a8dce0a53b037b8c65733403 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Mon, 6 Jul 2020 14:23:02 +0530 Subject: [PATCH 3/6] run the dummy B&R test only on simulator Signed-off-by: Rohit Yadav --- developer/developer-prefill.sql | 9 +++++++-- test/integration/smoke/test_backup_recovery_dummy.py | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/developer/developer-prefill.sql b/developer/developer-prefill.sql index c9ab468e5b35..0715e07c2209 100644 --- a/developer/developer-prefill.sql +++ b/developer/developer-prefill.sql @@ -114,16 +114,21 @@ INSERT INTO `cloud`.`configuration` (category, instance, component, name, value) VALUES ('Advanced', 'DEFAULT', 'management-server', 'ping.timeout', '2.0'); --- Enable dynamic RBAC by default for fresh deployments +-- Enable dynamic RBAC by default for developers INSERT INTO `cloud`.`configuration` (category, instance, component, name, value) VALUES ('Advanced', 'DEFAULT', 'RoleService', 'dynamic.apichecker.enabled', 'true'); --- Enable RootCA auth strictness for fresh deployments +-- Enable RootCA auth strictness for developers INSERT INTO `cloud`.`configuration` (category, instance, component, name, value) VALUES ('Advanced', 'DEFAULT', 'RootCAProvider', 'ca.plugin.root.auth.strictness', 'true'); +-- Enable B&R feature for developers +INSERT INTO `cloud`.`configuration` (category, instance, component, name, value) + VALUES ('Advanced', 'DEFAULT', 'BackupService', + 'backup.framework.enabled', 'true'); + -- Add developer configuration entry; allows management server to be run as a user other than "cloud" INSERT INTO `cloud`.`configuration` (category, instance, component, name, value) VALUES ('Advanced', 'DEFAULT', 'management-server', diff --git a/test/integration/smoke/test_backup_recovery_dummy.py b/test/integration/smoke/test_backup_recovery_dummy.py index 79f375c605bd..5b0f14f3e7f7 100644 --- a/test/integration/smoke/test_backup_recovery_dummy.py +++ b/test/integration/smoke/test_backup_recovery_dummy.py @@ -85,6 +85,8 @@ def tearDownClass(cls): def setUp(self): self.apiclient = self.testClient.getApiClient() self.dbclient = self.testClient.getDbConnection() + if self.hypervisor.lower() != 'simulator': + raise self.skipTest("Skipping test cases which must only run for Simulator") self.cleanup = [] def tearDown(self): From 1a11c2a74fa9ec735487963d42f4d2fb63eddee0 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Mon, 6 Jul 2020 14:23:53 +0530 Subject: [PATCH 4/6] Update BackupManager.java --- .../main/java/org/apache/cloudstack/backup/BackupManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7b4c1c5c6854..57511252d589 100644 --- a/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java +++ b/api/src/main/java/org/apache/cloudstack/backup/BackupManager.java @@ -38,7 +38,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer ConfigKey BackupFrameworkEnabled = new ConfigKey<>("Advanced", Boolean.class, "backup.framework.enabled", "false", - "Is backup and recovery framework enabled. Restart management server on global value change.", false, ConfigKey.Scope.Zone); + "Is backup and recovery framework enabled.", false, ConfigKey.Scope.Zone); ConfigKey BackupProviderPlugin = new ConfigKey<>("Advanced", String.class, "backup.framework.provider.plugin", From 2c06c8491c64c82162f3434ebf5da23fe1de17ac Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 7 Jul 2020 10:45:49 +0530 Subject: [PATCH 5/6] Update test_backup_recovery_dummy.py --- test/integration/smoke/test_backup_recovery_dummy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/smoke/test_backup_recovery_dummy.py b/test/integration/smoke/test_backup_recovery_dummy.py index 5b0f14f3e7f7..2d36c710320e 100644 --- a/test/integration/smoke/test_backup_recovery_dummy.py +++ b/test/integration/smoke/test_backup_recovery_dummy.py @@ -36,6 +36,9 @@ def setUpClass(cls): cls.services["mode"] = cls.zone.networktype cls.hypervisor = cls.testClient.getHypervisorInfo() cls.domain = get_domain(cls.api_client) + cls._cleanup = [] + if cls.hypervisor.lower() != 'simulator': + raise cls.skipTest("Skipping test cases which must only run for Simulator") cls.template = get_template(cls.api_client, cls.zone.id, cls.services["ostype"]) if cls.template == FAILED: assert False, "get_template() failed to return template with description %s" % cls.services["ostype"] @@ -49,7 +52,6 @@ def setUpClass(cls): cls._cleanup = [cls.offering, cls.account] # Check backup configuration values, set them to enable the dummy provider - backup_enabled_cfg = Configurations.list(cls.api_client, name='backup.framework.enabled', zoneid=cls.zone.id) backup_provider_cfg = Configurations.list(cls.api_client, name='backup.framework.provider.plugin', zoneid=cls.zone.id) cls.backup_enabled = backup_enabled_cfg[0].value From 90ca880f3025f86c7f1ba8241ec2e67bf36daa82 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 7 Jul 2020 18:28:41 +0530 Subject: [PATCH 6/6] Update test_backup_recovery_dummy.py --- .../smoke/test_backup_recovery_dummy.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/test/integration/smoke/test_backup_recovery_dummy.py b/test/integration/smoke/test_backup_recovery_dummy.py index 2d36c710320e..0c7ae64937cf 100644 --- a/test/integration/smoke/test_backup_recovery_dummy.py +++ b/test/integration/smoke/test_backup_recovery_dummy.py @@ -36,20 +36,12 @@ def setUpClass(cls): cls.services["mode"] = cls.zone.networktype cls.hypervisor = cls.testClient.getHypervisorInfo() cls.domain = get_domain(cls.api_client) - cls._cleanup = [] - if cls.hypervisor.lower() != 'simulator': - raise cls.skipTest("Skipping test cases which must only run for Simulator") cls.template = get_template(cls.api_client, cls.zone.id, cls.services["ostype"]) if cls.template == FAILED: assert False, "get_template() failed to return template with description %s" % cls.services["ostype"] cls.services["small"]["zoneid"] = cls.zone.id cls.services["small"]["template"] = cls.template.id - cls.account = Account.create(cls.api_client, cls.services["account"], domainid=cls.domain.id) - cls.offering = ServiceOffering.create(cls.api_client,cls.services["service_offerings"]["small"]) - cls.vm = VirtualMachine.create(cls.api_client, cls.services["small"], accountid=cls.account.name, - domainid=cls.account.domainid, serviceofferingid=cls.offering.id, - mode=cls.services["mode"]) - cls._cleanup = [cls.offering, cls.account] + cls._cleanup = [] # Check backup configuration values, set them to enable the dummy provider backup_enabled_cfg = Configurations.list(cls.api_client, name='backup.framework.enabled', zoneid=cls.zone.id) @@ -61,7 +53,17 @@ def setUpClass(cls): Configurations.update(cls.api_client, 'backup.framework.enabled', value='true', zoneid=cls.zone.id) if cls.backup_provider != "dummy": Configurations.update(cls.api_client, 'backup.framework.provider.plugin', value='dummy', zoneid=cls.zone.id) - + + if cls.hypervisor.lower() != 'simulator': + return + + cls.account = Account.create(cls.api_client, cls.services["account"], domainid=cls.domain.id) + cls.offering = ServiceOffering.create(cls.api_client,cls.services["service_offerings"]["small"]) + cls.vm = VirtualMachine.create(cls.api_client, cls.services["small"], accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.offering.id, + mode=cls.services["mode"]) + cls._cleanup = [cls.offering, cls.account] + # Import a dummy backup offering to use on tests cls.provider_offerings = BackupOffering.listExternal(cls.api_client, cls.zone.id)