Support the DNS priority

The users want to configure the priority of DNS servers, add support for
that.

Fixes https://github.com/linux-system-roles/network/issues/505.

Signed-off-by: Wen Liang <liangwen12year@gmail.com>
This commit is contained in:
Wen Liang 2022-10-10 21:59:08 -04:00 committed by Richard Megginson
parent 53208608a4
commit 3d10af067a
7 changed files with 84 additions and 12 deletions

View file

@ -514,6 +514,15 @@ The IP configuration supports the following options:
When using a caching DNS plugin (dnsmasq or systemd-resolved in NetworkManager.conf)
then "edns0" and "trust-ad" are automatically added.
- `dns_priority`
DNS servers priority. The relative priority for DNS servers specified by this
setting. The default value is 0, a lower numerical value has higher priority.
The valid value of `dns_priority` ranges from -2147483648 to 2147483647. Negative
values have the special effect of excluding other configurations with a greater
numerical priority value; so in presence of at least one negative priority, only
DNS servers from connections with the lowest priority value will be used.
- `gateway4` and `gateway6`
The default gateway for IPv4 (`gateway4`) or IPv6 (`gateway6`) packets.

View file

@ -9,6 +9,7 @@
route_metric4: 100
dhcp4: no
gateway4: 192.0.2.1
dns_priority: 9999
dns:
- 192.0.2.2
- 198.51.100.5

View file

@ -1092,6 +1092,10 @@ class NMUtil:
s_ip4.clear_dns_options(False)
for option in ip["dns_options"]:
s_ip4.add_dns_option(option)
if ip["dns_priority"] is not None:
s_ip4.set_property(
NM.SETTING_IP_CONFIG_DNS_PRIORITY, ip["dns_priority"]
)
is_ipv6_configured = False
if ip["ipv6_disabled"]:
@ -1144,6 +1148,10 @@ class NMUtil:
s_ip6.clear_dns_options(False)
for option in ip["dns_options"]:
s_ip6.add_dns_option(option)
if ip["dns_priority"] is not None:
s_ip6.set_property(
NM.SETTING_IP_CONFIG_DNS_PRIORITY, ip["dns_priority"]
)
if ip["route_append_only"] and connection_current:
for r in self.setting_ip_config_get_routes(

View file

@ -887,6 +887,12 @@ class ArgValidator_DictIP(ArgValidatorDict):
),
default_value=list,
),
ArgValidatorNum(
"dns_priority",
val_min=-2147483648,
val_max=2147483647,
default_value=0,
),
ArgValidatorList(
"routing_rule",
nested=ArgValidatorIPRoutingRule("routing_rule[?]"),
@ -911,6 +917,7 @@ class ArgValidator_DictIP(ArgValidatorDict):
"dns": [],
"dns_search": [],
"dns_options": [],
"dns_priority": 0,
},
)
@ -2470,19 +2477,23 @@ class ArgValidator_ListConnections(ArgValidatorList):
"IPv6 needs to be enabled to support IPv6 nameservers.",
)
# when IPv4 and IPv6 are disabled, setting ip.dns_options or
# ip.dns_search is not allowed
if connection["ip"]["dns_search"] or connection["ip"]["dns_options"]:
# ip.dns_search or ip.dns_priority is not allowed
if (
connection["ip"]["dns_search"]
or connection["ip"]["dns_options"]
or connection["ip"]["dns_priority"]
):
if not _ipv4_enabled(connection) and connection["ip"]["ipv6_disabled"]:
raise ValidationError.from_connection(
idx,
"Setting 'dns_search' or 'dns_options' is not allowed when "
"both IPv4 and IPv6 are disabled.",
"Setting 'dns_search', 'dns_options' and 'dns_priority' are not "
"allowed when both IPv4 and IPv6 are disabled.",
)
elif not _ipv4_enabled(connection) and _ipv6_is_not_configured(connection):
raise ValidationError.from_connection(
idx,
"Setting 'dns_search' or 'dns_options' is not allowed when "
"IPv4 is disabled and IPv6 is not configured.",
"Setting 'dns_search', 'dns_options' and 'dns_priority' are not "
"allowed when IPv4 is disabled and IPv6 is not configured.",
)
# DNS options 'inet6', 'ip6-bytestring', 'ip6-dotint', 'no-ip6-dotint' are only
# supported for IPv6 configuration, so raise errors when IPv6 is disabled

