Add "--remote-source" option to "volume snapshot create" command

Add "--remote-source" option to "volume snapshot create" command
to support creating snapshot from an existing remote snapshot in
volume v2 (v2 only), also add the doc, unit tests and release note.

Change-Id: I9e5fad4f0db5b44d528eb6b930edbc816e392c3a
Implements: bp cinder-command-support
Closes-Bug: #1618676
Co-Authored-By: Sheel Rana <ranasheel2000@gmail.com>
This commit is contained in:
Huanxuan Ao 2016-09-25 11:49:47 +08:00
parent 29587eaa66
commit 7357b24d3a
4 changed files with 74 additions and 7 deletions

View File

@ -17,6 +17,7 @@ Create new volume snapshot
[--description <description>]
[--force]
[--property <key=value> [...] ]
[--remote-source <key=value> [...]]
<snapshot-name>
.. option:: --volume <volume>
@ -37,6 +38,14 @@ Create new volume snapshot
*Volume version 2 only*
.. option:: --remote-source <key=value>
The attribute(s) of the exsiting remote volume snapshot
(admin required) (repeat option to specify multiple attributes)
e.g.: '--remote-source source-name=test_name --remote-source source-id=test_id'
*Volume version 2 only*
.. _volume_snapshot_create-snapshot-name:
.. describe:: <snapshot-name>

View File

@ -67,6 +67,7 @@ class TestSnapshotCreate(TestSnapshot):
self.volumes_mock.get.return_value = self.volume
self.snapshots_mock.create.return_value = self.new_snapshot
self.snapshots_mock.manage.return_value = self.new_snapshot
# Get the command object to test
self.cmd = volume_snapshot.CreateVolumeSnapshot(self.app, None)
@ -152,6 +153,33 @@ class TestSnapshotCreate(TestSnapshot):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_snapshot_create_without_remote_source(self):
arglist = [
'--remote-source', 'source-name=test_source_name',
'--remote-source', 'source-id=test_source_id',
'--volume', self.new_snapshot.volume_id,
]
ref_dict = {'source-name': 'test_source_name',
'source-id': 'test_source_id'}
verifylist = [
('remote_source', ref_dict),
('volume', self.new_snapshot.volume_id),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.snapshots_mock.manage.assert_called_with(
volume_id=self.new_snapshot.volume_id,
ref=ref_dict,
name=None,
description=None,
metadata=None,
)
self.snapshots_mock.create.assert_not_called()
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestSnapshotDelete(TestSnapshot):

View File

@ -65,6 +65,15 @@ class CreateVolumeSnapshot(command.ShowOne):
help=_("Set a property to this snapshot "
"(repeat option to set multiple properties)"),
)
parser.add_argument(
"--remote-source",
metavar="<key=value>",
action=parseractions.KeyValueAction,
help=_("The attribute(s) of the exsiting remote volume snapshot "
"(admin required) (repeat option to specify multiple "
"attributes) e.g.: '--remote-source source-name=test_name "
"--remote-source source-id=test_id'"),
)
return parser
def take_action(self, parsed_args):
@ -74,13 +83,29 @@ class CreateVolumeSnapshot(command.ShowOne):
volume = parsed_args.snapshot_name
volume_id = utils.find_resource(
volume_client.volumes, volume).id
snapshot = volume_client.volume_snapshots.create(
volume_id,
force=parsed_args.force,
name=parsed_args.snapshot_name,
description=parsed_args.description,
metadata=parsed_args.property,
)
if parsed_args.remote_source:
# Create a new snapshot from an existing remote snapshot source
if parsed_args.force:
msg = (_("'--force' option will not work when you create "
"new volume snapshot from an existing remote "
"volume snapshot"))
LOG.warning(msg)
snapshot = volume_client.volume_snapshots.manage(
volume_id=volume_id,
ref=parsed_args.remote_source,
name=parsed_args.snapshot_name,
description=parsed_args.description,
metadata=parsed_args.property,
)
else:
# create a new snapshot from scratch
snapshot = volume_client.volume_snapshots.create(
volume_id,
force=parsed_args.force,
name=parsed_args.snapshot_name,
description=parsed_args.description,
metadata=parsed_args.property,
)
snapshot._info.update(
{'properties': utils.format_dict(snapshot._info.pop('metadata'))}
)

View File

@ -0,0 +1,5 @@
---
features:
- Add ``--remote-source`` option to ``volume snapshot create`` command to support
creating volume snapshot from an existing remote volume snapshot in volume v2.
[Bug `1618676 <https://bugs.launchpad.net/python-openstackclient/+bug/1618676>`_]