Merge pull request #670 from mwhudson/no-cloud-init-networking

write netplan directly to the target
This commit is contained in:
Dimitri John Ledkov 2020-04-01 18:22:33 +01:00 committed by GitHub
commit 653434168c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 12 deletions

View File

@ -7,5 +7,5 @@ class ConsoleConfModel:
"""The overall model for console-conf."""
def __init__(self):
self.network = NetworkModel(support_wlan=True)
self.network = NetworkModel("console-conf", support_wlan=True)
self.identity = IdentityModel()

View File

@ -79,4 +79,4 @@ class NetworkController(NetworkController, SubiquityController):
super().done()
def make_autoinstall(self):
return self.model.render()['network']
return self.model.render_config()['network']

View File

@ -94,7 +94,7 @@ class SubiquityModel:
self.locale = LocaleModel()
self.keyboard = KeyboardModel(self.root)
self.network = NetworkModel(support_wlan=False)
self.network = NetworkModel("subiquity", support_wlan=False)
self.proxy = ProxyModel()
self.mirror = MirrorModel()
self.filesystem = FilesystemModel()

View File

@ -15,6 +15,7 @@
import fnmatch
import unittest
import yaml
from subiquity.models.subiquity import SubiquityModel
@ -117,10 +118,18 @@ class TestSubiquityModel(unittest.TestCase):
config = model.render('ident')
self.assertConfigHasVal(config, 'storage.version', 1)
def test_network_version(self):
def test_write_netplan(self):
model = SubiquityModel('test')
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):
model = SubiquityModel('test')

View File

@ -331,7 +331,7 @@ class NetworkController(BaseController):
log.info("deleting %s failed with %r", dev.name, cp.stderr)
def render_config(self):
return self.model.render()
return self.model.render_config()
def _write_config(self):
config = self.render_config()
@ -344,10 +344,10 @@ class NetworkController(BaseController):
continue
os.rename(p, p + ".dist-" + self.opts.project)
write_file(self.netplan_path, '\n'.join((
("# This is the network config written by '%s'" %
self.opts.project),
yaml.dump(config, default_flow_style=False))), omode="w")
write_file(
self.netplan_path,
self.model.stringify_config(config),
omode="w")
self.model.parse_netplan_configs(self.root)

View File

@ -17,6 +17,7 @@ import copy
import enum
import ipaddress
import logging
import yaml
from socket import AF_INET, AF_INET6
from subiquitycore import netplan
@ -253,10 +254,11 @@ class NetworkDev(object):
class NetworkModel(object):
""" """
def __init__(self, support_wlan=True):
def __init__(self, project, support_wlan=True):
self.support_wlan = support_wlan
self.devices_by_name = {} # Maps interface names to NetworkDev
self.has_network = False
self.project = project
def parse_netplan_configs(self, netplan_root):
self.config = netplan.Config()
@ -350,7 +352,14 @@ class NetworkModel(object):
def get_netdev_by_name(self, 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 = {
'network': {
'version': 2,
@ -369,3 +378,18 @@ class NetworkModel(object):
configs[dev.name] = dev.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',
},
},
}