View file

@ -34,6 +34,7 @@
route_metric4: 100
dhcp4: no
gateway4: 192.0.2.1
dns_priority: 9999
dns:
- 192.0.2.2
- 198.51.100.5
@ -108,6 +109,13 @@
- "'timeout:1' in ipv6_dns.stdout"
msg: "DNS options are configured incorrectly"
- name: "Assert that DNS priority is configured correctly"
assert:
that:
- "'9999' in ipv4_dns.stdout"
- "'9999' in ipv6_dns.stdout"
msg: "DNS priority is configured incorrectly"
- import_playbook: down_profile+delete_interface.yml
vars:
profile: "{{ interface }}"

View file

@ -138,11 +138,11 @@
assert:
that:
- __network_connections_result.stderr is search("Setting
'dns_search' or 'dns_options' is not allowed when both IPv4 and
IPv6 are disabled.")
'dns_search', 'dns_options' and 'dns_priority' are not allowed
when both IPv4 and IPv6 are disabled.")
msg: Reconfiguring network connection is not failed with the error
"Setting 'dns_search' or 'dns_options' is not allowed when both
IPv4 and IPv6 are disabled."
"Setting 'dns_search', 'dns_options', and 'dns_priority' are not
allowed when both IPv4 and IPv6 are disabled."
when: ansible_distribution_major_version | int > 7
always:

View file

@ -198,6 +198,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
},
"mac": None,
@ -587,6 +588,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
},
"mac": None,
@ -641,6 +643,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -692,6 +695,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -772,6 +776,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -839,6 +844,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -930,6 +936,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -1028,6 +1035,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric4": None,
"routing_rule": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1063,6 +1071,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1160,6 +1169,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1237,6 +1247,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1351,6 +1362,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric4": None,
"routing_rule": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1387,6 +1399,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1499,6 +1512,7 @@ class TestValidator(Python26CompatTestCase):
"routing_rule": [],
"dns_options": [],
"ipv6_disabled": False,
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1534,6 +1548,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric4": None,
"dns_options": [],
"ipv6_disabled": False,
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1591,6 +1606,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1701,6 +1717,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -1744,6 +1761,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -1835,6 +1853,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1914,6 +1933,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"route_metric4": None,
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"dhcp4_send_hostname": None,
"gateway6": None,
@ -1988,6 +2008,7 @@ class TestValidator(Python26CompatTestCase):
"route_metric6": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
},
"mac": "aa:bb:cc:dd:ee:ff",
@ -2035,6 +2056,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -2108,6 +2130,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2150,6 +2173,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4": True,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2209,6 +2233,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2285,6 +2310,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2367,6 +2393,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2409,6 +2436,7 @@ class TestValidator(Python26CompatTestCase):
"dhcp4_send_hostname": None,
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"gateway4": None,
"gateway6": None,
@ -2540,6 +2568,7 @@ class TestValidator(Python26CompatTestCase):
"routing_rule": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": ["aa", "bb"],
"route_metric6": None,
"dhcp4_send_hostname": None,
@ -2648,6 +2677,7 @@ class TestValidator(Python26CompatTestCase):
"routing_rule": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": ["aa", "bb"],
"route_metric6": None,
"dhcp4_send_hostname": None,
@ -2765,6 +2795,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -2845,6 +2876,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -2925,6 +2957,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -3003,6 +3036,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -3071,6 +3105,7 @@ class TestValidator(Python26CompatTestCase):
"route": [],
"dns": [],
"dns_options": [],
"dns_priority": 0,
"dns_search": [],
"route_metric6": None,
"routing_rule": [],
@ -4059,8 +4094,8 @@ class TestValidator(Python26CompatTestCase):
]
self.assertRaisesRegex(
ValidationError,
"Setting 'dns_search' or 'dns_options' is not allowed when IPv4 is "
"disabled and IPv6 is not configured",
"Setting 'dns_search', 'dns_options' and 'dns_priority' are not allowed "
"when IPv4 is disabled and IPv6 is not configured",
validator.validate_connection_one,
"nm",
validator.validate(dns_search_without_ipv4_and_ipv6_configuration),