summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorRyan Harper <ryan.harper@canonical.com>2018-03-22 09:55:27 -0600
committerChad Smith <chad.smith@canonical.com>2018-03-22 09:55:27 -0600
commitd29eeccd2c422b8eb3b053fc13ca966ed6d74c78 (patch)
treeaf52710488c97a06114c6f3f65d8a3ea724e1110 /cloudinit
parent7713713265224d9f34410028de6bd50d1451aed9 (diff)
downloadvyos-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.py25
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):