diff --git a/manilaclient/osc/v2/share.py b/manilaclient/osc/v2/share.py index 682734964..1309dccb9 100644 --- a/manilaclient/osc/v2/share.py +++ b/manilaclient/osc/v2/share.py @@ -796,6 +796,7 @@ class SetShare(command.Command): metavar="", required=False, default=None, + nargs='?', help=_("Indicate which task state to assign the share. Options " "include migration_starting, migration_in_progress, " "migration_completing, migration_success, migration_error, " @@ -844,9 +845,12 @@ class SetShare(command.Command): LOG.error(_( "Failed to set status for the share: %s"), e) result += 1 - if parsed_args.task_state: + if hasattr(parsed_args, 'task_state'): + task_state = parsed_args.task_state + if task_state and task_state.lower() == "none": + task_state = None try: - share_obj.reset_task_state(parsed_args.task_state) + share_obj.reset_task_state(task_state) except Exception as e: LOG.error(_("Failed to update share task state " "%s"), e) diff --git a/manilaclient/osc/v2/share_servers.py b/manilaclient/osc/v2/share_servers.py index dda2d9761..31de153ad 100644 --- a/manilaclient/osc/v2/share_servers.py +++ b/manilaclient/osc/v2/share_servers.py @@ -435,6 +435,7 @@ class SetShareServer(command.Command): metavar="", required=False, default=None, + nargs='?', help=_("Indicate which task state to assign the share server. " "Options include migration_starting, migration_in_progress," " migration_completing, migration_success, migration_error," @@ -471,16 +472,19 @@ class SetShareServer(command.Command): LOG.error(msg) raise exceptions.CommandError(msg) - if parsed_args.task_state: + if hasattr(parsed_args, 'task_state'): if share_client.api_version < api_versions.APIVersion("2.57"): raise exceptions.CommandError( "Setting the state of a share server is only available " "with manila API version >= 2.57") else: + task_state = parsed_args.task_state + if task_state and task_state.lower() == "none": + task_state = None result = 0 try: share_client.share_servers.reset_task_state( - share_server, parsed_args.task_state) + share_server, task_state) except Exception as e: LOG.error(_("Failed to update share server task state " "%s"), e) diff --git a/manilaclient/tests/unit/osc/v2/test_share.py b/manilaclient/tests/unit/osc/v2/test_share.py index fe6a5de0c..ff9cf52cf 100644 --- a/manilaclient/tests/unit/osc/v2/test_share.py +++ b/manilaclient/tests/unit/osc/v2/test_share.py @@ -1406,6 +1406,34 @@ class TestShareSet(TestShare): self._share.reset_task_state.assert_called_with(new_task_state) self.assertIsNone(result) + def test_share_set_task_state_none(self): + arglist = [ + self._share.id, + '--task-state' + ] + verifylist = [ + ('share', self._share.id), + ('task_state', None) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + self._share.reset_task_state.assert_called_with(None) + self.assertIsNone(result) + + def test_share_set_task_state_string_none(self): + arglist = [ + self._share.id, + '--task-state', 'None' + ] + verifylist = [ + ('share', self._share.id), + ('task_state', 'None') + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + self._share.reset_task_state.assert_called_with(None) + self.assertIsNone(result) + class TestShareUnset(TestShare): diff --git a/manilaclient/tests/unit/osc/v2/test_share_servers.py b/manilaclient/tests/unit/osc/v2/test_share_servers.py index dcb2f12a4..f029cce2c 100644 --- a/manilaclient/tests/unit/osc/v2/test_share_servers.py +++ b/manilaclient/tests/unit/osc/v2/test_share_servers.py @@ -564,6 +564,44 @@ class TestSetShareServer(TestShareServer): parsed_args.task_state) self.assertIsNone(result) + def test_share_server_set_task_state_none(self): + arglist = [ + self.share_server.id, + '--task-state', + ] + verifylist = [ + ('share_server', self.share_server.id), + ('task_state', None) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.reset_task_state.assert_called_with( + self.share_server, + None) + self.assertIsNone(result) + + def test_share_server_set_task_state_string_none(self): + arglist = [ + self.share_server.id, + '--task-state', 'None' + ] + verifylist = [ + ('share_server', self.share_server.id), + ('task_state', 'None') + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.servers_mock.reset_task_state.assert_called_with( + self.share_server, + None) + self.assertIsNone(result) + def test_share_server_set_status_exception(self): arglist = [ self.share_server.id, diff --git a/releasenotes/notes/bug-2108991-fix-task-state-none-handling-in-osc-share-set-307f3f4a2b232dd8.yaml b/releasenotes/notes/bug-2108991-fix-task-state-none-handling-in-osc-share-set-307f3f4a2b232dd8.yaml new file mode 100644 index 000000000..1b2d4a809 --- /dev/null +++ b/releasenotes/notes/bug-2108991-fix-task-state-none-handling-in-osc-share-set-307f3f4a2b232dd8.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + The `openstack share set` and `openstack share server set` commands now + properly handle the `--task-state` argument when given no value or "None", + sending a proper null value to the API. For more details, please refer to + `Launchpad bug #2108991 `_.