diff options
-rw-r--r-- | cloudinit/net/bsd.py | 66 | ||||
-rw-r--r-- | cloudinit/net/freebsd.py | 23 | ||||
-rw-r--r-- | tests/unittests/distros/test_netconfig.py | 25 | ||||
-rw-r--r-- | tests/unittests/test_net_freebsd.py | 12 | ||||
-rw-r--r-- | tools/.github-cla-signers | 1 |
5 files changed, 109 insertions, 18 deletions
diff --git a/cloudinit/net/bsd.py b/cloudinit/net/bsd.py index e8778d27..b23279e5 100644 --- a/cloudinit/net/bsd.py +++ b/cloudinit/net/bsd.py @@ -30,6 +30,7 @@ class BSDRenderer(renderer.Renderer): config = {} self.target = None self.interface_configurations = {} + self.interface_configurations_ipv6 = {} self._postcmds = config.get("postcmds", True) def _ifconfig_entries(self, settings): @@ -62,8 +63,6 @@ class BSDRenderer(renderer.Renderer): LOG.info("Configuring interface %s", device_name) - self.interface_configurations[device_name] = "DHCP" - for subnet in interface.get("subnets", []): if subnet.get("type") == "static": if not subnet.get("netmask"): @@ -85,29 +84,70 @@ class BSDRenderer(renderer.Renderer): "mtu": subnet.get("mtu") or interface.get("mtu"), } + elif subnet.get("type") == "static6": + if not subnet.get("prefix"): + LOG.debug( + "Skipping IP %s, because there is no prefix", + subnet.get("address"), + ) + continue + LOG.debug( + "Configuring dev %s with %s / %s", + device_name, + subnet.get("address"), + subnet.get("prefix"), + ) + + self.interface_configurations_ipv6[device_name] = { + "address": subnet.get("address"), + "prefix": subnet.get("prefix"), + "mtu": subnet.get("mtu") or interface.get("mtu"), + } + elif ( + subnet.get("type") == "dhcp" + or subnet.get("type") == "dhcp4" + ): + self.interface_configurations[device_name] = "DHCP" + def _route_entries(self, settings): routes = list(settings.iter_routes()) for interface in settings.iter_interfaces(): subnets = interface.get("subnets", []) for subnet in subnets: - if subnet.get("type") != "static": + if subnet.get("type") == "static": + gateway = subnet.get("gateway") + if gateway and len(gateway.split(".")) == 4: + routes.append( + { + "network": "0.0.0.0", + "netmask": "0.0.0.0", + "gateway": gateway, + } + ) + elif subnet.get("type") == "static6": + gateway = subnet.get("gateway") + if gateway and len(gateway.split(":")) > 1: + routes.append( + { + "network": "::", + "prefix": "0", + "gateway": gateway, + } + ) + else: continue - gateway = subnet.get("gateway") - if gateway and len(gateway.split(".")) == 4: - routes.append( - { - "network": "0.0.0.0", - "netmask": "0.0.0.0", - "gateway": gateway, - } - ) routes += subnet.get("routes", []) + for route in routes: network = route.get("network") if not network: LOG.debug("Skipping a bad route entry") continue - netmask = route.get("netmask") + netmask = ( + route.get("netmask") + if route.get("netmask") + else route.get("prefix") + ) gateway = route.get("gateway") self.set_route(network, netmask, gateway) diff --git a/cloudinit/net/freebsd.py b/cloudinit/net/freebsd.py index ec42b60c..415f4a5a 100644 --- a/cloudinit/net/freebsd.py +++ b/cloudinit/net/freebsd.py @@ -17,14 +17,31 @@ class Renderer(cloudinit.net.bsd.BSDRenderer): def write_config(self): for device_name, v in self.interface_configurations.items(): - net_config = "DHCP" if isinstance(v, dict): - net_config = v.get("address") + " netmask " + v.get("netmask") + net_config = "inet %s netmask %s" % ( + v.get("address"), + v.get("netmask"), + ) mtu = v.get("mtu") if mtu: net_config += " mtu %d" % mtu + elif v == "DHCP": + net_config = "DHCP" self.set_rc_config_value("ifconfig_" + device_name, net_config) + for device_name, v in self.interface_configurations_ipv6.items(): + if isinstance(v, dict): + net_config = "inet6 %s/%d" % ( + v.get("address"), + v.get("prefix"), + ) + mtu = v.get("mtu") + if mtu: + net_config += " mtu %d" % mtu + self.set_rc_config_value( + "ifconfig_%s_ipv6" % device_name, net_config + ) + def start_services(self, run=False): if not run: LOG.debug("freebsd generate postcmd disabled") @@ -58,6 +75,8 @@ class Renderer(cloudinit.net.bsd.BSDRenderer): def set_route(self, network, netmask, gateway): if network == "0.0.0.0": self.set_rc_config_value("defaultrouter", gateway) + elif network == "::": + self.set_rc_config_value("ipv6_defaultrouter", gateway) else: route_name = "route_net%d" % self._route_cpt route_cmd = "-route %s/%s %s" % (network, netmask, gateway) diff --git a/tests/unittests/distros/test_netconfig.py b/tests/unittests/distros/test_netconfig.py index e2694b09..236cc09f 100644 --- a/tests/unittests/distros/test_netconfig.py +++ b/tests/unittests/distros/test_netconfig.py @@ -363,7 +363,7 @@ class TestNetCfgDistroFreeBSD(TestNetCfgDistroBase): } rc_conf_expected = """\ defaultrouter=192.168.1.254 -ifconfig_eth0='192.168.1.5 netmask 255.255.255.0' +ifconfig_eth0='inet 192.168.1.5 netmask 255.255.255.0' ifconfig_eth1=DHCP """ @@ -378,6 +378,27 @@ ifconfig_eth1=DHCP ) @mock.patch("cloudinit.net.get_interfaces_by_mac") + def test_apply_network_config_freebsd_ipv6_standard(self, ifaces_mac): + ifaces_mac.return_value = { + "00:15:5d:4c:73:00": "eth0", + } + rc_conf_expected = """\ +ipv6_defaultrouter=2607:f0d0:1002:0011::1 +ifconfig_eth1=DHCP +ifconfig_eth0_ipv6='inet6 2607:f0d0:1002:0011::2/64' +""" + + expected_cfgs = { + "/etc/rc.conf": rc_conf_expected, + "/etc/resolv.conf": "", + } + self._apply_and_verify_freebsd( + self.distro.apply_network_config, + V1_NET_CFG_IPV6, + expected_cfgs=expected_cfgs.copy(), + ) + + @mock.patch("cloudinit.net.get_interfaces_by_mac") def test_apply_network_config_freebsd_ifrename(self, ifaces_mac): ifaces_mac.return_value = { "00:15:5d:4c:73:00": "vtnet0", @@ -385,7 +406,7 @@ ifconfig_eth1=DHCP rc_conf_expected = """\ ifconfig_vtnet0_name=eth0 defaultrouter=192.168.1.254 -ifconfig_eth0='192.168.1.5 netmask 255.255.255.0' +ifconfig_eth0='inet 192.168.1.5 netmask 255.255.255.0' ifconfig_eth1=DHCP """ diff --git a/tests/unittests/test_net_freebsd.py b/tests/unittests/test_net_freebsd.py index 1288c259..4121e404 100644 --- a/tests/unittests/test_net_freebsd.py +++ b/tests/unittests/test_net_freebsd.py @@ -16,6 +16,14 @@ config: - address: 172.20.80.129/25 type: static type: physical +- id: eno2 + mac_address: 08:94:ef:51:ae:e1 + mtu: 1470 + name: eno2 + subnets: + - address: fd12:3456:789a:1::1/64 + type: static6 + type: physical version: 1 """ @@ -76,6 +84,8 @@ class TestFreeBSDRoundTrip(CiTestCase): "/etc/rc.conf": ( "# dummy rc.conf\n" "ifconfig_eno1=" - "'172.20.80.129 netmask 255.255.255.128 mtu 1470'\n" + "'inet 172.20.80.129 netmask 255.255.255.128 mtu 1470'\n" + "ifconfig_eno2_ipv6=" + "'inet6 fd12:3456:789a:1::1/64 mtu 1470'\n" ), } diff --git a/tools/.github-cla-signers b/tools/.github-cla-signers index 8adca985..a6bd08cc 100644 --- a/tools/.github-cla-signers +++ b/tools/.github-cla-signers @@ -36,6 +36,7 @@ dhensby eandersson eb3095 edudobay +einsibjarni emmanuelthome eslerm esposem |