Merge "Add "volume backup set" command in volume v2"
This commit is contained in:
commit
9440509fa0
@ -115,6 +115,37 @@ Restore volume backup
|
|||||||
|
|
||||||
Volume to restore to (name or ID)
|
Volume to restore to (name or ID)
|
||||||
|
|
||||||
|
volume backup set
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Set volume backup properties
|
||||||
|
|
||||||
|
.. program:: volume backup set
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
os volume backup set
|
||||||
|
[--name <name>]
|
||||||
|
[--description <description>]
|
||||||
|
[--state <state>]
|
||||||
|
<backup>
|
||||||
|
|
||||||
|
.. option:: --name <name>
|
||||||
|
|
||||||
|
New backup name
|
||||||
|
|
||||||
|
.. option:: --description <description>
|
||||||
|
|
||||||
|
New backup description
|
||||||
|
|
||||||
|
.. option:: --state <state>
|
||||||
|
|
||||||
|
New backup state ("available" or "error") (admin only)
|
||||||
|
|
||||||
|
.. _backup_set-volume-backup:
|
||||||
|
.. describe:: <backup>
|
||||||
|
|
||||||
|
Backup to modify (name or ID)
|
||||||
|
|
||||||
volume backup show
|
volume backup show
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -336,6 +336,75 @@ class TestBackupRestore(TestBackup):
|
|||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
|
||||||
|
class TestBackupSet(TestBackup):
|
||||||
|
|
||||||
|
backup = volume_fakes.FakeBackup.create_one_backup()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestBackupSet, self).setUp()
|
||||||
|
|
||||||
|
self.backups_mock.get.return_value = self.backup
|
||||||
|
|
||||||
|
# Get the command object to test
|
||||||
|
self.cmd = backup.SetVolumeBackup(self.app, None)
|
||||||
|
|
||||||
|
def test_backup_set_name(self):
|
||||||
|
arglist = [
|
||||||
|
'--name', 'new_name',
|
||||||
|
self.backup.id,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('name', 'new_name'),
|
||||||
|
('backup', self.backup.id),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
# In base command class ShowOne in cliff, abstract method take_action()
|
||||||
|
# returns nothing
|
||||||
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
self.backups_mock.update.assert_called_once_with(
|
||||||
|
self.backup.id, **{'name': 'new_name'})
|
||||||
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_backup_set_state(self):
|
||||||
|
arglist = [
|
||||||
|
'--state', 'error',
|
||||||
|
self.backup.id
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('state', 'error'),
|
||||||
|
('backup', self.backup.id)
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
self.backups_mock.reset_state.assert_called_once_with(
|
||||||
|
self.backup.id, 'error')
|
||||||
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_backup_set_state_failed(self):
|
||||||
|
self.backups_mock.reset_state.side_effect = exceptions.CommandError()
|
||||||
|
arglist = [
|
||||||
|
'--state', 'error',
|
||||||
|
self.backup.id
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('state', 'error'),
|
||||||
|
('backup', self.backup.id)
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
try:
|
||||||
|
self.cmd.take_action(parsed_args)
|
||||||
|
self.fail('CommandError should be raised.')
|
||||||
|
except exceptions.CommandError as e:
|
||||||
|
self.assertEqual('One or more of the set operations failed',
|
||||||
|
str(e))
|
||||||
|
self.backups_mock.reset_state.assert_called_with(
|
||||||
|
self.backup.id, 'error')
|
||||||
|
|
||||||
|
|
||||||
class TestBackupShow(TestBackup):
|
class TestBackupShow(TestBackup):
|
||||||
|
|
||||||
backup = volume_fakes.FakeBackup.create_one_backup()
|
backup = volume_fakes.FakeBackup.create_one_backup()
|
||||||
|
@ -281,6 +281,65 @@ class RestoreBackup(RestoreVolumeBackup):
|
|||||||
return super(RestoreBackup, self).take_action(parsed_args)
|
return super(RestoreBackup, self).take_action(parsed_args)
|
||||||
|
|
||||||
|
|
||||||
|
class SetVolumeBackup(command.Command):
|
||||||
|
"""Set volume backup properties"""
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(SetVolumeBackup, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
"backup",
|
||||||
|
metavar="<backup>",
|
||||||
|
help=_("Backup to modify (name or ID)")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--name',
|
||||||
|
metavar='<name>',
|
||||||
|
help=_('New backup name')
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--description',
|
||||||
|
metavar='<description>',
|
||||||
|
help=_('New backup description')
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--state',
|
||||||
|
metavar='<state>',
|
||||||
|
choices=['available', 'error'],
|
||||||
|
help=_('New backup state ("available" or "error") (admin only)'),
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
volume_client = self.app.client_manager.volume
|
||||||
|
backup = utils.find_resource(volume_client.backups,
|
||||||
|
parsed_args.backup)
|
||||||
|
result = 0
|
||||||
|
if parsed_args.state:
|
||||||
|
try:
|
||||||
|
volume_client.backups.reset_state(
|
||||||
|
backup.id, parsed_args.state)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.error(_("Failed to set backup state: %s"), e)
|
||||||
|
result += 1
|
||||||
|
|
||||||
|
kwargs = {}
|
||||||
|
if parsed_args.name:
|
||||||
|
kwargs['name'] = parsed_args.name
|
||||||
|
if parsed_args.description:
|
||||||
|
kwargs['description'] = parsed_args.description
|
||||||
|
if kwargs:
|
||||||
|
try:
|
||||||
|
volume_client.backups.update(backup.id, **kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.error(_("Failed to update backup name "
|
||||||
|
"or description: %s"), e)
|
||||||
|
result += 1
|
||||||
|
|
||||||
|
if result > 0:
|
||||||
|
raise exceptions.CommandError(_("One or more of the "
|
||||||
|
"set operations failed"))
|
||||||
|
|
||||||
|
|
||||||
class ShowVolumeBackup(command.ShowOne):
|
class ShowVolumeBackup(command.ShowOne):
|
||||||
"""Display volume backup details"""
|
"""Display volume backup details"""
|
||||||
|
|
||||||
|
4
releasenotes/notes/bug-1613261-290a64080fead6c0.yaml
Normal file
4
releasenotes/notes/bug-1613261-290a64080fead6c0.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Add ``volume backup set`` commands in volume v2.
|
||||||
|
[Bug `1613261 <https://bugs.launchpad.net/python-openstackclient/+bug/1613261>`_]
|
@ -517,6 +517,7 @@ openstack.volume.v2 =
|
|||||||
volume_backup_delete = openstackclient.volume.v2.backup:DeleteVolumeBackup
|
volume_backup_delete = openstackclient.volume.v2.backup:DeleteVolumeBackup
|
||||||
volume_backup_list = openstackclient.volume.v2.backup:ListVolumeBackup
|
volume_backup_list = openstackclient.volume.v2.backup:ListVolumeBackup
|
||||||
volume_backup_restore = openstackclient.volume.v2.backup:RestoreVolumeBackup
|
volume_backup_restore = openstackclient.volume.v2.backup:RestoreVolumeBackup
|
||||||
|
volume_backup_set = openstackclient.volume.v2.backup:SetVolumeBackup
|
||||||
volume_backup_show = openstackclient.volume.v2.backup:ShowVolumeBackup
|
volume_backup_show = openstackclient.volume.v2.backup:ShowVolumeBackup
|
||||||
|
|
||||||
volume_type_create = openstackclient.volume.v2.volume_type:CreateVolumeType
|
volume_type_create = openstackclient.volume.v2.volume_type:CreateVolumeType
|
||||||
|
Loading…
x
Reference in New Issue
Block a user