From 02e6abad48400c8a6106c47ff4c20587ca9f41bd Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 3 Aug 2022 11:23:23 -0400 Subject: cli: Break up parse_option_strings Into run_parser and run_all_parsers. Opencode some of the special case handling in virtxml Signed-off-by: Cole Robinson --- virtinst/cli.py | 38 +++++++++++++++----------------------- virtinst/virtinstall.py | 4 ++-- virtinst/virtxml.py | 9 ++++++--- 3 files changed, 23 insertions(+), 28 deletions(-) (limited to 'virtinst') diff --git a/virtinst/cli.py b/virtinst/cli.py index 6179c436..c4dffd34 100644 --- a/virtinst/cli.py +++ b/virtinst/cli.py @@ -4812,35 +4812,27 @@ class ParserLaunchSecurity(VirtCLIParser): # Public virt parser APIs # ########################### -def parse_option_strings(options, guest, instlist, editing=False): +def run_parser(options, guest, parserclass, editinst=None): """ - Iterate over VIRT_PARSERS, and launch the associated parser - function for every value that was filled in on 'options', which - came from argparse/the command line. - - @editing: If we are updating an existing guest, like from virt-xml + Lookup the cli options.* string associated with the passed in Parser* + class, and parse its values into the passed guest instance, or editinst + for some virt-xml usage. """ - instlist = xmlutil.listify(instlist) - if not instlist: - instlist = [None] - ret = [] - for parserclass in VIRT_PARSERS: - optlist = xmlutil.listify(getattr(options, parserclass.cli_arg_name)) - if not optlist: - continue + optstr_list = xmlutil.listify(getattr(options, parserclass.cli_arg_name)) + + for optstr in optstr_list: + parserobj = parserclass(optstr, guest=guest, editing=bool(editinst)) + parseret = parserobj.parse(editinst) + ret += xmlutil.listify(parseret) - for inst in instlist: - if inst and optlist: - # If an object is passed in, we are updating it in place, and - # only use the last command line occurrence, eg. from virt-xml - optlist = [optlist[-1]] + return ret - for optstr in optlist: - parserobj = parserclass(optstr, guest=guest, editing=editing) - parseret = parserobj.parse(inst) - ret += xmlutil.listify(parseret) +def run_all_parsers(options, guest): + ret = [] + for parserclass in VIRT_PARSERS: + ret += run_parser(options, guest, parserclass) return ret diff --git a/virtinst/virtinstall.py b/virtinst/virtinstall.py index 34f5a7fa..35261148 100644 --- a/virtinst/virtinstall.py +++ b/virtinst/virtinstall.py @@ -618,12 +618,12 @@ def _build_options_guest(conn, options): # Fill in guest from the command line content set_explicit_guest_options(options, guest) - cli.parse_option_strings(options, guest, None) + cli.run_all_parsers(options, guest) cli.parse_xmlcli(guest, options) # Call set_capabilities_defaults explicitly here rather than depend # on set_defaults calling it. Installer setup needs filled in values. - # However we want to do it after parse_option_strings to ensure + # However we want to do it after run_all_parsers to ensure # we are operating on any arch/os/type values passed in with --boot guest.set_capabilities_defaults() diff --git a/virtinst/virtxml.py b/virtinst/virtxml.py index b9554d2c..234115b0 100644 --- a/virtinst/virtxml.py +++ b/virtinst/virtxml.py @@ -156,7 +156,10 @@ def action_edit(guest, options, parserclass): if options.os_variant is not None: fail(_("--os-variant/--osinfo is not supported with --edit")) - return cli.parse_option_strings(options, guest, inst, editing=True) + devs = [] + for editinst in xmlutil.listify(inst): + devs += cli.run_parser(options, guest, parserclass, editinst=editinst) + return devs def action_add_device(guest, options, parserclass, devs): @@ -168,7 +171,7 @@ def action_add_device(guest, options, parserclass, devs): for dev in devs: guest.add_device(dev) else: - devs = cli.parse_option_strings(options, guest, None) + devs = cli.run_parser(options, guest, parserclass) for dev in devs: dev.set_defaults(guest) @@ -205,7 +208,7 @@ def action_build_xml(options, parserclass, guest): if options.os_variant is not None: fail(_("--os-variant/--osinfo is not supported with --build-xml")) - devs = cli.parse_option_strings(options, guest, None) + devs = cli.run_parser(options, guest, parserclass) for dev in devs: dev.set_defaults(guest) return devs -- cgit v1.2.1