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:
@@ -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 = {}
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user