summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/net/bsd.py66
-rw-r--r--cloudinit/net/freebsd.py23
-rw-r--r--tests/unittests/distros/test_netconfig.py25
-rw-r--r--tests/unittests/test_net_freebsd.py12
-rw-r--r--tools/.github-cla-signers1
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