From f4066d97d705e5fa13b0190b889922e2f926b843 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Thu, 3 Sep 2020 22:52:31 +1200 Subject: [PATCH] convert controller api methods to take strings and trigger updates for affected nics this is going to work better in the client/server world --- subiquitycore/controllers/network.py | 85 ++++++++----------- subiquitycore/ui/views/network.py | 2 +- .../network_configure_manual_interface.py | 29 +++---- ...test_network_configure_manual_interface.py | 2 +- 4 files changed, 52 insertions(+), 66 deletions(-) diff --git a/subiquitycore/controllers/network.py b/subiquitycore/controllers/network.py index 75e320b3..84fc3303 100644 --- a/subiquitycore/controllers/network.py +++ b/subiquitycore/controllers/network.py @@ -17,6 +17,7 @@ import asyncio import logging import os import subprocess +from typing import Optional import yaml @@ -30,9 +31,7 @@ from subiquitycore.models.network import ( BondConfig, DHCPState, NetDevAction, - NetDevInfo, StaticConfig, - VLANConfig, WLANConfig, ) from subiquitycore import netplan @@ -476,12 +475,9 @@ class NetworkController(BaseController): def cancel(self): self.app.prev_screen() - def set_static_config(self, dev_info: NetDevInfo, ip_version: int, + def set_static_config(self, dev_name: str, ip_version: int, static_config: StaticConfig) -> None: - setattr(dev_info, 'static' + str(ip_version), static_config) - getattr(dev_info, 'dhcp' + str(ip_version)).enabled = False - - dev = self.model.get_netdev_by_name(dev_info.name) + dev = self.model.get_netdev_by_name(dev_name) dev.remove_ip_networks_for_version(ip_version) dev.config.setdefault('addresses', []).extend(static_config.addresses) gwkey = 'gateway{v}'.format(v=ip_version) @@ -492,55 +488,48 @@ class NetworkController(BaseController): ns = dev.config.setdefault('nameservers', {}) ns.setdefault('addresses', []).extend(static_config.nameservers) ns.setdefault('search', []).extend(static_config.searchdomains) + self.update_link(dev) self.apply_config() - def enable_dhcp(self, dev_info: NetDevInfo, ip_version: int) -> None: - setattr(dev_info, 'static' + str(ip_version), StaticConfig()) - getattr(dev_info, 'dhcp' + str(ip_version)).enabled = True - getattr(dev_info, 'dhcp' + str(ip_version)).state = DHCPState.PENDING - - dev = self.model.get_netdev_by_name(dev_info.name) + def enable_dhcp(self, dev_name: str, ip_version: int) -> None: + dev = self.model.get_netdev_by_name(dev_name) dev.remove_ip_networks_for_version(ip_version) dhcpkey = 'dhcp{v}'.format(v=ip_version) dev.config[dhcpkey] = True - self.apply_config() - - def disable_network(self, dev_info: NetDevInfo, ip_version: int) -> None: - setattr(dev_info, 'static' + str(ip_version), StaticConfig()) - getattr(dev_info, 'dhcp' + str(ip_version)).enabled = False - - dev = self.model.get_netdev_by_name(dev_info.name) - dev.remove_ip_networks_for_version(ip_version) - - self.apply_config() - - def add_vlan(self, dev_info: NetDevInfo, vlan_config: VLANConfig): - new = self.model.new_vlan(dev_info.name, vlan_config) - dev = self.model.get_netdev_by_name(dev_info.name) self.update_link(dev) self.apply_config() - return new.netdev_info() - def delete_link(self, dev_info: NetDevInfo): + def disable_network(self, dev_name: str, ip_version: int) -> None: + dev = self.model.get_netdev_by_name(dev_name) + dev.remove_ip_networks_for_version(ip_version) + self.update_link(dev) + self.apply_config() + + def add_vlan(self, dev_name: str, id: int): + new = self.model.new_vlan(dev_name, id) + self.new_link(new) + dev = self.model.get_netdev_by_name(dev_name) + self.update_link(dev) + self.apply_config() + + def delete_link(self, dev_name: str): + dev = self.model.get_netdev_by_name(dev_name) touched_devices = set() - if dev_info.type == "bond": - for device_name in dev_info.bond.interfaces: + if dev.type == "bond": + for device_name in dev.config['interfaces']: interface = self.model.get_netdev_by_name(device_name) touched_devices.add(interface) - elif dev_info.type == "vlan": - link = self.model.get_netdev_by_name(dev_info.vlan.link) + elif dev.type == "vlan": + link = self.model.get_netdev_by_name(dev.config['link']) touched_devices.add(link) - dev_info.has_config = False - - device = self.model.get_netdev_by_name(dev_info.name) - self.del_link(device) - device.config = None + dev.config = None + self.del_link(dev) for dev in touched_devices: self.update_link(dev) self.apply_config() - def add_or_update_bond(self, existing_name: NetDevInfo, new_name: str, - new_info: BondConfig) -> None: + def add_or_update_bond(self, existing_name: Optional[str], + new_name: str, new_info: BondConfig) -> None: get_netdev_by_name = self.model.get_netdev_by_name touched_devices = set() for device_name in new_info.interfaces: @@ -564,12 +553,12 @@ class NetworkController(BaseController): self.new_link(existing) else: touched_devices.add(existing) - self.apply_config() for dev in touched_devices: self.update_link(dev) + self.apply_config() - def get_info_for_netdev(self, dev_info: NetDevInfo) -> str: - device = self.model.get_netdev_by_name(dev_info.name) + def get_info_for_netdev(self, dev_name: str) -> str: + device = self.model.get_netdev_by_name(dev_name) if device.info is not None: return yaml.dump( device.info.serialize(), default_flow_style=False) @@ -577,14 +566,12 @@ class NetworkController(BaseController): return "Configured but not yet created {type} interface.".format( type=device.type) - def set_wlan(self, dev_info: NetDevInfo, wlan: WLANConfig) -> None: - dev_info.wlan = wlan - - device = self.model.get_netdev_by_name(dev_info.name) + def set_wlan(self, dev_name: str, wlan: WLANConfig) -> None: + device = self.model.get_netdev_by_name(dev_name) device.set_ssid_psk(wlan.ssid, wlan.psk) self.update_link(device) - def start_scan(self, dev_info: NetDevInfo) -> None: - device = self.model.get_netdev_by_name(dev_info.name) + def start_scan(self, dev_name: str) -> None: + device = self.model.get_netdev_by_name(dev_name) self.observer.trigger_scan(device.ifindex) self.update_link(device) diff --git a/subiquitycore/ui/views/network.py b/subiquitycore/ui/views/network.py index 8ac5f7c9..e4024fd1 100644 --- a/subiquitycore/ui/views/network.py +++ b/subiquitycore/ui/views/network.py @@ -282,7 +282,7 @@ class NetworkView(BaseView): def _action_DELETE(self, name, dev_info): with self.controller.context.child(name): - self.controller.delete_link(dev_info) + self.controller.delete_link(dev_info.name) self.del_link(dev_info) def _action(self, sender, action, netdev_table): diff --git a/subiquitycore/ui/views/network_configure_manual_interface.py b/subiquitycore/ui/views/network_configure_manual_interface.py index 2c13edfb..d9b7da4a 100644 --- a/subiquitycore/ui/views/network_configure_manual_interface.py +++ b/subiquitycore/ui/views/network_configure_manual_interface.py @@ -243,15 +243,15 @@ class EditNetworkStretchy(Stretchy): "EditNetworkStretchy %s manual config=%s", self.ip_version, config) self.parent.controller.set_static_config( - self.dev_info, self.ip_version, config) + self.dev_info.name, self.ip_version, config) elif self.method_form.method.value == "dhcp": - self.parent.controller.enable_dhcp(self.dev_info, self.ip_version) + self.parent.controller.enable_dhcp( + self.dev_info.name, self.ip_version) log.debug("EditNetworkStretchy %s, dhcp", self.ip_version) else: self.parent.controller.disable_network( - self.dev_info, self.ip_version) + self.dev_info.name, self.ip_version) log.debug("EditNetworkStretchy %s, disabled", self.ip_version) - self.parent.update_link(self.dev_info) self.parent.remove_overlay() def cancel(self, sender=None): @@ -262,9 +262,9 @@ class VlanForm(Form): ok_label = _("Create") - def __init__(self, parent, dev_info): + def __init__(self, parent, dev_name): self.parent = parent - self.dev_info = dev_info + self.dev_name = dev_name super().__init__() vlan = StringField(_("VLAN ID:")) @@ -280,17 +280,17 @@ class VlanForm(Form): return vlanid def validate_vlan(self): - new_name = '%s.%s' % (self.dev_info.name, self.vlan.value) + new_name = '%s.%s' % (self.dev_name, self.vlan.value) if new_name in self.parent.cur_netdev_names: return _("{netdev} already exists").format(netdev=new_name) class AddVlanStretchy(Stretchy): - def __init__(self, parent, device): + def __init__(self, parent, dev_info): self.parent = parent - self.device = device - self.form = VlanForm(parent, device) + self.dev_name = dev_info.name + self.form = VlanForm(parent, self.dev_name) connect_signal(self.form, 'submit', self.done) connect_signal(self.form, 'cancel', self.cancel) super().__init__( @@ -301,11 +301,10 @@ class AddVlanStretchy(Stretchy): def done(self, sender): log.debug( "AddVlanStretchy.done %s %s", - self.device.name, self.form.vlan.value) + self.dev_name, self.form.vlan.value) + self.parent.controller.add_vlan( + self.dev_name, self.form.vlan.value) self.parent.remove_overlay() - dev_info = self.parent.controller.add_vlan( - self.device, self.form.vlan.value) - self.parent.new_link(dev_info) def cancel(self, sender=None): self.parent.remove_overlay() @@ -315,7 +314,7 @@ class ViewInterfaceInfo(Stretchy): def __init__(self, parent, dev_info): self.parent = parent widgets = [ - Text(self.parent.controller.get_info_for_netdev(dev_info)), + Text(self.parent.controller.get_info_for_netdev(dev_info.name)), Text(""), button_pile([done_btn(_("Close"), on_press=self.close)]), ] diff --git a/subiquitycore/ui/views/tests/test_network_configure_manual_interface.py b/subiquitycore/ui/views/tests/test_network_configure_manual_interface.py index b8e18737..148a9d3f 100644 --- a/subiquitycore/ui/views/tests/test_network_configure_manual_interface.py +++ b/subiquitycore/ui/views/tests/test_network_configure_manual_interface.py @@ -120,7 +120,7 @@ class TestNetworkConfigureIPv4InterfaceView(unittest.TestCase): view_helpers.click(but) view.controller.set_static_config.assert_called_once_with( - stretchy.dev_info, 4, expected) + stretchy.dev_info.name, 4, expected) class FakeLink: