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
This commit is contained in:
Kiran Pawar
2024-10-09 12:53:57 +00:00
parent 2fcf110f24
commit c06f3dca4d
6 changed files with 94 additions and 13 deletions

View File

@@ -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 = {}

View File

@@ -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="<access_level>",
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):

View File

@@ -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):

View File

@@ -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):

View File

@@ -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 {}

View File

@@ -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.