From c06f3dca4dc2daa48ff98675ab11fe50ebcb39e9 Mon Sep 17 00:00:00 2001 From: Kiran Pawar Date: Wed, 9 Oct 2024 12:53:57 +0000 Subject: [PATCH] Allow to update access rule for type 'ip' Only allow to update access_level for access_type 'ip' starting microversion '2.88'. Closes-bug: #2066871 Depends-On: Ieb836d7e63ce8bb14c4ae4fc57b012ee3249dcc7 Change-Id: I0382cdccecdc2e3b6a714b17cfe0c6d7da23ae17 --- manilaclient/api_versions.py | 2 +- manilaclient/osc/v2/share_access_rules.py | 41 +++++++++++++++---- .../functional/osc/test_share_access_rules.py | 20 ++++++++- .../unit/osc/v2/test_share_access_rules.py | 19 ++++++++- manilaclient/v2/share_access_rules.py | 20 ++++++++- ...evel-for-access-rule-adb5d572454c01e8.yaml | 5 +++ 6 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 releasenotes/notes/bug-2066871-allow-to-update-access-level-for-access-rule-adb5d572454c01e8.yaml diff --git a/manilaclient/api_versions.py b/manilaclient/api_versions.py index 39a11f7ef..2116fab25 100644 --- a/manilaclient/api_versions.py +++ b/manilaclient/api_versions.py @@ -27,7 +27,7 @@ from manilaclient import utils LOG = logging.getLogger(__name__) -MAX_VERSION = '2.87' +MAX_VERSION = '2.88' MIN_VERSION = '2.0' DEPRECATED_VERSION = '1.0' _VERSIONED_METHOD_MAP = {} diff --git a/manilaclient/osc/v2/share_access_rules.py b/manilaclient/osc/v2/share_access_rules.py index 8e69d2d05..05c75af04 100644 --- a/manilaclient/osc/v2/share_access_rules.py +++ b/manilaclient/osc/v2/share_access_rules.py @@ -417,15 +417,35 @@ class SetShareAccess(command.Command): '(Repeat option to set multiple properties) ' 'Available only for API microversion >= 2.45.'), ) + parser.add_argument( + "--access-level", + metavar="", + default=None, + choices=['rw', 'ro'], + help=_('Share access level ("rw" and "ro" access levels ' + 'are supported) to set.') + ) return parser def take_action(self, parsed_args): share_client = self.app.client_manager.share - if share_client.api_version >= api_versions.APIVersion("2.45"): - access_rule = share_client.share_access_rules.get( - parsed_args.access_id - ) + if (parsed_args.property and + share_client.api_version < api_versions.APIVersion("2.45")): + raise exceptions.CommandError( + "Setting properties to access rule is supported only " + "with API microversion 2.45 and higher") + + if (parsed_args.access_level and + share_client.api_version < api_versions.APIVersion("2.88")): + raise exceptions.CommandError( + "Setting access level to access rule is supported only " + "with API microversion 2.88 and higher") + + access_rule = share_client.share_access_rules.get( + parsed_args.access_id + ) + if parsed_args.property: try: share_client.share_access_rules.set_metadata( access_rule, @@ -435,10 +455,15 @@ class SetShareAccess(command.Command): "Failed to set properties to share access rule with ID " "'%s': %s" % (access_rule.id, e)) - else: - raise exceptions.CommandError( - "Setting properties to access rule is supported only " - "with API microversion 2.45 and higher") + if parsed_args.access_level: + try: + share_client.share_access_rules.set_access_level( + access_rule, + parsed_args.access_level) + except Exception as e: + raise exceptions.CommandError( + "Failed to set access level to share access rule with ID " + "'%s': %s" % (access_rule.id, e)) class UnsetShareAccess(command.Command): diff --git a/manilaclient/tests/functional/osc/test_share_access_rules.py b/manilaclient/tests/functional/osc/test_share_access_rules.py index 38ef011fb..334cde0b9 100644 --- a/manilaclient/tests/functional/osc/test_share_access_rules.py +++ b/manilaclient/tests/functional/osc/test_share_access_rules.py @@ -218,7 +218,7 @@ class ShowShareAccessRulesTestCase(base.OSCClientTestBase): class SetShareAccessTestCase(base.OSCClientTestBase): - def test_set_share_access(self): + def test_set_share_access_metadata(self): share = self.create_share() access_rule = self.create_share_access_rule( share=share['name'], @@ -237,6 +237,24 @@ class SetShareAccessTestCase(base.OSCClientTestBase): f'access show {access_rule["id"]}') self.assertEqual(access_rule['properties'], 'foo : bar') + def test_set_share_access_level(self): + share = self.create_share() + access_rule = self.create_share_access_rule( + share=share['name'], + access_type='ip', + access_to='0.0.0.0/0', + wait=True) + + self.assertEqual(access_rule['access_level'], 'rw') + + self.openstack('share', + params=f'access set {access_rule["id"]} ' + f'--access-level ro') + access_rule = self.dict_result( + 'share', + f'access show {access_rule["id"]}') + self.assertEqual(access_rule['access_level'], 'ro') + class UnsetShareAccessRulesTestCase(base.OSCClientTestBase): def test_unset_share_access(self): diff --git a/manilaclient/tests/unit/osc/v2/test_share_access_rules.py b/manilaclient/tests/unit/osc/v2/test_share_access_rules.py index 96d99c2f2..3447df19c 100644 --- a/manilaclient/tests/unit/osc/v2/test_share_access_rules.py +++ b/manilaclient/tests/unit/osc/v2/test_share_access_rules.py @@ -548,7 +548,7 @@ class TestShareAccessSet(TestShareAccess): # Get the command object to test self.cmd = osc_share_access_rules.SetShareAccess(self.app, None) - def test_access_rule_set(self): + def test_access_rule_set_metadata(self): arglist = [ self.access_rule.id, '--property', 'key1=value1' @@ -565,6 +565,23 @@ class TestShareAccessSet(TestShareAccess): {'key1': 'value1'}) self.assertIsNone(result) + def test_access_rule_set_access_level(self): + arglist = [ + self.access_rule.id, + '--access-level', 'ro' + ] + verifylist = [ + ("access_id", self.access_rule.id), + ('access_level', 'ro') + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.access_rules_mock.set_access_level.assert_called_with( + self.access_rule, + 'ro') + self.assertIsNone(result) + class TestShareAccessUnset(TestShareAccess): diff --git a/manilaclient/v2/share_access_rules.py b/manilaclient/v2/share_access_rules.py index 15ac6f89a..2f68f5ac7 100644 --- a/manilaclient/v2/share_access_rules.py +++ b/manilaclient/v2/share_access_rules.py @@ -60,8 +60,7 @@ class ShareAccessRuleManager(base.ManagerWithFind): def set_metadata(self, access, metadata): """Set or update metadata for share access rule. - :param share_access_rule: either share access rule object or - text with its ID. + :param access: either share access rule object or text with its ID. :param metadata: A list of keys to be set. """ body = {'metadata': metadata} @@ -73,6 +72,7 @@ class ShareAccessRuleManager(base.ManagerWithFind): def unset_metadata(self, access, keys): """Unset metadata on a share access rule. + :param access: either share access rule object or text with its ID. :param keys: A list of keys on this object to be unset :return: None if successful, else API response on failure """ @@ -80,6 +80,22 @@ class ShareAccessRuleManager(base.ManagerWithFind): url = RESOURCE_METADATA_PATH % (base.getid(access), k) self._delete(url) + @api_versions.wraps("2.88") + def set_access_level(self, access, access_level): + """Set or update access level for share access rule. + + :param access: either share access rule object or text with its ID. + :param access_level: value of access_level (e.g. ro/rw) + """ + body = { + 'update_access': { + 'access_level': access_level + } + } + access_id = base.getid(access) + url = RESOURCE_PATH % access_id + return self._update(url, body) + @api_versions.wraps("2.45") def access_list(self, share, search_opts=None): search_opts = search_opts or {} diff --git a/releasenotes/notes/bug-2066871-allow-to-update-access-level-for-access-rule-adb5d572454c01e8.yaml b/releasenotes/notes/bug-2066871-allow-to-update-access-level-for-access-rule-adb5d572454c01e8.yaml new file mode 100644 index 000000000..f49a3b04a --- /dev/null +++ b/releasenotes/notes/bug-2066871-allow-to-update-access-level-for-access-rule-adb5d572454c01e8.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``access_level`` attributes of share access rule (of access type + ``ip``) can be updated with API version ``2.88`` and beyond.