Skip to content

Commit d1f1f09

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add "--type" and "--retype-policy" options to "volume set" command"
2 parents 2daeb30 + 4b14f3d commit d1f1f09

4 files changed

Lines changed: 122 additions & 0 deletions

File tree

doc/source/command-objects/volume.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ Set volume properties
254254
[--property <key=value> [...] ]
255255
[--image-property <key=value> [...] ]
256256
[--state <state>]
257+
[--type <volume-type>]
258+
[--retype-policy <retype-policy>]
257259
[--bootable | --non-bootable]
258260
[--read-only | --read-write]
259261
<volume>
@@ -274,6 +276,20 @@ Set volume properties
274276
275277
Set a property on this volume (repeat option to set multiple properties)
276278
279+
.. option:: --type <volume-type>
280+
281+
New volume type (name or ID)
282+
283+
*Volume version 2 only*
284+
285+
.. option:: --retype-policy <retype-policy>
286+
287+
Migration policy while re-typing volume
288+
("never" or "on-demand", default is "never" )
289+
(available only when "--type" option is specified)
290+
291+
*Volume version 2 only*
292+
277293
.. option:: --bootable
278294
279295
Mark volume as bootable

openstackclient/tests/unit/volume/v2/test_volume.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ def setUp(self):
4646
self.snapshots_mock = self.app.client_manager.volume.volume_snapshots
4747
self.snapshots_mock.reset_mock()
4848

49+
self.types_mock = self.app.client_manager.volume.volume_types
50+
self.types_mock.reset_mock()
51+
4952
self.consistencygroups_mock = (
5053
self.app.client_manager.volume.consistencygroups)
5154
self.consistencygroups_mock.reset_mock()
@@ -1088,11 +1091,14 @@ def test_volume_migrate_without_host(self):
10881091

10891092
class TestVolumeSet(TestVolume):
10901093

1094+
volume_type = volume_fakes.FakeType.create_one_type()
1095+
10911096
def setUp(self):
10921097
super(TestVolumeSet, self).setUp()
10931098

10941099
self.new_volume = volume_fakes.FakeVolume.create_one_volume()
10951100
self.volumes_mock.get.return_value = self.new_volume
1101+
self.types_mock.get.return_value = self.volume_type
10961102

10971103
# Get the command object to test
10981104
self.cmd = volume.SetVolume(self.app, None)
@@ -1221,6 +1227,66 @@ def test_volume_set_read_write(self):
12211227
False)
12221228
self.assertIsNone(result)
12231229

1230+
def test_volume_set_type(self):
1231+
arglist = [
1232+
'--type', self.volume_type.id,
1233+
self.new_volume.id
1234+
]
1235+
verifylist = [
1236+
('retype_policy', None),
1237+
('type', self.volume_type.id),
1238+
('volume', self.new_volume.id)
1239+
]
1240+
1241+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1242+
1243+
result = self.cmd.take_action(parsed_args)
1244+
self.volumes_mock.retype.assert_called_once_with(
1245+
self.new_volume.id,
1246+
self.volume_type.id,
1247+
'never')
1248+
self.assertIsNone(result)
1249+
1250+
def test_volume_set_type_with_policy(self):
1251+
arglist = [
1252+
'--retype-policy', 'on-demand',
1253+
'--type', self.volume_type.id,
1254+
self.new_volume.id
1255+
]
1256+
verifylist = [
1257+
('retype_policy', 'on-demand'),
1258+
('type', self.volume_type.id),
1259+
('volume', self.new_volume.id)
1260+
]
1261+
1262+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1263+
1264+
result = self.cmd.take_action(parsed_args)
1265+
self.volumes_mock.retype.assert_called_once_with(
1266+
self.new_volume.id,
1267+
self.volume_type.id,
1268+
'on-demand')
1269+
self.assertIsNone(result)
1270+
1271+
@mock.patch.object(volume.LOG, 'warning')
1272+
def test_volume_set_with_only_retype_policy(self, mock_warning):
1273+
arglist = [
1274+
'--retype-policy', 'on-demand',
1275+
self.new_volume.id
1276+
]
1277+
verifylist = [
1278+
('retype_policy', 'on-demand'),
1279+
('volume', self.new_volume.id)
1280+
]
1281+
1282+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1283+
1284+
result = self.cmd.take_action(parsed_args)
1285+
self.volumes_mock.retype.assert_not_called()
1286+
mock_warning.assert_called_with("'--retype-policy' option will "
1287+
"not work without '--type' option")
1288+
self.assertIsNone(result)
1289+
12241290

12251291
class TestVolumeShow(TestVolume):
12261292

openstackclient/volume/v2/volume.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,19 @@ def get_parser(self, prog_name):
509509
'in the database with no regard to actual status, '
510510
'exercise caution when using)'),
511511
)
512+
parser.add_argument(
513+
'--type',
514+
metavar='<volume-type>',
515+
help=_('New volume type (name or ID)'),
516+
)
517+
parser.add_argument(
518+
'--retype-policy',
519+
metavar='<retype-policy>',
520+
choices=['never', 'on-demand'],
521+
help=_('Migration policy while re-typing volume '
522+
'("never" or "on-demand", default is "never" ) '
523+
'(available only when "--type" option is specified)'),
524+
)
512525
bootable_group = parser.add_mutually_exclusive_group()
513526
bootable_group.add_argument(
514527
"--bootable",
@@ -590,6 +603,28 @@ def take_action(self, parsed_args):
590603
LOG.error(_("Failed to set volume read-only access "
591604
"mode flag: %s"), e)
592605
result += 1
606+
if parsed_args.type:
607+
# get the migration policy
608+
migration_policy = 'never'
609+
if parsed_args.retype_policy:
610+
migration_policy = parsed_args.retype_policy
611+
try:
612+
# find the volume type
613+
volume_type = utils.find_resource(
614+
volume_client.volume_types,
615+
parsed_args.type)
616+
# reset to the new volume type
617+
volume_client.volumes.retype(
618+
volume.id,
619+
volume_type.id,
620+
migration_policy)
621+
except Exception as e:
622+
LOG.error(_("Failed to set volume type: %s"), e)
623+
result += 1
624+
elif parsed_args.retype_policy:
625+
# If the "--retype-policy" is specified without "--type"
626+
LOG.warning(_("'--retype-policy' option will not work "
627+
"without '--type' option"))
593628

594629
kwargs = {}
595630
if parsed_args.name:
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add ``--type`` and ``--retype-policy`` options to ``volume set`` command.
5+
[Blueprint `cinder-command-support <https://blueprints.launchpad.net/python-openstackclient/+spec/cinder-command-support>`_]

0 commit comments

Comments
 (0)