From 7a4251183a1a054b696a9a86a49443dbc182fed5 Mon Sep 17 00:00:00 2001 From: Afonne-CID Date: Mon, 2 Jun 2025 23:14:58 +0100 Subject: [PATCH] Cast string boolean from CLI Convert quoted boolean strings to real booleans when handling the ``--public`` option in runbook create and set commands. Change-Id: I44ee670b4e8d3b9fa0a5c7275efb050883b2c925 --- ironicclient/osc/v1/baremetal_runbook.py | 15 +++++++++++-- .../unit/osc/v1/test_baremetal_runbook.py | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/ironicclient/osc/v1/baremetal_runbook.py b/ironicclient/osc/v1/baremetal_runbook.py index b3e1f5841..f5f870d00 100644 --- a/ironicclient/osc/v1/baremetal_runbook.py +++ b/ironicclient/osc/v1/baremetal_runbook.py @@ -55,6 +55,9 @@ class CreateBaremetalRunbook(command.ShowOne): help=_('UUID of the runbook.')) parser.add_argument( '--public', + dest='public', + nargs='?', + const='true', metavar='', help=_('Whether the runbook will be private or public.') ) @@ -86,6 +89,9 @@ class CreateBaremetalRunbook(command.ShowOne): field_list = ['name', 'uuid', 'owner', 'public', 'extra'] fields = dict((k, v) for (k, v) in vars(parsed_args).items() if k in field_list and v is not None) + if parsed_args.public is not None: + fields['public'] = utils.bool_argument_value( + '--public', parsed_args.public, strict=True) fields = utils.args_array_to_dict(fields, 'extra') runbook = baremetal_client.runbook.create(steps=steps, **fields) @@ -156,6 +162,9 @@ class SetBaremetalRunbook(command.Command): ) parser.add_argument( '--public', + dest='public', + nargs='?', + const='true', metavar='', help=_('Make a private runbook public.') ) @@ -190,8 +199,10 @@ class SetBaremetalRunbook(command.Command): if parsed_args.owner: owner = ["owner=%s" % parsed_args.owner] properties.extend(utils.args_array_to_patch('add', owner)) - if parsed_args.public: - public = ["public=%s" % parsed_args.public] + if parsed_args.public is not None: + to_bool = utils.bool_argument_value( + '--public', parsed_args.public, strict=True) + public = ["public=%s" % to_bool] properties.extend(utils.args_array_to_patch('add', public)) if parsed_args.steps: steps = utils.handle_json_arg(parsed_args.steps, 'runbook steps') diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_runbook.py b/ironicclient/tests/unit/osc/v1/test_baremetal_runbook.py index 3dfcfae0c..556a5ceb5 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_runbook.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_runbook.py @@ -127,6 +127,28 @@ class TestCreateBaremetalRunbook(TestBaremetalRunbook): self.cmd, arglist, verifylist) self.assertFalse(self.baremetal_mock.runbook.create.called) + def test_baremetal_runbook_create_public_false(self): + arglist = [ + '--name', baremetal_fakes.baremetal_runbook_name, + '--steps', baremetal_fakes.baremetal_runbook_steps, + '--public', 'false', + ] + verifylist = [ + ('name', baremetal_fakes.baremetal_runbook_name), + ('steps', baremetal_fakes.baremetal_runbook_steps), + ('public', 'false'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.cmd.take_action(parsed_args) + + expected = { + 'name': baremetal_fakes.baremetal_runbook_name, + 'steps': json.loads(baremetal_fakes.baremetal_runbook_steps), + 'public': False, + } + self.baremetal_mock.runbook.create.assert_called_once_with(**expected) + class TestShowBaremetalRunbook(TestBaremetalRunbook): def setUp(self):