write netplan directly to the target
rather than via curtin and then cloud-init
This commit is contained in:
parent
91a79037a9
commit
cab565304a
|
@ -7,5 +7,5 @@ class ConsoleConfModel:
|
||||||
"""The overall model for console-conf."""
|
"""The overall model for console-conf."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.network = NetworkModel(support_wlan=True)
|
self.network = NetworkModel("console-conf", support_wlan=True)
|
||||||
self.identity = IdentityModel()
|
self.identity = IdentityModel()
|
||||||
|
|
|
@ -77,4 +77,4 @@ class NetworkController(NetworkController, SubiquityController):
|
||||||
super().done()
|
super().done()
|
||||||
|
|
||||||
def make_autoinstall(self):
|
def make_autoinstall(self):
|
||||||
return self.model.render()['network']
|
return self.model.render_config()['network']
|
||||||
|
|
|
@ -94,7 +94,7 @@ class SubiquityModel:
|
||||||
|
|
||||||
self.locale = LocaleModel()
|
self.locale = LocaleModel()
|
||||||
self.keyboard = KeyboardModel(self.root)
|
self.keyboard = KeyboardModel(self.root)
|
||||||
self.network = NetworkModel(support_wlan=False)
|
self.network = NetworkModel("subiquity", support_wlan=False)
|
||||||
self.proxy = ProxyModel()
|
self.proxy = ProxyModel()
|
||||||
self.mirror = MirrorModel()
|
self.mirror = MirrorModel()
|
||||||
self.filesystem = FilesystemModel()
|
self.filesystem = FilesystemModel()
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import unittest
|
import unittest
|
||||||
|
import yaml
|
||||||
|
|
||||||
from subiquity.models.subiquity import SubiquityModel
|
from subiquity.models.subiquity import SubiquityModel
|
||||||
|
|
||||||
|
@ -117,10 +118,18 @@ class TestSubiquityModel(unittest.TestCase):
|
||||||
config = model.render('ident')
|
config = model.render('ident')
|
||||||
self.assertConfigHasVal(config, 'storage.version', 1)
|
self.assertConfigHasVal(config, 'storage.version', 1)
|
||||||
|
|
||||||
def test_network_version(self):
|
def test_write_netplan(self):
|
||||||
model = SubiquityModel('test')
|
model = SubiquityModel('test')
|
||||||
config = model.render('ident')
|
config = model.render('ident')
|
||||||
self.assertConfigHasVal(config, 'network.version', 2)
|
netplan_content = None
|
||||||
|
for fspec in config['write_files'].values():
|
||||||
|
if fspec['path'].startswith('etc/netplan'):
|
||||||
|
if netplan_content is not None:
|
||||||
|
self.fail("writing two files to netplan?")
|
||||||
|
netplan_content = fspec['content']
|
||||||
|
self.assertIsNot(netplan_content, None)
|
||||||
|
netplan = yaml.safe_load(netplan_content)
|
||||||
|
self.assertConfigHasVal(netplan, 'network.version', 2)
|
||||||
|
|
||||||
def test_has_sources(self):
|
def test_has_sources(self):
|
||||||
model = SubiquityModel('test')
|
model = SubiquityModel('test')
|
||||||
|
|
|
@ -331,7 +331,7 @@ class NetworkController(BaseController):
|
||||||
log.info("deleting %s failed with %r", dev.name, cp.stderr)
|
log.info("deleting %s failed with %r", dev.name, cp.stderr)
|
||||||
|
|
||||||
def render_config(self):
|
def render_config(self):
|
||||||
return self.model.render()
|
return self.model.render_config()
|
||||||
|
|
||||||
def _write_config(self):
|
def _write_config(self):
|
||||||
config = self.render_config()
|
config = self.render_config()
|
||||||
|
@ -344,10 +344,10 @@ class NetworkController(BaseController):
|
||||||
continue
|
continue
|
||||||
os.rename(p, p + ".dist-" + self.opts.project)
|
os.rename(p, p + ".dist-" + self.opts.project)
|
||||||
|
|
||||||
write_file(self.netplan_path, '\n'.join((
|
write_file(
|
||||||
("# This is the network config written by '%s'" %
|
self.netplan_path,
|
||||||
self.opts.project),
|
self.model.stringify_config(config),
|
||||||
yaml.dump(config, default_flow_style=False))), omode="w")
|
omode="w")
|
||||||
|
|
||||||
self.model.parse_netplan_configs(self.root)
|
self.model.parse_netplan_configs(self.root)
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import copy
|
||||||
import enum
|
import enum
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import logging
|
import logging
|
||||||
|
import yaml
|
||||||
from socket import AF_INET, AF_INET6
|
from socket import AF_INET, AF_INET6
|
||||||
|
|
||||||
from subiquitycore import netplan
|
from subiquitycore import netplan
|
||||||
|
@ -253,10 +254,11 @@ class NetworkDev(object):
|
||||||
class NetworkModel(object):
|
class NetworkModel(object):
|
||||||
""" """
|
""" """
|
||||||
|
|
||||||
def __init__(self, support_wlan=True):
|
def __init__(self, project, support_wlan=True):
|
||||||
self.support_wlan = support_wlan
|
self.support_wlan = support_wlan
|
||||||
self.devices_by_name = {} # Maps interface names to NetworkDev
|
self.devices_by_name = {} # Maps interface names to NetworkDev
|
||||||
self.has_network = False
|
self.has_network = False
|
||||||
|
self.project = project
|
||||||
|
|
||||||
def parse_netplan_configs(self, netplan_root):
|
def parse_netplan_configs(self, netplan_root):
|
||||||
self.config = netplan.Config()
|
self.config = netplan.Config()
|
||||||
|
@ -350,7 +352,14 @@ class NetworkModel(object):
|
||||||
def get_netdev_by_name(self, name):
|
def get_netdev_by_name(self, name):
|
||||||
return self.devices_by_name[name]
|
return self.devices_by_name[name]
|
||||||
|
|
||||||
def render(self):
|
def stringify_config(self, config):
|
||||||
|
return '\n'.join([
|
||||||
|
"# This is the network config written by '{}'".format(
|
||||||
|
self.project),
|
||||||
|
yaml.dump(config, default_flow_style=False),
|
||||||
|
])
|
||||||
|
|
||||||
|
def render_config(self):
|
||||||
config = {
|
config = {
|
||||||
'network': {
|
'network': {
|
||||||
'version': 2,
|
'version': 2,
|
||||||
|
@ -369,3 +378,18 @@ class NetworkModel(object):
|
||||||
configs[dev.name] = dev.config
|
configs[dev.name] = dev.config
|
||||||
|
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
return {
|
||||||
|
'write_files': {
|
||||||
|
'etc_netplan_installer': {
|
||||||
|
'path': 'etc/netplan/00-installer-config.yaml',
|
||||||
|
'content': self.stringify_config(self.render_config()),
|
||||||
|
},
|
||||||
|
'nonet': {
|
||||||
|
'path': ('etc/cloud/cloud.cfg.d/'
|
||||||
|
'subiquity-disable-cloudinit-networking.cfg'),
|
||||||
|
'content': 'network: {config: disabled}\n',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue