From 549f855a0790042c8f23ced3cd0fcfa87ed78b13 Mon Sep 17 00:00:00 2001 From: "Li, Chen" Date: Fri, 11 Sep 2015 10:46:39 +0800 Subject: [PATCH] Enable extend_share in HDFS driver The extend_share is in Manila core, we can support the new API in the HDFS drivers. This patch adds methods to the driver along with its unit tests, and updates related docs. Implements: blueprint hdfs-native-extend-share Change-Id: Ia81291eda49dc20c3318f71c51d36682d2aae742 --- doc/source/devref/hdfs_native_driver.rst | 1 + ...hare_back_ends_feature_support_mapping.rst | 10 ++--- manila/share/drivers/hdfs/hdfs_native.py | 36 +++++++++++------ .../share/drivers/hdfs/test_hdfs_native.py | 39 +++++++++++++++++-- 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/doc/source/devref/hdfs_native_driver.rst b/doc/source/devref/hdfs_native_driver.rst index c91ea4d5bc..d90c232146 100644 --- a/doc/source/devref/hdfs_native_driver.rst +++ b/doc/source/devref/hdfs_native_driver.rst @@ -49,6 +49,7 @@ Supported Operations - Create snapshot - Delete snapshot - Create share from snapshot +- Extend share Requirements ------------ diff --git a/doc/source/devref/share_back_ends_feature_support_mapping.rst b/doc/source/devref/share_back_ends_feature_support_mapping.rst index bfa5a6b2c0..440b0af02d 100644 --- a/doc/source/devref/share_back_ends_feature_support_mapping.rst +++ b/doc/source/devref/share_back_ends_feature_support_mapping.rst @@ -45,7 +45,7 @@ Mapping of share drivers and share features support +----------------------------------------+-----------------------------+-----------------------+--------------+--------------+------------------------+----------------------------+ | Red Hat GlusterFS-Native | ? | ? | ? | ? | ? | ? | +----------------------------------------+-----------------------------+-----------------------+--------------+--------------+------------------------+----------------------------+ -| HDFS | ? | ? | ? | ? | ? | ? | +| HDFS | DHSS = False (K) | \- | M | \- | K | K | +----------------------------------------+-----------------------------+-----------------------+--------------+--------------+------------------------+----------------------------+ | Hitachi HNAS | DHSS = False (L) | L | L | \- | L | L | +----------------------------------------+-----------------------------+-----------------------+--------------+--------------+------------------------+----------------------------+ @@ -84,9 +84,9 @@ Mapping of share drivers and share access rules support +----------------------------------------+--------------+------------+------------+--------------+------------+------------+ | Red Hat GlusterFS-Native | ? | ? | ? | ? | ? | ? | +----------------------------------------+--------------+------------+------------+--------------+------------+------------+ -| HDFS | ? | ? | ? | ? | ? | ? | +| HDFS | \- | HDFS(K) | \- | \- | HDFS(K) | \- | +----------------------------------------+--------------+------------+------------+--------------+------------+------------+ -| Hitachi HNAS | NFS (L) | \- | \- | NFS (L) | \- | \- | +| Hitachi HNAS | NFS (L) | \- | \- | NFS (L) | \- | \- | +----------------------------------------+--------------+------------+------------+--------------+------------+------------+ | HP 3PAR | NFS,CIFS (K) | CIFS (K) | \- | \- | \- | \- | +----------------------------------------+--------------+------------+------------+--------------+------------+------------+ @@ -117,13 +117,13 @@ Mapping of share drivers and security services support +----------------------------------------+------------------+-----------------+------------------+ | Red Hat GlusterFS-Native | ? | ? | ? | +----------------------------------------+------------------+-----------------+------------------+ -| HDFS | ? | ? | ? | +| HDFS | \- | \- | \- | +----------------------------------------+------------------+-----------------+------------------+ | Hitachi HNAS | \- | \- | \- | +----------------------------------------+------------------+-----------------+------------------+ | HP 3PAR | \- | \- | \- | +----------------------------------------+------------------+-----------------+------------------+ -| Huawei | \- | \- | \- | +| Huawei | \- | \- | \- | +----------------------------------------+------------------+-----------------+------------------+ | Quobyte | \- | \- | \- | +----------------------------------------+------------------+-----------------+------------------+ diff --git a/manila/share/drivers/hdfs/hdfs_native.py b/manila/share/drivers/hdfs/hdfs_native.py index b075ac6f72..6bd8d26412 100644 --- a/manila/share/drivers/hdfs/hdfs_native.py +++ b/manila/share/drivers/hdfs/hdfs_native.py @@ -159,6 +159,25 @@ class HDFSNativeShareDriver(driver.ExecuteMixin, driver.ShareDriver): LOG.error(msg) raise exception.HDFSException(msg) + def _set_share_size(self, share, size=None): + share_dir = '/' + share['name'] + + if not size: + sizestr = six.text_type(share['size']) + 'g' + else: + sizestr = six.text_type(size) + 'g' + + try: + self._hdfs_execute(self._hdfs_bin, 'dfsadmin', + '-setSpaceQuota', sizestr, share_dir) + except exception.ProcessExecutionError as e: + msg = (_('Failed to set space quota for the ' + 'share %(sharename)s. Error: %(excmsg)s.') % + {'sharename': share['name'], + 'excmsg': six.text_type(e)}) + LOG.error(msg) + raise exception.HDFSException(msg) + def _create_share(self, share): """Creates a share.""" if share['share_proto'].lower() != 'hdfs': @@ -167,7 +186,6 @@ class HDFSNativeShareDriver(driver.ExecuteMixin, driver.ShareDriver): raise exception.HDFSException(msg) share_dir = '/' + share['name'] - sizestr = six.text_type(share['size']) + 'g' try: self._hdfs_execute(self._hdfs_bin, 'dfs', @@ -180,16 +198,8 @@ class HDFSNativeShareDriver(driver.ExecuteMixin, driver.ShareDriver): LOG.error(msg) raise exception.HDFSException(msg) - try: - self._hdfs_execute(self._hdfs_bin, 'dfsadmin', - '-setSpaceQuota', sizestr, share_dir) - except exception.ProcessExecutionError as e: - msg = (_('Failed to set space quota for the ' - 'share %(sharename)s. Error: %(excmsg)s.') % - {'sharename': share['name'], - 'excmsg': six.text_type(e)}) - LOG.error(msg) - raise exception.HDFSException(msg) + # set share size + self._set_share_size(share) try: self._hdfs_execute(self._hdfs_bin, 'dfsadmin', @@ -360,6 +370,10 @@ class HDFSNativeShareDriver(driver.ExecuteMixin, driver.ShareDriver): LOG.error(msg) raise exception.HDFSException(msg) + def extend_share(self, share, new_size, share_server=None): + """Extend share storage.""" + self._set_share_size(share, new_size) + def _check_hdfs_state(self): try: (out, __) = self._hdfs_execute(self._hdfs_bin, 'fsck', '/') diff --git a/manila/tests/share/drivers/hdfs/test_hdfs_native.py b/manila/tests/share/drivers/hdfs/test_hdfs_native.py index d9dd188c04..bd61e462f8 100644 --- a/manila/tests/share/drivers/hdfs/test_hdfs_native.py +++ b/manila/tests/share/drivers/hdfs/test_hdfs_native.py @@ -90,15 +90,41 @@ class HDFSNativeShareDriverTestCase(test.TestCase): share_server=None) self.assertFalse(self._driver._get_share_path.called) - def test__create_share(self): + def test__set_share_size(self): share_dir = '/' + self.share['name'] sizestr = six.text_type(self.share['size']) + 'g' self._driver._hdfs_execute = mock.Mock(return_value=True) + self._driver._set_share_size(self.share) + self._driver._hdfs_execute.assert_called_once_with( + 'fake_hdfs_bin', 'dfsadmin', '-setSpaceQuota', sizestr, share_dir) + + def test__set_share_size_exception(self): + share_dir = '/' + self.share['name'] + sizestr = six.text_type(self.share['size']) + 'g' + self._driver._hdfs_execute = mock.Mock( + side_effect=exception.ProcessExecutionError) + self.assertRaises(exception.HDFSException, + self._driver._set_share_size, self.share) + self._driver._hdfs_execute.assert_called_once_with( + 'fake_hdfs_bin', 'dfsadmin', '-setSpaceQuota', sizestr, share_dir) + + def test__set_share_size_with_new_size(self): + share_dir = '/' + self.share['name'] + new_size = 'fake_size' + sizestr = new_size + 'g' + self._driver._hdfs_execute = mock.Mock(return_value=True) + self._driver._set_share_size(self.share, new_size) + self._driver._hdfs_execute.assert_called_once_with( + 'fake_hdfs_bin', 'dfsadmin', '-setSpaceQuota', sizestr, share_dir) + + def test__create_share(self): + share_dir = '/' + self.share['name'] + self._driver._hdfs_execute = mock.Mock(return_value=True) + self._driver._set_share_size = mock.Mock() self._driver._create_share(self.share) self._driver._hdfs_execute.assert_any_call( 'fake_hdfs_bin', 'dfs', '-mkdir', share_dir) - self._driver._hdfs_execute.assert_any_call( - 'fake_hdfs_bin', 'dfsadmin', '-setSpaceQuota', sizestr, share_dir) + self._driver._set_share_size.assert_called_once_with(self.share) self._driver._hdfs_execute.assert_any_call( 'fake_hdfs_bin', 'dfsadmin', '-allowSnapshot', share_dir) @@ -319,6 +345,13 @@ class HDFSNativeShareDriverTestCase(test.TestCase): self._driver._hdfs_execute.assert_called_once_with( *cmd, check_exit_code=True) + def test_extend_share(self): + new_size = "fake_size" + self._driver._set_share_size = mock.Mock() + self._driver.extend_share(self.share, new_size) + self._driver._set_share_size.assert_called_once_with( + self.share, new_size) + def test__check_hdfs_state_healthy(self): fake_out = "fakeinfo\n...Status: HEALTHY" self._driver._hdfs_execute = mock.Mock(return_value=(fake_out, ''))