7388b52
Index: cloud-init-0.7.9/cloudinit/net/sysconfig.py
7388b52
===================================================================
7388b52
--- cloud-init-0.7.9.orig/cloudinit/net/sysconfig.py
7388b52
+++ cloud-init-0.7.9/cloudinit/net/sysconfig.py
7388b52
@@ -87,7 +87,8 @@ class Route(ConfigMap):
7388b52
     def __init__(self, route_name, base_sysconf_dir):
7388b52
         super(Route, self).__init__()
7388b52
         self.last_idx = 1
7388b52
-        self.has_set_default = False
7388b52
+        self.has_set_default_ipv4 = False
7388b52
+        self.has_set_default_ipv6 = False
7388b52
         self._route_name = route_name
7388b52
         self._base_sysconf_dir = base_sysconf_dir
7388b52
 
7388b52
@@ -95,7 +96,8 @@ class Route(ConfigMap):
7388b52
         r = Route(self._route_name, self._base_sysconf_dir)
7388b52
         r._conf = self._conf.copy()
7388b52
         r.last_idx = self.last_idx
7388b52
-        r.has_set_default = self.has_set_default
7388b52
+        r.has_set_default_ipv4 = self.has_set_default_ipv4
7388b52
+        r.has_set_default_ipv6 = self.has_set_default_ipv6
7388b52
         return r
7388b52
 
7388b52
     @property
7388b52
@@ -119,10 +121,10 @@ class NetInterface(ConfigMap):
7388b52
         super(NetInterface, self).__init__()
7388b52
         self.children = []
7388b52
         self.routes = Route(iface_name, base_sysconf_dir)
7388b52
-        self._kind = kind
7388b52
+        self.kind = kind
7388b52
+
7388b52
         self._iface_name = iface_name
7388b52
         self._conf['DEVICE'] = iface_name
7388b52
-        self._conf['TYPE'] = self.iface_types[kind]
7388b52
         self._base_sysconf_dir = base_sysconf_dir
7388b52
 
7388b52
     @property
7388b52
@@ -140,6 +142,8 @@ class NetInterface(ConfigMap):
7388b52
 
7388b52
     @kind.setter
7388b52
     def kind(self, kind):
7388b52
+        if kind not in self.iface_types:
7388b52
+            raise ValueError(kind)
7388b52
         self._kind = kind
7388b52
         self._conf['TYPE'] = self.iface_types[kind]
7388b52
 
7388b52
@@ -172,7 +176,7 @@ class Renderer(renderer.Renderer):
7388b52
         ('BOOTPROTO', 'none'),
7388b52
     ])
7388b52
 
7388b52
-    # If these keys exist, then there values will be used to form
7388b52
+    # If these keys exist, then their values will be used to form
7388b52
     # a BONDING_OPTS grouping; otherwise no grouping will be set.
