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
This commit is contained in:
Afonne-CID
2025-06-02 23:14:58 +01:00
parent e786c8cdd1
commit 7a4251183a
2 changed files with 35 additions and 2 deletions

View File

@@ -55,6 +55,9 @@ class CreateBaremetalRunbook(command.ShowOne):
help=_('UUID of the runbook.'))
parser.add_argument(
'--public',
dest='public',
nargs='?',
const='true',
metavar='<public>',
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='<public>',
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')

View File

@@ -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):