summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGonéri Le Bouder <goneri@lebouder.net>2023-04-28 15:07:24 -0400
committerGitHub <noreply@github.com>2023-04-28 14:07:24 -0500
commit7ffd0bcd8379ae6ece096e7014444978efa5f7c8 (patch)
tree84dace25d365ea4b91e0a7dab629b798f6d366b6
parenta9cec5daa52aa9fb0a1f17dfc939e3ff61a476b9 (diff)
downloadcloud-init-git-7ffd0bcd8379ae6ece096e7014444978efa5f7c8.tar.gz
openstack/static: honor the DNS servers associated with a network (#2138)
The `network_data.json` allows the definition of the DNS through the `services` list at the network level. See: - https://opendev.org/openstack/nova/src/commit/700db274c613d6f8f30e5cdc3462beaeb0fda456/nova/tests/unit/network/test_network_info.py#L979-L980 - https://opendev.org/openstack/metalsmith/src/commit/f98dfa61c1d7475b81c20dabbf2c74198c38c793/metalsmith/test/test_network_metadata.py#L52-L90 - https://opendev.org/openstack/nova/commit/4b333b989dfc778a8b61db4a1b8552e988a10471
-rw-r--r--cloudinit/sources/helpers/openstack.py8
-rw-r--r--tests/unittests/sources/helpers/test_openstack.py59
2 files changed, 67 insertions, 0 deletions
diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py
index cd787d0d..ebdeedd3 100644
--- a/cloudinit/sources/helpers/openstack.py
+++ b/cloudinit/sources/helpers/openstack.py
@@ -642,6 +642,14 @@ def convert_net_json(network_json=None, known_macs=None):
}
)
+ dns_nameservers = [
+ service["address"]
+ for service in network.get("services", [])
+ if service.get("type") == "dns"
+ ]
+ if dns_nameservers:
+ subnet["dns_nameservers"] = dns_nameservers
+
# Enable accept_ra for stateful and legacy ipv6_dhcp types
if network["type"] in ["ipv6_dhcpv6-stateful", "ipv6_dhcp"]:
cfg.update({"accept-ra": True})
diff --git a/tests/unittests/sources/helpers/test_openstack.py b/tests/unittests/sources/helpers/test_openstack.py
index eb87b1ce..ac8e2a35 100644
--- a/tests/unittests/sources/helpers/test_openstack.py
+++ b/tests/unittests/sources/helpers/test_openstack.py
@@ -60,3 +60,62 @@ class TestConvertNetJson(test_helpers.CiTestCase):
network_json=net_json, known_macs=macs
),
)
+
+ def test_subnet_dns(self):
+ """Verify the different known physical types are handled."""
+ # network_data.json example from
+ # https://docs.openstack.org/nova/latest/user/metadata.html
+ mac0 = "fa:16:3e:9c:bf:3d"
+ net_json = {
+ "links": [
+ {
+ "ethernet_mac_address": mac0,
+ "id": "tapcd9f6d46-4a",
+ "mtu": None,
+ "type": "phy",
+ "vif_id": "cd9f6d46-4a3a-43ab-a466-994af9db96fc",
+ }
+ ],
+ "networks": [
+ {
+ "id": "network0",
+ "link": "tapcd9f6d46-4a",
+ "network_id": "99e88329-f20d-4741-9593-25bf07847b16",
+ "type": "ipv4",
+ "ip_address": "192.168.123.5",
+ "netmask": "255.255.255.0",
+ "services": [{"type": "dns", "address": "192.168.123.1"}],
+ }
+ ],
+ }
+ macs = {mac0: "eth0"}
+
+ expected = {
+ "version": 1,
+ "config": [
+ {
+ "mac_address": "fa:16:3e:9c:bf:3d",
+ "mtu": None,
+ "name": "eth0",
+ "subnets": [
+ {
+ "type": "static",
+ "address": "192.168.123.5",
+ "netmask": "255.255.255.0",
+ "ipv4": True,
+ "dns_nameservers": ["192.168.123.1"],
+ }
+ ],
+ "type": "physical",
+ }
+ ],
+ }
+
+ for t in openstack.KNOWN_PHYSICAL_TYPES:
+ net_json["links"][0]["type"] = t
+ self.assertEqual(
+ expected,
+ openstack.convert_net_json(
+ network_json=net_json, known_macs=macs
+ ),
+ )