convert SubiquityServer.kernel_params to an overengineered class

This commit is contained in:
Michael Hudson-Doyle 2022-06-01 15:33:55 +12:00
parent 3e0c91e34b
commit 3d1c8fd6cf
6 changed files with 40 additions and 12 deletions

View File

@ -16,8 +16,11 @@
import argparse import argparse
import logging import logging
import os import os
import shlex
import sys import sys
import attr
from subiquitycore.log import setup_logger from subiquitycore.log import setup_logger
from .common import ( from .common import (
@ -26,6 +29,30 @@ from .common import (
) )
@attr.s(auto_attribs=True)
class CommandLineParams:
_raw: str
_tokens: set = attr.Factory(set)
_values: dict = attr.Factory(dict)
@classmethod
def from_cmdline(cls, cmdline):
r = cls(cmdline)
for tok in shlex.split(cmdline):
if '=' in tok:
k, v = tok.split('=', 1)
r._values[k] = v
else:
r._tokens.add(tok)
return r
def __contains__(self, item):
return item in self._tokens
def get(self, key, default=None):
return self._values.get(key, default)
def make_server_args_parser(): def make_server_args_parser():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='SUbiquity - Ubiquity for Servers', description='SUbiquity - Ubiquity for Servers',
@ -48,7 +75,9 @@ def make_server_args_parser():
'or autoinstall data from cloud-init.')) 'or autoinstall data from cloud-init.'))
with open('/proc/cmdline') as fp: with open('/proc/cmdline') as fp:
cmdline = fp.read() cmdline = fp.read()
parser.add_argument('--kernel-cmdline', action='store', default=cmdline) parser.add_argument(
'--kernel-cmdline', action='store', default=cmdline,
type=CommandLineParams.from_cmdline)
parser.add_argument( parser.add_argument(
'--snaps-from-examples', action='store_const', const=True, '--snaps-from-examples', action='store_const', const=True,
dest="snaps_from_examples", dest="snaps_from_examples",
@ -115,6 +144,7 @@ def main():
version = os.environ.get("SNAP_REVISION", "unknown") version = os.environ.get("SNAP_REVISION", "unknown")
logger.info("Starting Subiquity server revision {}".format(version)) logger.info("Starting Subiquity server revision {}".format(version))
logger.info("Arguments passed: {}".format(sys.argv)) logger.info("Arguments passed: {}".format(sys.argv))
logger.debug("Kernel commandline: {}".format(opts.kernel_cmdline))
server = SubiquityServer(opts, block_log_dir) server = SubiquityServer(opts, block_log_dir)

View File

@ -133,12 +133,11 @@ class RefreshController(SubiquityController):
def get_refresh_channel(self): def get_refresh_channel(self):
"""Return the channel we should refresh subiquity to.""" """Return the channel we should refresh subiquity to."""
prefix = "subiquity-channel=" channel = self.app.kernel_cmdline.get('subiquity-channel')
for arg in self.app.kernel_cmdline: if channel is not None:
if arg.startswith(prefix): log.debug(
log.debug( "get_refresh_channel: found %s on kernel cmdline", channel)
"get_refresh_channel: found %s on kernel cmdline", arg) return channel
return arg[len(prefix):]
if 'channel' in self.ai_data: if 'channel' in self.ai_data:
return self.ai_data['channel'] return self.ai_data['channel']

View File

@ -16,7 +16,6 @@
import asyncio import asyncio
import logging import logging
import os import os
import shlex
import sys import sys
import time import time
from typing import List, Optional from typing import List, Optional
@ -304,7 +303,7 @@ class SubiquityServer(Application):
self.prober = None self.prober = None
else: else:
self.prober = Prober(opts.machine_config, self.debug_flags) self.prober = Prober(opts.machine_config, self.debug_flags)
self.kernel_cmdline = shlex.split(opts.kernel_cmdline) self.kernel_cmdline = opts.kernel_cmdline
if opts.snaps_from_examples: if opts.snaps_from_examples:
connection = FakeSnapdConnection( connection = FakeSnapdConnection(
os.path.join( os.path.join(

View File

@ -33,7 +33,7 @@ class TestAutoinstallLoad(SubiTestCase):
opts.dry_run = True opts.dry_run = True
opts.output_base = self.tempdir opts.output_base = self.tempdir
opts.machine_config = 'examples/simple.json' opts.machine_config = 'examples/simple.json'
opts.kernel_cmdline = '' opts.kernel_cmdline = {}
opts.autoinstall = None opts.autoinstall = None
self.server = SubiquityServer(opts, None) self.server = SubiquityServer(opts, None)
self.server.base_model = Mock() self.server.base_model = Mock()

View File

@ -29,7 +29,7 @@ def make_app():
parser = make_server_args_parser() parser = make_server_args_parser()
opts, unknown = parser.parse_known_args(['--dry-run']) opts, unknown = parser.parse_known_args(['--dry-run'])
opts.machine_config = NOPROBERARG opts.machine_config = NOPROBERARG
opts.kernel_cmdline = "" opts.kernel_cmdline = {}
opts.snaps_from_examples = False opts.snaps_from_examples = False
app = SystemSetupServer(opts, '') app = SystemSetupServer(opts, '')
app.base_model = app.make_model() app.base_model = app.make_model()

View File

@ -56,7 +56,7 @@ def main():
opts = parser.parse_args(sys.argv[1:]) opts = parser.parse_args(sys.argv[1:])
logdir = LOGDIR logdir = LOGDIR
opts.snaps_from_examples = False opts.snaps_from_examples = False
opts.kernel_cmdline = "" opts.kernel_cmdline = {}
opts.machine_config = NOPROBERARG opts.machine_config = NOPROBERARG
if opts.dry_run: if opts.dry_run:
logdir = opts.output_base logdir = opts.output_base