Skip to content

Commit 902fb78

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Cinder: Adds a api mv 3.66 check for snapshot creation"
2 parents 79c78f4 + ede91ec commit 902fb78

3 files changed

Lines changed: 82 additions & 8 deletions

File tree

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,59 @@ def test_snapshot_create_with_remote_source(self):
180180
)
181181
self.volume_sdk_client.create_snapshot.assert_not_called()
182182

183+
def test_snapshot_create_pre_v366(self):
184+
self.set_volume_api_version('3.65')
185+
186+
arglist = ["--force", self.snapshot.name]
187+
verifylist = [("force", True), ("snapshot_name", self.snapshot.name)]
188+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
189+
190+
self.cmd.take_action(parsed_args)
191+
192+
# force parameter should be passed
193+
self.volume_sdk_client.create_snapshot.assert_called_with(
194+
volume_id=self.snapshot.volume_id,
195+
force=True,
196+
name=self.snapshot.name,
197+
description=None,
198+
metadata=None,
199+
)
200+
201+
def test_snapshot_create_v366_or_later(self):
202+
self.set_volume_api_version('3.66')
203+
204+
arglist = [self.snapshot.name]
205+
verifylist = [("force", False), ("snapshot_name", self.snapshot.name)]
206+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
207+
208+
self.cmd.take_action(parsed_args)
209+
210+
# force parameter should not be passed, for >=3.66
211+
self.volume_sdk_client.create_snapshot.assert_called_with(
212+
volume_id=self.snapshot.volume_id,
213+
name=self.snapshot.name,
214+
description=None,
215+
metadata=None,
216+
)
217+
218+
def test_snapshot_create_v366_or_later_with_force(self):
219+
"""--force should be ignored for microversion >= 3.66."""
220+
self.set_volume_api_version('3.66')
221+
222+
arglist = ["--force", self.snapshot.name]
223+
verifylist = [("force", True), ("snapshot_name", self.snapshot.name)]
224+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
225+
226+
self.cmd.take_action(parsed_args)
227+
228+
# passed but ignored
229+
self.volume_sdk_client.create_snapshot.assert_called_with(
230+
volume_id=self.snapshot.volume_id,
231+
name=self.snapshot.name,
232+
description=None,
233+
metadata=None,
234+
)
235+
183236

184237
class TestVolumeSnapshotDelete(volume_fakes.TestVolume):
185238
def setUp(self):

openstackclient/volume/v3/volume_snapshot.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
128128
action="store_true",
129129
default=False,
130130
help=_(
131-
"Create a snapshot attached to an instance. Default is False"
131+
"Allow snapshot of in-use (attached) volume. "
132+
"Only needed for microversions prior to 3.66; "
133+
"ignored for 3.66+"
132134
),
133135
)
134136
parser.add_argument(
@@ -185,13 +187,23 @@ def take_action(
185187
)
186188
else:
187189
# Create a new snapshot from scratch
188-
snapshot = volume_client.create_snapshot(
189-
volume_id=volume_id,
190-
force=parsed_args.force,
191-
name=parsed_args.snapshot_name,
192-
description=parsed_args.description,
193-
metadata=parsed_args.properties,
194-
)
190+
# only for microversion < 3.66, pass force parameter
191+
# for backward compatibility
192+
if not sdk_utils.supports_microversion(volume_client, '3.66'):
193+
snapshot = volume_client.create_snapshot(
194+
volume_id=volume_id,
195+
force=parsed_args.force,
196+
name=parsed_args.snapshot_name,
197+
description=parsed_args.description,
198+
metadata=parsed_args.properties,
199+
)
200+
else:
201+
snapshot = volume_client.create_snapshot(
202+
volume_id=volume_id,
203+
name=parsed_args.snapshot_name,
204+
description=parsed_args.description,
205+
metadata=parsed_args.properties,
206+
)
195207

196208
data = _format_snapshot(snapshot)
197209
col_headers, col_data = zip(*sorted(data.items()))
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
fixes:
3+
- |
4+
Fix ``volume snapshot create`` to work with Cinder API microversion 3.66
5+
and later. Since version 3.66, the 'force' parameter is no longer
6+
needed for snapshot creation as in-use volumes can be snapshotted by
7+
default. The command now only passes the 'force' parameter for version
8+
prior to 3.66.
9+
[Bug `2089188 <https://bugs.launchpad.net/python-openstackclient/+bug/2089188>`_]

0 commit comments

Comments
 (0)