7388b52
     bond_tpl_opts = tuple([
7388b52
         ('bond_mode', "mode=%s"),
7388b52
@@ -198,6 +202,7 @@ class Renderer(renderer.Renderer):
7388b52
     def _render_iface_shared(cls, iface, iface_cfg):
7388b52
         for k, v in cls.iface_defaults:
7388b52
             iface_cfg[k] = v
7388b52
+
7388b52
         for (old_key, new_key) in [('mac_address', 'HWADDR'), ('mtu', 'MTU')]:
7388b52
             old_value = iface.get(old_key)
7388b52
             if old_value is not None:
7388b52
@@ -226,10 +231,20 @@ class Renderer(renderer.Renderer):
7388b52
         if 'netmask' in subnet:
7388b52
             iface_cfg['NETMASK'] = subnet['netmask']
7388b52
         for route in subnet.get('routes', []):
7388b52
+            if subnet.get('ipv6'):
7388b52
+                gw_cfg = 'IPV6_DEFAULTGW'
7388b52
+            else:
7388b52
+                gw_cfg = 'GATEWAY'
7388b52
+
7388b52
             if _is_default_route(route):
7388b52
-                if route_cfg.has_set_default:
7388b52
-                    raise ValueError("Duplicate declaration of default"
7388b52
-                                     " route found for interface '%s'"
7388b52
+                if (
7388b52
+                        (subnet.get('ipv4') and
7388b52
+                         route_cfg.has_set_default_ipv4) or
7388b52
+                        (subnet.get('ipv6') and
7388b52
+                         route_cfg.has_set_default_ipv6)
7388b52
+                ):
7388b52
+                    raise ValueError("Duplicate declaration of default "
7388b52
+                                     "route found for interface '%s'"
7388b52
                                      % (iface_cfg.name))
7388b52
                 # NOTE(harlowja): ipv6 and ipv4 default gateways
7388b52
                 gw_key = 'GATEWAY0'
7388b52
@@ -241,7 +256,7 @@ class Renderer(renderer.Renderer):
7388b52
                 # also provided the default route?
7388b52
                 iface_cfg['DEFROUTE'] = True
7388b52
                 if 'gateway' in route:
7388b52
-                    iface_cfg['GATEWAY'] = route['gateway']
7388b52
+                    iface_cfg[gw_cfg] = route['gateway']
7388b52
                 route_cfg.has_set_default = True
7388b52
             else:
7388b52
                 gw_key = 'GATEWAY%s' % route_cfg.last_idx
7388b52
Index: cloud-init-0.7.9/tests/unittests/test_net.py
7388b52
===================================================================
7388b52
--- cloud-init-0.7.9.orig/tests/unittests/test_net.py
7388b52
+++ cloud-init-0.7.9/tests/unittests/test_net.py
7388b52
@@ -165,6 +165,100 @@ nameserver 172.19.0.12
7388b52
             ('etc/udev/rules.d/70-persistent-net.rules',
7388b52
              "".join(['SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ',
7388b52
                       'ATTR{address}=="fa:16:3e:ed:9a:59", NAME="eth0"\n']))]
7388b52
+    },
7388b52
+    {
7388b52
+        'in_data': {
7388b52
+            "services": [{"type": "dns", "address": "172.19.0.12"}],
7388b52
+            "networks": [{
7388b52
+                "network_id": "public-ipv4",
7388b52
+                "type": "ipv4", "netmask": "255.255.252.0",
7388b52
+                "link": "tap1a81968a-79",
7388b52
+                "routes": [{
7388b52
+                    "netmask": "0.0.0.0",
7388b52
+                    "network": "0.0.0.0",
7388b52
+                    "gateway": "172.19.3.254",
7388b52
+                }],
7388b52
+                "ip_address": "172.19.1.34", "id": "network0"
7388b52
+            }, {
7388b52
+                "network_id": "public-ipv6",
7388b52
+                "type": "ipv6", "netmask": "",
7388b52
+                "link": "tap1a81968a-79",
7388b52
+                "routes": [
7388b52
+                    {
7388b52
+                        "gateway": "2001:DB8::1",
7388b52
+                        "netmask": "::",
7388b52
+                        "network": "::"
7388b52
+                    }
7388b52
+                ],
7388b52
+                "ip_address": "2001:DB8::10", "id": "network1"
7388b52
+            }],
7388b52
+            "links": [
7388b52
+                {
7388b52
+                    "ethernet_mac_address": "fa:16:3e:ed:9a:59",
7388b52
+                    "mtu": None, "type": "bridge", "id":
7388b52
+                    "tap1a81968a-79",
7388b52
+                    "vif_id": "1a81968a-797a-400f-8a80-567f997eb93f"
7388b52
+                },
7388b52
+            ],
7388b52
+        },
7388b52
+        'in_macs': {
7388b52
+            'fa:16:3e:ed:9a:59': 'eth0',
7388b52
+        },
7388b52
+        'out_sysconfig': [
7388b52
+            ('etc/sysconfig/network-scripts/ifcfg-eth0',
7388b52
+             """
7388b52
+# Created by cloud-init on instance boot automatically, do not edit.
7388b52
+#
7388b52
+BOOTPROTO=none
7388b52
+DEVICE=eth0
7388b52
+HWADDR=fa:16:3e:ed:9a:59
7388b52
+NM_CONTROLLED=no
7388b52
+ONBOOT=yes
7388b52
+TYPE=Ethernet
7388b52
+USERCTL=no
7388b52
+""".lstrip()),
7388b52
+            ('etc/sysconfig/network-scripts/ifcfg-eth0:0',
7388b52
+             """
7388b52
+# Created by cloud-init on instance boot automatically, do not edit.
7388b52
+#
7388b52
+BOOTPROTO=static
7388b52
+DEFROUTE=yes
7388b52
+DEVICE=eth0:0
7388b52
+GATEWAY=172.19.3.254
7388b52
+HWADDR=fa:16:3e:ed:9a:59
7388b52
+IPADDR=172.19.1.34
7388b52
+NETMASK=255.255.252.0
7388b52
+NM_CONTROLLED=no
7388b52
+ONBOOT=yes
7388b52
+TYPE=Ethernet
7388b52
+USERCTL=no
7388b52
+""".lstrip()),
7388b52
+            ('etc/sysconfig/network-scripts/ifcfg-eth0:1',
7388b52
+             """
7388b52
+# Created by cloud-init on instance boot automatically, do not edit.
7388b52
+#
7388b52
+BOOTPROTO=static
7388b52
+DEFROUTE=yes
7388b52
+DEVICE=eth0:1
7388b52
+HWADDR=fa:16:3e:ed:9a:59
7388b52
+IPV6ADDR=2001:DB8::10
7388b52
+IPV6INIT=yes
7388b52
+IPV6_DEFAULTGW=2001:DB8::1
7388b52
+NETMASK=
7388b52
+NM_CONTROLLED=no
7388b52
+ONBOOT=yes
7388b52
+TYPE=Ethernet
7388b52
+USERCTL=no
7388b52
+""".lstrip()),
7388b52
+            ('etc/resolv.conf',
7388b52
+             """
7388b52
+; Created by cloud-init on instance boot automatically, do not edit.
7388b52
+;
7388b52
+nameserver 172.19.0.12
7388b52
+""".lstrip()),
7388b52
+            ('etc/udev/rules.d/70-persistent-net.rules',
7388b52
+             "".join(['SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ',
7388b52
+                      'ATTR{address}=="fa:16:3e:ed:9a:59", NAME="eth0"\n']))]
7388b52
     }
7388b52
 ]
7388b52