From 24992d9e976fa8a4f8c7339c49b4ec2723f8da4d Mon Sep 17 00:00:00 2001 From: Valeriy Ponomaryov Date: Tue, 6 Oct 2015 12:38:27 +0300 Subject: [PATCH] Verify common server in Generic driver on startup If we setup generic driver in DHSS=False mode, we need to provide specific data for VM that will host shares and if we do not provide such info or provide it incorrectly then we get error only trying perform actions. But we should do validation on service start. Change-Id: I325d6461c4b12f481769bb01f792ef850dba789c Closes-Bug: #1502063 --- manila/share/drivers/generic.py | 7 +++- manila/tests/share/drivers/test_generic.py | 46 +++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/manila/share/drivers/generic.py b/manila/share/drivers/generic.py index 54f04d2d6d..f75c6c9124 100644 --- a/manila/share/drivers/generic.py +++ b/manila/share/drivers/generic.py @@ -169,7 +169,6 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver): def check_for_setup_error(self): """Returns an error if prerequisites aren't met.""" - pass def do_setup(self, context): """Any initialization the generic driver does while starting.""" @@ -177,6 +176,12 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver): self.compute_api = compute.API() self.volume_api = volume.API() self._setup_helpers() + if not self.driver_handles_share_servers: + # Verify availability of common server + share_server = self.service_instance_manager.get_common_server() + if not self._is_share_server_active(context, share_server): + raise exception.ManilaException( + _("Service VM is not available. %s") % share_server) def _setup_helpers(self): """Initializes protocol-specific NAS drivers.""" diff --git a/manila/tests/share/drivers/test_generic.py b/manila/tests/share/drivers/test_generic.py index 5eeec299f0..8128b3787f 100644 --- a/manila/tests/share/drivers/test_generic.py +++ b/manila/tests/share/drivers/test_generic.py @@ -224,14 +224,58 @@ class GenericShareDriverTestCase(test.TestCase): self.mock_error_log = self.mock_object(generic.LOG, 'error') self.mock_exception_log = self.mock_object(generic.LOG, 'exception') - def test_do_setup(self): + @ddt.data(True, False) + def test_do_setup_with_dhss(self, dhss): + CONF.set_default('driver_handles_share_servers', dhss) + fake_server = {'id': 'fake_server_id'} self.mock_object(volume, 'API') self.mock_object(compute, 'API') self.mock_object(self._driver, '_setup_helpers') + self.mock_object( + self._driver, + '_is_share_server_active', mock.Mock(return_value=True)) + self.mock_object( + self._driver.service_instance_manager, + 'get_common_server', mock.Mock(return_value=fake_server)) + self._driver.do_setup(self._context) + volume.API.assert_called_once_with() compute.API.assert_called_once_with() self._driver._setup_helpers.assert_called_once_with() + if not dhss: + self._driver.service_instance_manager.get_common_server.\ + assert_called_once_with() + self._driver._is_share_server_active.assert_called_once_with( + self._context, fake_server) + else: + self.assertFalse( + self._driver.service_instance_manager.get_common_server.called) + self.assertFalse(self._driver._is_share_server_active.called) + + def test_do_setup_dhss_false_server_not_active(self): + CONF.set_default('driver_handles_share_servers', False) + fake_server = {'id': 'fake_server_id'} + self.mock_object(volume, 'API') + self.mock_object(compute, 'API') + self.mock_object(self._driver, '_setup_helpers') + self.mock_object( + self._driver, + '_is_share_server_active', mock.Mock(return_value=False)) + self.mock_object( + self._driver.service_instance_manager, + 'get_common_server', mock.Mock(return_value=fake_server)) + + self.assertRaises( + exception.ManilaException, self._driver.do_setup, self._context) + + volume.API.assert_called_once_with() + compute.API.assert_called_once_with() + self._driver._setup_helpers.assert_called_once_with() + self._driver.service_instance_manager.get_common_server.\ + assert_called_once_with() + self._driver._is_share_server_active.assert_called_once_with( + self._context, fake_server) def test_setup_helpers(self): self._driver._helpers = {}