diff options
author | Ryan Harper <ryan.harper@canonical.com> | 2018-03-22 09:55:27 -0600 |
---|---|---|
committer | Chad Smith <chad.smith@canonical.com> | 2018-03-22 09:55:27 -0600 |
commit | d29eeccd2c422b8eb3b053fc13ca966ed6d74c78 (patch) | |
tree | af52710488c97a06114c6f3f65d8a3ea724e1110 /cloudinit | |
parent | 7713713265224d9f34410028de6bd50d1451aed9 (diff) | |
download | vyos-cloud-init-d29eeccd2c422b8eb3b053fc13ca966ed6d74c78.tar.gz vyos-cloud-init-d29eeccd2c422b8eb3b053fc13ca966ed6d74c78.zip |
Handle global dns entries in netplan
In network config v1 format, there are dns values which are not bound to a
specific interface and do not map to the per-interface format in netplan.
To handle this case we render netplan configuration that duplicates the
DNS configuration on any interface that has a static network config. We
avoiding interfaces which have DHCP configuration which may provide
conflicting DNS values.
LP: #1750884
Diffstat (limited to 'cloudinit')
-rw-r--r-- | cloudinit/net/netplan.py | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/cloudinit/net/netplan.py b/cloudinit/net/netplan.py index 6bee3d37..63443484 100644 --- a/cloudinit/net/netplan.py +++ b/cloudinit/net/netplan.py @@ -336,22 +336,15 @@ class Renderer(renderer.Renderer): _extract_addresses(ifcfg, vlan) vlans.update({ifname: vlan}) - # inject global nameserver values under each physical interface - if nameservers: - for _eth, cfg in ethernets.items(): - nscfg = cfg.get('nameservers', {}) - addresses = nscfg.get('addresses', []) - addresses += nameservers - nscfg.update({'addresses': addresses}) - cfg.update({'nameservers': nscfg}) - - if searchdomains: - for _eth, cfg in ethernets.items(): - nscfg = cfg.get('nameservers', {}) - search = nscfg.get('search', []) - search += searchdomains - nscfg.update({'search': search}) - cfg.update({'nameservers': nscfg}) + # inject global nameserver values under each all interface which + # has addresses and do not already have a DNS configuration + if nameservers or searchdomains: + nscfg = {'addresses': nameservers, 'search': searchdomains} + for section in [ethernets, wifis, bonds, bridges, vlans]: + for _name, cfg in section.items(): + if 'nameservers' in cfg or 'addresses' not in cfg: + continue + cfg.update({'nameservers': nscfg}) # workaround yaml dictionary key sorting when dumping def _render_section(name, section): |