Merge "volume: Add 'volume qos set --no-property' option"

This commit is contained in:
Zuul 2023-05-17 23:20:28 +00:00 committed by Gerrit Code Review
commit 4a62c73992
9 changed files with 131 additions and 25 deletions

View File

@ -116,9 +116,16 @@ Set QoS specification properties
.. code:: bash
openstack volume qos set
[--no-property]
[--property <key=value> [...] ]
<qos-spec>
.. option:: --no-property
Remove all properties from :ref:`\<snapshot\> <volume_qos_set-qos-spec>`
(specify both :option:`--no-property` and :option:`--property` to
remove the current properties before setting new properties.)
.. option:: --property <key=value>
Property to add or modify for this QoS specification (repeat option to set multiple properties)

View File

@ -52,8 +52,10 @@ class QosTests(common.BaseVolumeTests):
name = uuid.uuid4().hex
cmd_output = self.openstack(
'volume qos create ' + '--consumer front-end '
'--property Alpha=a ' + name,
'volume qos create '
+ '--consumer front-end '
+ '--property Alpha=a '
+ name,
parse_output=True,
)
self.addCleanup(self.openstack, 'volume qos delete ' + name)
@ -64,8 +66,9 @@ class QosTests(common.BaseVolumeTests):
# Test volume qos set
raw_output = self.openstack(
'volume qos set '
+ '--property Alpha=c '
+ '--no-property '
+ '--property Beta=b '
+ '--property Charlie=c '
+ name,
)
self.assertOutput('', raw_output)
@ -76,11 +79,14 @@ class QosTests(common.BaseVolumeTests):
parse_output=True,
)
self.assertEqual(name, cmd_output['name'])
self.assertEqual({'Alpha': 'c', 'Beta': 'b'}, cmd_output['properties'])
self.assertEqual(
{'Beta': 'b', 'Charlie': 'c'},
cmd_output['properties'],
)
# Test volume qos unset
raw_output = self.openstack(
'volume qos unset ' + '--property Alpha ' + name,
'volume qos unset ' + '--property Charlie ' + name,
)
self.assertOutput('', raw_output)

View File

@ -52,8 +52,10 @@ class QosTests(common.BaseVolumeTests):
name = uuid.uuid4().hex
cmd_output = self.openstack(
'volume qos create ' + '--consumer front-end '
'--property Alpha=a ' + name,
'volume qos create '
+ '--consumer front-end '
+ '--property Alpha=a '
+ name,
parse_output=True,
)
self.addCleanup(self.openstack, 'volume qos delete ' + name)
@ -65,8 +67,9 @@ class QosTests(common.BaseVolumeTests):
# Test volume qos set
raw_output = self.openstack(
'volume qos set '
+ '--property Alpha=c '
+ '--no-property '
+ '--property Beta=b '
+ '--property Charlie=c '
+ name,
)
self.assertOutput('', raw_output)
@ -77,11 +80,14 @@ class QosTests(common.BaseVolumeTests):
parse_output=True,
)
self.assertEqual(name, cmd_output['name'])
self.assertEqual({'Alpha': 'c', 'Beta': 'b'}, cmd_output['properties'])
self.assertEqual(
{'Beta': 'b', 'Charlie': 'c'},
cmd_output['properties'],
)
# Test volume qos unset
raw_output = self.openstack(
'volume qos unset ' + '--property Alpha ' + name,
'volume qos unset ' + '--property Charlie ' + name,
)
self.assertOutput('', raw_output)

View File

@ -52,8 +52,10 @@ class QosTests(common.BaseVolumeTests):
name = uuid.uuid4().hex
cmd_output = self.openstack(
'volume qos create ' + '--consumer front-end '
'--property Alpha=a ' + name,
'volume qos create '
+ '--consumer front-end '
+ '--property Alpha=a '
+ name,
parse_output=True,
)
self.addCleanup(self.openstack, 'volume qos delete ' + name)
@ -65,8 +67,9 @@ class QosTests(common.BaseVolumeTests):
# Test volume qos set
raw_output = self.openstack(
'volume qos set '
+ '--property Alpha=c '
+ '--no-property '
+ '--property Beta=b '
+ '--property Charlie=c '
+ name,
)
self.assertOutput('', raw_output)
@ -77,11 +80,14 @@ class QosTests(common.BaseVolumeTests):
parse_output=True,
)
self.assertEqual(name, cmd_output['name'])
self.assertEqual({'Alpha': 'c', 'Beta': 'b'}, cmd_output['properties'])
self.assertEqual(
{'Beta': 'b', 'Charlie': 'c'},
cmd_output['properties'],
)
# Test volume qos unset
raw_output = self.openstack(
'volume qos unset ' + '--property Alpha ' + name,
'volume qos unset ' + '--property Charlie ' + name,
)
self.assertOutput('', raw_output)

