summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorThomas Berger <loki@lokis-chaos.de>2018-09-18 07:16:40 +0000
committerServer Team CI Bot <josh.powers+server-team-bot@canonical.com>2018-09-18 07:16:40 +0000
commit98d18c31c8759add858096dea53bc093c7cc9caa (patch)
treeed4403e191ebbde628007c6f88d984a0dfa6481e /cloudinit
parentc714651c1988a17f457426de63cdb8514d5a81b4 (diff)
downloadvyos-cloud-init-98d18c31c8759add858096dea53bc093c7cc9caa.tar.gz
vyos-cloud-init-98d18c31c8759add858096dea53bc093c7cc9caa.zip
net_util: ensure static configs have netmask in translate_network result
If a DataSource provides a network configuration in version 2 and runs on a distro which does not have a network renderer class in use, then the conversion of V2 to eni results in static ip configurations with subnet prefix-length (192.168.23.1/24) rather than explicit netmask value. When sending such a config to net_util.translate_network the resulting dictionary is missing the 'netmask' key for static configured addresses breaking network configurations on multiple distributions. This patch detects static ip configurations using prefix-length and converts the format into the previous 'address' and 'netmask' parts to keep compatibility for these distribtuions until they move to the v2 network configuration. LP: #1792454
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/distros/net_util.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/cloudinit/distros/net_util.py b/cloudinit/distros/net_util.py
index 1ce1aa71..edfcd99d 100644
--- a/cloudinit/distros/net_util.py
+++ b/cloudinit/distros/net_util.py
@@ -67,6 +67,10 @@
# }
# }
+from cloudinit.net.network_state import (
+ net_prefix_to_ipv4_mask, mask_and_ipv4_to_bcast_addr)
+
+
def translate_network(settings):
# Get the standard cmd, args from the ubuntu format
entries = []
@@ -134,6 +138,21 @@ def translate_network(settings):
val = info[k].strip().lower()
if val:
iface_info[k] = val
+ # handle static ip configurations using
+ # ipaddress/prefix-length format
+ if 'address' in iface_info:
+ if 'netmask' not in iface_info:
+ # check if the address has a network prefix
+ addr, _, prefix = iface_info['address'].partition('/')
+ if prefix:
+ iface_info['netmask'] = (
+ net_prefix_to_ipv4_mask(prefix))
+ iface_info['address'] = addr
+ # if we set the netmask, we also can set the broadcast
+ iface_info['broadcast'] = (
+ mask_and_ipv4_to_bcast_addr(
+ iface_info['netmask'], addr))
+
# Name server info provided??
if 'dns-nameservers' in info:
iface_info['dns-nameservers'] = info['dns-nameservers'].split()