From bd69f2a746257cd945d93e49d9249531b63616df Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Mon, 12 Oct 2020 13:14:10 +1300 Subject: [PATCH] move identity controller to new world --- po/POTFILES.in | 3 +- subiquity/client/client.py | 1 + subiquity/client/controllers/__init__.py | 2 + subiquity/client/controllers/identity.py | 50 +++++++++++++++++ subiquity/common/apidef.py | 2 + subiquity/controllers/__init__.py | 2 - subiquity/server/controllers/__init__.py | 2 + .../{ => server}/controllers/identity.py | 53 +++++++------------ subiquity/server/server.py | 1 + subiquity/ui/views/tests/test_identity.py | 2 +- 10 files changed, 80 insertions(+), 38 deletions(-) create mode 100644 subiquity/client/controllers/identity.py rename subiquity/{ => server}/controllers/identity.py (70%) diff --git a/po/POTFILES.in b/po/POTFILES.in index c2873275..7fbee7d7 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -2,6 +2,7 @@ subiquity/client/client.py subiquity/client/controller.py subiquity/client/controllers/filesystem.py +subiquity/client/controllers/identity.py subiquity/client/controllers/__init__.py subiquity/client/controllers/keyboard.py subiquity/client/controllers/mirror.py @@ -38,7 +39,6 @@ subiquity/common/tests/test_filesystem.py subiquity/common/tests/test_keyboard.py subiquity/common/types.py subiquity/controller.py -subiquity/controllers/identity.py subiquity/controllers/__init__.py subiquity/controllers/reboot.py subiquity/controllers/snaplist.py @@ -120,6 +120,7 @@ subiquity/server/controller.py subiquity/server/controllers/cmdlist.py subiquity/server/controllers/debconf.py subiquity/server/controllers/filesystem.py +subiquity/server/controllers/identity.py subiquity/server/controllers/__init__.py subiquity/server/controllers/install.py subiquity/server/controllers/keyboard.py diff --git a/subiquity/client/client.py b/subiquity/client/client.py index 8bc81cc8..9e7d1858 100644 --- a/subiquity/client/client.py +++ b/subiquity/client/client.py @@ -99,6 +99,7 @@ class SubiquityClient(TuiApplication): "Mirror", "Refresh", "Filesystem", + "Identity", "Progress", ] diff --git a/subiquity/client/controllers/__init__.py b/subiquity/client/controllers/__init__.py index 49fc3ef3..3af77208 100644 --- a/subiquity/client/controllers/__init__.py +++ b/subiquity/client/controllers/__init__.py @@ -15,6 +15,7 @@ from subiquitycore.tuicontroller import RepeatedController from .filesystem import FilesystemController +from .identity import IdentityController from .keyboard import KeyboardController from .mirror import MirrorController from .network import NetworkController @@ -26,6 +27,7 @@ from .zdev import ZdevController __all__ = [ 'FilesystemController', + 'IdentityController', 'KeyboardController', 'MirrorController', 'NetworkController', diff --git a/subiquity/client/controllers/identity.py b/subiquity/client/controllers/identity.py new file mode 100644 index 00000000..b0ccda7b --- /dev/null +++ b/subiquity/client/controllers/identity.py @@ -0,0 +1,50 @@ +# Copyright 2015 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.client.controller import SubiquityTuiController +from subiquity.common.types import IdentityData +from subiquity.ui.views import IdentityView + +log = logging.getLogger('subiquity.client.controllers.identity') + + +class IdentityController(SubiquityTuiController): + + endpoint_name = 'identity' + + async def make_ui(self): + data = await self.endpoint.GET() + return IdentityView(self, data) + + def run_answers(self): + if all(elem in self.answers for elem in + ['realname', 'username', 'password', 'hostname']): + identity = IdentityData( + realname=self.answers['realname'], + username=self.answers['username'], + hostname=self.answers['hostname'], + crypted_password=self.answers['password']) + self.done(identity) + + def cancel(self): + self.app.prev_screen() + + def done(self, identity_data): + log.debug( + "IdentityController.done next_screen user_spec=%s", + identity_data) + self.app.next_screen(self.endpoint.POST(identity_data)) diff --git a/subiquity/common/apidef.py b/subiquity/common/apidef.py index 63af830e..fb86ff64 100644 --- a/subiquity/common/apidef.py +++ b/subiquity/common/apidef.py @@ -28,6 +28,7 @@ from subiquity.common.types import ( ApplicationStatus, ErrorReportRef, KeyboardSetting, + IdentityData, InstallState, InstallStatus, RefreshStatus, @@ -43,6 +44,7 @@ class API: keyboard = simple_endpoint(KeyboardSetting) proxy = simple_endpoint(str) mirror = simple_endpoint(str) + identity = simple_endpoint(IdentityData) class meta: class status: diff --git a/subiquity/controllers/__init__.py b/subiquity/controllers/__init__.py index ee934200..f1f5b454 100644 --- a/subiquity/controllers/__init__.py +++ b/subiquity/controllers/__init__.py @@ -13,13 +13,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from .identity import IdentityController from .reboot import RebootController from .snaplist import SnapListController from .ssh import SSHController __all__ = [ - 'IdentityController', 'RebootController', 'SnapListController', 'SSHController', diff --git a/subiquity/server/controllers/__init__.py b/subiquity/server/controllers/__init__.py index 474752a0..379928d0 100644 --- a/subiquity/server/controllers/__init__.py +++ b/subiquity/server/controllers/__init__.py @@ -16,6 +16,7 @@ from .cmdlist import EarlyController, LateController, ErrorController from .debconf import DebconfController from .filesystem import FilesystemController +from .identity import IdentityController from .install import InstallController from .keyboard import KeyboardController from .locale import LocaleController @@ -33,6 +34,7 @@ __all__ = [ 'EarlyController', 'ErrorController', 'FilesystemController', + 'IdentityController', 'InstallController', 'KeyboardController', 'LateController', diff --git a/subiquity/controllers/identity.py b/subiquity/server/controllers/identity.py similarity index 70% rename from subiquity/controllers/identity.py rename to subiquity/server/controllers/identity.py index c9d239a9..42d35629 100644 --- a/subiquity/controllers/identity.py +++ b/subiquity/server/controllers/identity.py @@ -19,14 +19,16 @@ import attr from subiquitycore.context import with_context +from subiquity.common.apidef import API from subiquity.common.types import IdentityData -from subiquity.controller import SubiquityTuiController -from subiquity.ui.views import IdentityView +from subiquity.server.controller import SubiquityController -log = logging.getLogger('subiquity.controllers.identity') +log = logging.getLogger('subiquity.server.controllers.identity') -class IdentityController(SubiquityTuiController): +class IdentityController(SubiquityController): + + endpoint = API.identity autoinstall_key = model_name = "identity" autoinstall_schema = { @@ -57,39 +59,22 @@ class IdentityController(SubiquityTuiController): if 'user-data' not in self.app.autoinstall_config: raise Exception("no identity data provided") - def make_ui(self): - data = IdentityData() - if self.model.user is not None: - data.username = self.model.user.username - data.realname = self.model.user.realname - if self.model.hostname: - data.hostname = self.model.hostname - return IdentityView(self, data) - - def run_answers(self): - if all(elem in self.answers for elem in - ['realname', 'username', 'password', 'hostname']): - identity = IdentityData( - realname=self.answers['realname'], - username=self.answers['username'], - hostname=self.answers['hostname'], - crypted_password=self.answers['password']) - self.done(identity) - - def cancel(self): - self.app.prev_screen() - - def done(self, identity_data): - log.debug( - "IdentityController.done next_screen user_spec=%s", - identity_data) - self.model.add_user(identity_data) - self.configured() - self.app.next_screen() - def make_autoinstall(self): if self.model.user is None: return {} r = attr.asdict(self.model.user) r['hostname'] = self.model.hostname return r + + async def GET(self) -> IdentityData: + data = IdentityData() + if self.model.user is not None: + data.username = self.model.user.username + data.realname = self.model.user.realname + if self.model.hostname: + data.hostname = self.model.hostname + return data + + async def POST(self, data: IdentityData): + self.model.add_user(data) + self.configured() diff --git a/subiquity/server/server.py b/subiquity/server/server.py index 4bc1d85e..b50f0640 100644 --- a/subiquity/server/server.py +++ b/subiquity/server/server.py @@ -126,6 +126,7 @@ class SubiquityServer(Application): "Proxy", "Mirror", "Filesystem", + "Identity", "Install", "Late", ] diff --git a/subiquity/ui/views/tests/test_identity.py b/subiquity/ui/views/tests/test_identity.py index ae6c976e..55edae49 100644 --- a/subiquity/ui/views/tests/test_identity.py +++ b/subiquity/ui/views/tests/test_identity.py @@ -4,7 +4,7 @@ from unittest import mock from subiquitycore.signals import Signal from subiquitycore.testing import view_helpers -from subiquity.controllers.identity import IdentityController +from subiquity.client.controllers.identity import IdentityController from subiquity.common.types import IdentityData from subiquity.ui.views.identity import IdentityView