View File

@ -366,22 +366,30 @@ class TestQosSet(TestQos):
def test_qos_set_with_properties_with_id(self):
arglist = [
'--no-property',
'--property',
'foo=bar',
'a=b',
'--property',
'iops=9001',
'c=d',
self.qos_spec.id,
]
new_property = {"a": "b", "c": "d"}
verifylist = [
('property', self.qos_spec.specs),
('no_property', True),
('property', new_property),
('qos_spec', self.qos_spec.id),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.qos_mock.unset_keys.assert_called_with(
self.qos_spec.id,
list(self.qos_spec.specs.keys()),
)
self.qos_mock.set_keys.assert_called_with(
self.qos_spec.id, self.qos_spec.specs
self.qos_spec.id,
{"a": "b", "c": "d"},
)
self.assertIsNone(result)

View File

@ -362,22 +362,29 @@ class TestQosSet(TestQos):
def test_qos_set_with_properties_with_id(self):
arglist = [
'--no-property',
'--property',
'foo=bar',
'a=b',
'--property',
'iops=9001',
'c=d',
self.qos_spec.id,
]
new_property = {"a": "b", "c": "d"}
verifylist = [
('property', self.qos_spec.specs),
('no_property', True),
('property', new_property),
('qos_spec', self.qos_spec.id),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.qos_mock.unset_keys.assert_called_with(
self.qos_spec.id,
list(self.qos_spec.specs.keys()),
)
self.qos_mock.set_keys.assert_called_with(
self.qos_spec.id, self.qos_spec.specs
self.qos_spec.id, {"a": "b", "c": "d"}
)
self.assertIsNone(result)

View File

@ -255,6 +255,16 @@ class SetQos(command.Command):
metavar='<qos-spec>',
help=_('QoS specification to modify (name or ID)'),
)
parser.add_argument(
'--no-property',
dest='no_property',
action='store_true',
help=_(
'Remove all properties from <qos-spec> '
'(specify both --no-property and --property to remove the '
'current properties before setting new properties)'
),
)
parser.add_argument(
'--property',
metavar='<key=value>',
@ -272,8 +282,29 @@ class SetQos(command.Command):
volume_client.qos_specs, parsed_args.qos_spec
)
result = 0
if parsed_args.no_property:
try:
key_list = list(qos_spec._info['specs'].keys())
volume_client.qos_specs.unset_keys(qos_spec.id, key_list)
except Exception as e:
LOG.error(_("Failed to clean qos properties: %s"), e)
result += 1
if parsed_args.property:
volume_client.qos_specs.set_keys(qos_spec.id, parsed_args.property)
try:
volume_client.qos_specs.set_keys(
qos_spec.id,
parsed_args.property,
)
except Exception as e:
LOG.error(_("Failed to set qos property: %s"), e)
result += 1
if result > 0:
raise exceptions.CommandError(
_("One or more of the set operations failed")
)
class ShowQos(command.ShowOne):

View File

@ -257,6 +257,16 @@ class SetQos(command.Command):
metavar='<qos-spec>',
help=_('QoS specification to modify (name or ID)'),
)
parser.add_argument(
'--no-property',
dest='no_property',
action='store_true',
help=_(
'Remove all properties from <qos-spec> '
'(specify both --no-property and --property to remove the '
'current properties before setting new properties)'
),
)
parser.add_argument(
'--property',
metavar='<key=value>',
@ -274,8 +284,29 @@ class SetQos(command.Command):
volume_client.qos_specs, parsed_args.qos_spec
)
result = 0
if parsed_args.no_property:
try:
key_list = list(qos_spec._info['specs'].keys())
volume_client.qos_specs.unset_keys(qos_spec.id, key_list)
except Exception as e:
LOG.error(_("Failed to clean qos properties: %s"), e)
result += 1
if parsed_args.property:
volume_client.qos_specs.set_keys(qos_spec.id, parsed_args.property)
try:
volume_client.qos_specs.set_keys(
qos_spec.id,
parsed_args.property,
)
except Exception as e:
LOG.error(_("Failed to set qos property: %s"), e)
result += 1
if result > 0:
raise exceptions.CommandError(
_("One or more of the set operations failed")
)
class ShowQos(command.ShowOne):

View File

@ -0,0 +1,4 @@
---
features:
- |
Add ``--no-property`` option in ``volume qos set``.