summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Kellogg-Stedman <lars@redhat.com>2017-03-02 11:08:26 -0500
committerScott Moser <smoser@brickies.net>2017-03-07 13:14:09 -0500
commit1d751a6f46f044e3c3827f3cef0e4a2e71d50fe7 (patch)
tree8bf362ee3ec12ef6fcd19f870730d2390836cbe0
parent657fd40f9ee692a817ec4614cd0d6cb0539ffabf (diff)
downloadvyos-cloud-init-1d751a6f46f044e3c3827f3cef0e4a2e71d50fe7.tar.gz
vyos-cloud-init-1d751a6f46f044e3c3827f3cef0e4a2e71d50fe7.zip
net: support both ipv4 and ipv6 gateways in sysconfig.
Previously, cloud-init would throw an exception if an interface had both ipv4 and ipv6 addresses and a default gateway for each address family. This change allows cloud-init to correctly configure interfaces in this situation. LP: #1669504
-rw-r--r--cloudinit/net/sysconfig.py33
-rw-r--r--tests/unittests/test_net.py94
2 files changed, 118 insertions, 9 deletions
diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
index 6e7739fb..06de660f 100644
--- a/cloudinit/net/sysconfig.py
+++ b/cloudinit/net/sysconfig.py
@@ -87,7 +87,8 @@ class Route(ConfigMap):
def __init__(self, route_name, base_sysconf_dir):
super(Route, self).__init__()
self.last_idx = 1
- self.has_set_default = False
+ self.has_set_default_ipv4 = False
+ self.has_set_default_ipv6 = False
self._route_name = route_name
self._base_sysconf_dir = base_sysconf_dir
@@ -95,7 +96,8 @@ class Route(ConfigMap):
r = Route(self._route_name, self._base_sysconf_dir)
r._conf = self._conf.copy()
r.last_idx = self.last_idx
- r.has_set_default = self.has_set_default
+ r.has_set_default_ipv4 = self.has_set_default_ipv4
+ r.has_set_default_ipv6 = self.has_set_default_ipv6
return r
@property
@@ -119,10 +121,10 @@ class NetInterface(ConfigMap):
super(NetInterface, self).__init__()
self.children = []
self.routes = Route(iface_name, base_sysconf_dir)
- self._kind = kind
+ self.kind = kind
+
self._iface_name = iface_name
self._conf['DEVICE'] = iface_name
- self._conf['TYPE'] = self.iface_types[kind]
self._base_sysconf_dir = base_sysconf_dir
@property
@@ -140,6 +142,8 @@ class NetInterface(ConfigMap):
@kind.setter
def kind(self, kind):
+ if kind not in self.iface_types:
+ raise ValueError(kind)
self._kind = kind
self._conf['TYPE'] = self.iface_types[kind]
@@ -173,7 +177,7 @@ class Renderer(renderer.Renderer):
('BOOTPROTO', 'none'),
])
- # If these keys exist, then there values will be used to form
+ # If these keys exist, then their values will be used to form
# a BONDING_OPTS grouping; otherwise no grouping will be set.
bond_tpl_opts = tuple([
('bond_mode', "mode=%s"),
@@ -199,6 +203,7 @@ class Renderer(renderer.Renderer):
def _render_iface_shared(cls, iface, iface_cfg):
for k, v in cls.iface_defaults:
iface_cfg[k] = v
+
for (old_key, new_key) in [('mac_address', 'HWADDR'), ('mtu', 'MTU')]:
old_value = iface.get(old_key)
if old_value is not None:
@@ -227,10 +232,20 @@ class Renderer(renderer.Renderer):
if 'netmask' in subnet:
iface_cfg['NETMASK'] = subnet['netmask']
for route in subnet.get('routes', []):
+ if subnet.get('ipv6'):
+ gw_cfg = 'IPV6_DEFAULTGW'
+ else:
+ gw_cfg = 'GATEWAY'
+
if _is_default_route(route):
- if route_cfg.has_set_default:
- raise ValueError("Duplicate declaration of default"
- " route found for interface '%s'"
+ if (
+ (subnet.get('ipv4') and
+ route_cfg.has_set_default_ipv4) or
+ (subnet.get('ipv6') and
+ route_cfg.has_set_default_ipv6)
+ ):
+ raise ValueError("Duplicate declaration of default "
+ "route found for interface '%s'"
% (iface_cfg.name))
# NOTE(harlowja): ipv6 and ipv4 default gateways
gw_key = 'GATEWAY0'
@@ -242,7 +257,7 @@ class Renderer(renderer.Renderer):
# also provided the default route?
iface_cfg['DEFROUTE'] = True
if 'gateway' in route:
- iface_cfg['GATEWAY'] = route['gateway']
+ iface_cfg[gw_cfg] = route['gateway']
route_cfg.has_set_default = True
else:
gw_key = 'GATEWAY%s' % route_cfg.last_idx
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
index 4b03ff72..8d253109 100644
--- a/tests/unittests/test_net.py
+++ b/tests/unittests/test_net.py
@@ -248,6 +248,100 @@ nameserver 172.19.0.12
('etc/udev/rules.d/70-persistent-net.rules',
"".join(['SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ',
'ATTR{address}=="fa:16:3e:ed:9a:59", NAME="eth0"\n']))]
+ },
+ {
+ 'in_data': {
+ "services": [{"type": "dns", "address": "172.19.0.12"}],
+ "networks": [{
+ "network_id": "public-ipv4",
+ "type": "ipv4", "netmask": "255.255.252.0",
+ "link": "tap1a81968a-79",
+ "routes": [{
+ "netmask": "0.0.0.0",
+ "network": "0.0.0.0",
+ "gateway": "172.19.3.254",
+ }],
+ "ip_address": "172.19.1.34", "id": "network0"
+ }, {
+ "network_id": "public-ipv6",
+ "type": "ipv6", "netmask": "",
+ "link": "tap1a81968a-79",
+ "routes": [
+ {
+ "gateway": "2001:DB8::1",
+ "netmask": "::",
+ "network": "::"
+ }
+ ],
+ "ip_address": "2001:DB8::10", "id": "network1"
+ }],
+ "links": [
+ {
+ "ethernet_mac_address": "fa:16:3e:ed:9a:59",
+ "mtu": None, "type": "bridge", "id":
+ "tap1a81968a-79",
+ "vif_id": "1a81968a-797a-400f-8a80-567f997eb93f"
+ },
+ ],
+ },
+ 'in_macs': {
+ 'fa:16:3e:ed:9a:59': 'eth0',
+ },
+ 'out_sysconfig': [
+ ('etc/sysconfig/network-scripts/ifcfg-eth0',
+ """
+# Created by cloud-init on instance boot automatically, do not edit.
+#
+BOOTPROTO=none
+DEVICE=eth0
+HWADDR=fa:16:3e:ed:9a:59
+NM_CONTROLLED=no
+ONBOOT=yes
+TYPE=Ethernet
+USERCTL=no
+""".lstrip()),
+ ('etc/sysconfig/network-scripts/ifcfg-eth0:0',
+ """
+# Created by cloud-init on instance boot automatically, do not edit.
+#
+BOOTPROTO=static
+DEFROUTE=yes
+DEVICE=eth0:0
+GATEWAY=172.19.3.254
+HWADDR=fa:16:3e:ed:9a:59
+IPADDR=172.19.1.34
+NETMASK=255.255.252.0
+NM_CONTROLLED=no
+ONBOOT=yes
+TYPE=Ethernet
+USERCTL=no
+""".lstrip()),
+ ('etc/sysconfig/network-scripts/ifcfg-eth0:1',
+ """
+# Created by cloud-init on instance boot automatically, do not edit.
+#
+BOOTPROTO=static
+DEFROUTE=yes
+DEVICE=eth0:1
+HWADDR=fa:16:3e:ed:9a:59
+IPV6ADDR=2001:DB8::10
+IPV6INIT=yes
+IPV6_DEFAULTGW=2001:DB8::1
+NETMASK=
+NM_CONTROLLED=no
+ONBOOT=yes
+TYPE=Ethernet
+USERCTL=no
+""".lstrip()),
+ ('etc/resolv.conf',
+ """
+; Created by cloud-init on instance boot automatically, do not edit.
+;
+nameserver 172.19.0.12
+""".lstrip()),
+ ('etc/udev/rules.d/70-persistent-net.rules',
+ "".join(['SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ',
+ 'ATTR{address}=="fa:16:3e:ed:9a:59", NAME="eth0"\n']))]
}
]