summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorHuanxuan Ao <huanxuan.ao@easystack.cn>2016-09-25 11:49:47 +0800
committerHuanxuan Ao <huanxuan.ao@easystack.cn>2016-12-12 23:06:00 +0800
commit7357b24d3a63be612aa32c901e15424ff92beca0 (patch)
tree6ab34258ca78117e8a66e5cd474f3ef9824a73bf /openstackclient
parent29587eaa6661493b7df9357ad818bf058e820730 (diff)
downloadpython-openstackclient-7357b24d3a63be612aa32c901e15424ff92beca0.tar.gz
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>
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/tests/unit/volume/v2/test_snapshot.py28
-rw-r--r--openstackclient/volume/v2/volume_snapshot.py39
2 files changed, 60 insertions, 7 deletions
diff --git a/openstackclient/tests/unit/volume/v2/test_snapshot.py b/openstackclient/tests/unit/volume/v2/test_snapshot.py
index cedf21a9..8ce356ae 100644
--- a/openstackclient/tests/unit/volume/v2/test_snapshot.py
+++ b/openstackclient/tests/unit/volume/v2/test_snapshot.py
@@ -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):
diff --git a/openstackclient/volume/v2/volume_snapshot.py b/openstackclient/volume/v2/volume_snapshot.py
index d95a49a4..34b8fb82 100644
--- a/openstackclient/volume/v2/volume_snapshot.py
+++ b/openstackclient/volume/v2/volume_snapshot.py
@@ -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'))}
)