From 7faa1634ffdee6d872a24ead0d0a4838fad0a938 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Fri, 9 Oct 2020 21:25:49 +1300 Subject: [PATCH] move controllers with no api presence to server --- po/POTFILES.in | 11 ++--- subiquity/controllers/__init__.py | 13 ------ subiquity/controllers/error.py | 27 ----------- subiquity/server/controllers/__init__.py | 12 +++++ subiquity/{ => server}/controllers/cmdlist.py | 46 ++++++++++++++++--- subiquity/{ => server}/controllers/debconf.py | 4 +- subiquity/{ => server}/controllers/package.py | 4 +- .../{ => server}/controllers/reporting.py | 12 +++-- .../{ => server}/controllers/userdata.py | 4 +- subiquity/server/server.py | 7 +++ 10 files changed, 78 insertions(+), 62 deletions(-) delete mode 100644 subiquity/controllers/error.py rename subiquity/{ => server}/controllers/cmdlist.py (57%) rename subiquity/{ => server}/controllers/debconf.py (89%) rename subiquity/{ => server}/controllers/package.py (89%) rename subiquity/{ => server}/controllers/reporting.py (88%) rename subiquity/{ => server}/controllers/userdata.py (89%) diff --git a/po/POTFILES.in b/po/POTFILES.in index 529a6ab5..7bbdfae2 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -27,25 +27,19 @@ subiquity/common/serialize.py subiquity/common/tests/test_keyboard.py subiquity/common/types.py subiquity/controller.py -subiquity/controllers/cmdlist.py -subiquity/controllers/debconf.py -subiquity/controllers/error.py subiquity/controllers/filesystem.py subiquity/controllers/identity.py subiquity/controllers/__init__.py subiquity/controllers/keyboard.py subiquity/controllers/mirror.py subiquity/controllers/network.py -subiquity/controllers/package.py subiquity/controllers/proxy.py subiquity/controllers/reboot.py subiquity/controllers/refresh.py -subiquity/controllers/reporting.py subiquity/controllers/snaplist.py subiquity/controllers/ssh.py subiquity/controllers/tests/__init__.py subiquity/controllers/tests/test_filesystem.py -subiquity/controllers/userdata.py subiquity/controllers/zdev.py subiquitycore/async_helpers.py subiquitycore/contextlib38.py @@ -122,9 +116,14 @@ subiquity/models/tests/test_filesystem.py subiquity/models/tests/test_mirror.py subiquity/models/tests/test_subiquity.py subiquity/server/controller.py +subiquity/server/controllers/cmdlist.py +subiquity/server/controllers/debconf.py subiquity/server/controllers/__init__.py subiquity/server/controllers/install.py subiquity/server/controllers/locale.py +subiquity/server/controllers/package.py +subiquity/server/controllers/reporting.py +subiquity/server/controllers/userdata.py subiquity/server/dryrun.py subiquity/server/errors.py subiquity/server/__init__.py diff --git a/subiquity/controllers/__init__.py b/subiquity/controllers/__init__.py index 0cb6a676..cb644f2e 100644 --- a/subiquity/controllers/__init__.py +++ b/subiquity/controllers/__init__.py @@ -14,42 +14,29 @@ # along with this program. If not, see . from ..controller import RepeatedController -from .cmdlist import EarlyController, LateController -from .debconf import DebconfController -from .error import ErrorController from .filesystem import FilesystemController from .identity import IdentityController from .keyboard import KeyboardController from .mirror import MirrorController from .network import NetworkController -from .package import PackageController from .proxy import ProxyController from .reboot import RebootController from .refresh import RefreshController -from .reporting import ReportingController from .snaplist import SnapListController from .ssh import SSHController -from .userdata import UserdataController from .zdev import ZdevController __all__ = [ - 'DebconfController', - 'EarlyController', - 'ErrorController', 'FilesystemController', 'IdentityController', 'KeyboardController', - 'LateController', 'MirrorController', 'NetworkController', - 'PackageController', 'ProxyController', 'RebootController', 'RefreshController', 'RepeatedController', - 'ReportingController', 'SnapListController', 'SSHController', - 'UserdataController', 'ZdevController', ] diff --git a/subiquity/controllers/error.py b/subiquity/controllers/error.py deleted file mode 100644 index cec81a21..00000000 --- a/subiquity/controllers/error.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2019 Canonical, Ltd. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -import logging - -from subiquity.controllers.cmdlist import CmdListController - - -log = logging.getLogger('subiquity.controllers.error') - - -class ErrorController(CmdListController): - - autoinstall_key = 'error-commands' - cmd_check = False diff --git a/subiquity/server/controllers/__init__.py b/subiquity/server/controllers/__init__.py index 63777d40..d80883f4 100644 --- a/subiquity/server/controllers/__init__.py +++ b/subiquity/server/controllers/__init__.py @@ -13,10 +13,22 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from .cmdlist import EarlyController, LateController, ErrorController +from .debconf import DebconfController from .install import InstallController from .locale import LocaleController +from .package import PackageController +from .reporting import ReportingController +from .userdata import UserdataController __all__ = [ + 'DebconfController', + 'EarlyController', + 'ErrorController', 'InstallController', + 'LateController', 'LocaleController', + 'PackageController', + 'ReportingController', + 'UserdataController', ] diff --git a/subiquity/controllers/cmdlist.py b/subiquity/server/controllers/cmdlist.py similarity index 57% rename from subiquity/controllers/cmdlist.py rename to subiquity/server/controllers/cmdlist.py index d73d72dc..491986d3 100644 --- a/subiquity/controllers/cmdlist.py +++ b/subiquity/server/controllers/cmdlist.py @@ -13,15 +13,19 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import asyncio import os +from systemd import journal + from subiquitycore.context import with_context from subiquitycore.utils import arun_command -from subiquity.controller import SubiquityController +from subiquity.common.types import InstallState +from subiquity.server.controller import NonInteractiveController -class CmdListController(SubiquityController): +class CmdListController(NonInteractiveController): autoinstall_default = [] autoinstall_schema = { @@ -33,6 +37,11 @@ class CmdListController(SubiquityController): } cmds = () cmd_check = True + send_to_journal = False + + def __init__(self, app): + super().__init__(app) + self.run_event = asyncio.Event() def load_autoinstall_data(self, data): self.cmds = data @@ -44,18 +53,32 @@ class CmdListController(SubiquityController): async def run(self, context): env = self.env() for i, cmd in enumerate(self.cmds): - with context.child("command_{}".format(i), cmd): + if isinstance(cmd, str): + desc = cmd + else: + desc = ' '.join(cmd) + with context.child("command_{}".format(i), desc): if isinstance(cmd, str): cmd = ['sh', '-c', cmd] + if self.send_to_journal: + journal.send( + " running " + desc, + SYSLOG_IDENTIFIER=self.app.early_commands_syslog_id) + cmd = [ + 'systemd-cat', '--level-prefix=false', + '--identifier=' + self.app.early_commands_syslog_id, + ] + cmd await arun_command( cmd, env=env, stdin=None, stdout=None, stderr=None, check=self.cmd_check) + self.run_event.set() class EarlyController(CmdListController): autoinstall_key = 'early-commands' + send_to_journal = True class LateController(CmdListController): @@ -67,6 +90,17 @@ class LateController(CmdListController): env['TARGET_MOUNT_POINT'] = self.app.base_model.target return env - @with_context() - async def apply_autoinstall_config(self, context): - await self.run(context=context) + def start(self): + self.app.aio_loop.create_task(self._run()) + + async def _run(self): + Install = self.app.controllers.Install + await Install.install_task + if Install.install_state == InstallState.DONE: + await self.run() + + +class ErrorController(CmdListController): + + autoinstall_key = 'error-commands' + cmd_check = False diff --git a/subiquity/controllers/debconf.py b/subiquity/server/controllers/debconf.py similarity index 89% rename from subiquity/controllers/debconf.py rename to subiquity/server/controllers/debconf.py index d529295d..251f765e 100644 --- a/subiquity/controllers/debconf.py +++ b/subiquity/server/controllers/debconf.py @@ -13,10 +13,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from subiquity.controller import SubiquityController +from subiquity.server.controller import NonInteractiveController -class DebconfController(SubiquityController): +class DebconfController(NonInteractiveController): model_name = "debconf_selections" autoinstall_key = "debconf-selections" diff --git a/subiquity/controllers/package.py b/subiquity/server/controllers/package.py similarity index 89% rename from subiquity/controllers/package.py rename to subiquity/server/controllers/package.py index 56340bca..6fb65413 100644 --- a/subiquity/controllers/package.py +++ b/subiquity/server/controllers/package.py @@ -13,10 +13,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from subiquity.controller import SubiquityController +from subiquity.server.controller import NonInteractiveController -class PackageController(SubiquityController): +class PackageController(NonInteractiveController): model_name = autoinstall_key = "packages" autoinstall_default = [] diff --git a/subiquity/controllers/reporting.py b/subiquity/server/controllers/reporting.py similarity index 88% rename from subiquity/controllers/reporting.py rename to subiquity/server/controllers/reporting.py index c93bd335..6bb2ac6f 100644 --- a/subiquity/controllers/reporting.py +++ b/subiquity/server/controllers/reporting.py @@ -29,7 +29,7 @@ from curtin.reporter.handlers import ( LogHandler, ) -from subiquity.controller import SubiquityController +from subiquity.server.controller import NonInteractiveController class LogHandler(LogHandler): @@ -42,10 +42,13 @@ class LogHandler(LogHandler): available_handlers.unregister_item('log') available_handlers.register_item('log', LogHandler) -INITIAL_CONFIG = {'logging': {'type': 'log'}} +INITIAL_CONFIG = { + 'logging': {'type': 'log'}, + } +NON_INTERACTIVE_CONFIG = {'builtin': {'type': 'print'}} -class ReportingController(SubiquityController): +class ReportingController(NonInteractiveController): autoinstall_key = "reporting" autoinstall_schema = { @@ -61,13 +64,14 @@ class ReportingController(SubiquityController): } def __init__(self, app): - self.config = copy.deepcopy(INITIAL_CONFIG) super().__init__(app) + self.config = copy.deepcopy(INITIAL_CONFIG) app.add_event_listener(self) def load_autoinstall_data(self, data): if self.app.interactive(): return + self.config.update(copy.deepcopy(NON_INTERACTIVE_CONFIG)) if data is not None: self.config.update(copy.deepcopy(data)) diff --git a/subiquity/controllers/userdata.py b/subiquity/server/controllers/userdata.py similarity index 89% rename from subiquity/controllers/userdata.py rename to subiquity/server/controllers/userdata.py index db18b2e1..77e743e0 100644 --- a/subiquity/controllers/userdata.py +++ b/subiquity/server/controllers/userdata.py @@ -13,10 +13,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from subiquity.controller import SubiquityController +from subiquity.server.controller import NonInteractiveController -class UserdataController(SubiquityController): +class UserdataController(NonInteractiveController): model_name = 'userdata' autoinstall_key = "user-data" diff --git a/subiquity/server/server.py b/subiquity/server/server.py index 63badf4c..da839479 100644 --- a/subiquity/server/server.py +++ b/subiquity/server/server.py @@ -112,8 +112,15 @@ class SubiquityServer(Application): project = "subiquity" from subiquity.server import controllers as controllers_mod controllers = [ + "Early", + "Reporting", + "Error", + "Userdata", + "Package", + "Debconf", "Locale", "Install", + "Late", ] def make_model(self):