diff --git a/doc/source/command-objects/snapshot.rst b/doc/source/command-objects/snapshot.rst index b483868498..9033011822 100644 --- a/doc/source/command-objects/snapshot.rst +++ b/doc/source/command-objects/snapshot.rst @@ -2,7 +2,7 @@ snapshot ======== -Block Storage v1 +Block Storage v1, v2 snapshot create --------------- @@ -82,6 +82,7 @@ Set snapshot properties [--name ] [--description ] [--property [...] ] + [--state ] .. _snapshot_restore-snapshot: @@ -97,6 +98,14 @@ Set snapshot properties Property to add or modify for this snapshot (repeat option to set multiple properties) +.. option:: --state + + New snapshot state. + Valid values are "available", "error", "creating", + "deleting", and "error_deleting". + + *Volume version 2 only* + .. describe:: Snapshot to modify (name or ID) diff --git a/openstackclient/tests/volume/v2/test_snapshot.py b/openstackclient/tests/volume/v2/test_snapshot.py index 87e2fccfa8..9151a1d50d 100644 --- a/openstackclient/tests/volume/v2/test_snapshot.py +++ b/openstackclient/tests/volume/v2/test_snapshot.py @@ -205,7 +205,6 @@ class TestSnapshotList(TestSnapshot): class TestSnapshotSet(TestSnapshot): - def setUp(self): super(TestSnapshotSet, self).setUp() @@ -246,6 +245,23 @@ class TestSnapshotSet(TestSnapshot): ) self.assertIsNone(result) + def test_snapshot_set_state_to_error(self): + arglist = [ + "--state", "error", + volume_fakes.snapshot_id + ] + verifylist = [ + ("state", "error"), + ("snapshot", volume_fakes.snapshot_id) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.snapshots_mock.reset_state.assert_called_with( + volume_fakes.snapshot_id, "error") + self.assertIsNone(result) + class TestSnapshotShow(TestSnapshot): @@ -276,7 +292,6 @@ class TestSnapshotShow(TestSnapshot): class TestSnapshotUnset(TestSnapshot): - def setUp(self): super(TestSnapshotUnset, self).setUp() @@ -298,6 +313,7 @@ class TestSnapshotUnset(TestSnapshot): ("snapshot", volume_fakes.snapshot_id), ("property", ["foo"]) ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) diff --git a/openstackclient/volume/v2/snapshot.py b/openstackclient/volume/v2/snapshot.py index 4d00b72623..bddefc723c 100644 --- a/openstackclient/volume/v2/snapshot.py +++ b/openstackclient/volume/v2/snapshot.py @@ -180,6 +180,14 @@ class SetSnapshot(command.Command): help='Property to add/change for this snapshot ' '(repeat option to set multiple properties)', ) + parser.add_argument( + '--state', + metavar='', + choices=['available', 'error', 'creating', 'deleting', + 'error-deleting'], + help='New snapshot state. Valid values are available, ' + 'error, creating, deleting, and error-deleting.', + ) return parser def take_action(self, parsed_args): @@ -193,13 +201,17 @@ class SetSnapshot(command.Command): if parsed_args.description: kwargs['description'] = parsed_args.description - if not kwargs and not parsed_args.property: + if (not kwargs and not parsed_args.property and not + parsed_args.state): self.app.log.error("No changes requested\n") return if parsed_args.property: volume_client.volume_snapshots.set_metadata(snapshot.id, parsed_args.property) + if parsed_args.state: + volume_client.volume_snapshots.reset_state(snapshot.id, + parsed_args.state) volume_client.volume_snapshots.update(snapshot.id, **kwargs) diff --git a/releasenotes/notes/bug-1535239-767e6cf1990eda01.yaml b/releasenotes/notes/bug-1535239-767e6cf1990eda01.yaml new file mode 100644 index 0000000000..36f8e687a5 --- /dev/null +++ b/releasenotes/notes/bug-1535239-767e6cf1990eda01.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Support a new ``--state`` option for ``snapshot set`` command that + changes the state of a snapshot. + [Bug `1535239 `_]