convert controller api methods to take strings and trigger updates for affected nics

this is going to work better in the client/server world
This commit is contained in:
Michael Hudson-Doyle 2020-09-03 22:52:31 +12:00
parent 04426cec15
commit f4066d97d7
4 changed files with 52 additions and 66 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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)]),
]

View File

@ -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: