Skip to content

Commit 19c053e

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add support for volume unmanage"
2 parents 5483370 + fdc2763 commit 19c053e

3 files changed

Lines changed: 122 additions & 1 deletion

File tree

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

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,3 +427,104 @@ def test_volume_create_host_no_remote_source(self):
427427
'--host and --cluster options are only supported ',
428428
str(exc),
429429
)
430+
431+
432+
class TestVolumeDelete(BaseVolumeTest):
433+
def setUp(self):
434+
super().setUp()
435+
436+
self.volumes_mock = self.volume_client.volumes
437+
self.volumes_mock.reset_mock()
438+
self.volume_sdk_client.unmanage_volume.return_value = None
439+
440+
# Get the command object to mock
441+
self.cmd = volume.DeleteVolume(self.app, None)
442+
443+
def test_volume_delete_remote(self):
444+
vol = sdk_fakes.generate_fake_resource(_volume.Volume, **{'size': 1})
445+
self.volumes_mock.get.return_value = vol
446+
447+
arglist = ['--remote', vol.id]
448+
verifylist = [
449+
("remote", True),
450+
("force", False),
451+
("purge", False),
452+
("volumes", [vol.id]),
453+
]
454+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
455+
456+
result = self.cmd.take_action(parsed_args)
457+
458+
self.volume_sdk_client.unmanage_volume.assert_called_once_with(vol.id)
459+
self.assertIsNone(result)
460+
461+
def test_volume_delete_multi_volumes_remote(self):
462+
volumes = sdk_fakes.generate_fake_resources(
463+
_volume.Volume, count=3, attrs={'size': 1}
464+
)
465+
466+
arglist = ['--remote']
467+
arglist += [v.id for v in volumes]
468+
verifylist = [
469+
('remote', True),
470+
('force', False),
471+
('purge', False),
472+
('volumes', arglist[1:]),
473+
]
474+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
475+
476+
result = self.cmd.take_action(parsed_args)
477+
478+
calls = [mock.call(v.id) for v in volumes]
479+
self.volume_sdk_client.unmanage_volume.assert_has_calls(calls)
480+
self.assertIsNone(result)
481+
482+
def test_volume_delete_remote_with_purge(self):
483+
vol = sdk_fakes.generate_fake_resource(_volume.Volume, **{'size': 1})
484+
485+
arglist = [
486+
'--remote',
487+
'--purge',
488+
vol.id,
489+
]
490+
verifylist = [
491+
('remote', True),
492+
('force', False),
493+
('purge', True),
494+
('volumes', [vol.id]),
495+
]
496+
497+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
498+
exc = self.assertRaises(
499+
exceptions.CommandError, self.cmd.take_action, parsed_args
500+
)
501+
self.assertIn(
502+
"The --force and --purge options are not supported with the "
503+
"--remote parameter.",
504+
str(exc),
505+
)
506+
507+
def test_volume_delete_remote_with_force(self):
508+
vol = sdk_fakes.generate_fake_resource(_volume.Volume, **{'size': 1})
509+
510+
arglist = [
511+
'--remote',
512+
'--force',
513+
vol.id,
514+
]
515+
verifylist = [
516+
('remote', True),
517+
('force', True),
518+
('purge', False),
519+
('volumes', [vol.id]),
520+
]
521+
522+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
523+
exc = self.assertRaises(
524+
exceptions.CommandError, self.cmd.take_action, parsed_args
525+
)
526+
self.assertIn(
527+
"The --force and --purge options are not supported with the "
528+
"--remote parameter.",
529+
str(exc),
530+
)

openstackclient/volume/v3/volume.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,16 +244,31 @@ class DeleteVolume(volume_v2.DeleteVolume):
244244

245245
def get_parser(self, prog_name):
246246
parser = super().get_parser(prog_name)
247+
parser.add_argument(
248+
'--remote',
249+
action='store_true',
250+
help=_("Specify this parameter to unmanage a volume."),
251+
)
247252
return parser
248253

249254
def take_action(self, parsed_args):
250255
volume_client = self.app.client_manager.volume
256+
volume_client_sdk = self.app.client_manager.sdk_connection.volume
251257
result = 0
252258

259+
if parsed_args.remote and (parsed_args.force or parsed_args.purge):
260+
msg = _(
261+
"The --force and --purge options are not "
262+
"supported with the --remote parameter."
263+
)
264+
raise exceptions.CommandError(msg)
265+
253266
for i in parsed_args.volumes:
254267
try:
255268
volume_obj = utils.find_resource(volume_client.volumes, i)
256-
if parsed_args.force:
269+
if parsed_args.remote:
270+
volume_client_sdk.unmanage_volume(volume_obj.id)
271+
elif parsed_args.force:
257272
volume_client.volumes.force_delete(volume_obj.id)
258273
else:
259274
volume_client.volumes.delete(
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add support for unmanaging volumes with
5+
``openstack volume delete --remote <volume>`` command.

0 commit comments

Comments
 (0)