mirror of
https://github.com/systemd/systemd
synced 2024-10-14 20:17:52 +00:00
Merge pull request #30541 from yuwata/network-address-empty
network/address: make Address= in [Network] support an empty string
This commit is contained in:
commit
4e22097489
|
@ -662,6 +662,9 @@ Table=1234</programlisting></para>
|
||||||
number of dynamically created network interfaces with the same network configuration and
|
number of dynamically created network interfaces with the same network configuration and
|
||||||
automatic address range assignment.</para>
|
automatic address range assignment.</para>
|
||||||
|
|
||||||
|
<para>If an empty string is specified, then the all previous assignments in both [Network] and
|
||||||
|
[Address] sections are cleared.</para>
|
||||||
|
|
||||||
<xi:include href="version-info.xml" xpointer="v211"/>
|
<xi:include href="version-info.xml" xpointer="v211"/>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
|
@ -1994,10 +1994,16 @@ int config_parse_address(
|
||||||
assert(rvalue);
|
assert(rvalue);
|
||||||
assert(data);
|
assert(data);
|
||||||
|
|
||||||
if (streq(section, "Network"))
|
if (streq(section, "Network")) {
|
||||||
|
if (isempty(rvalue)) {
|
||||||
|
/* If an empty string specified in [Network] section, clear previously assigned addresses. */
|
||||||
|
network->addresses_by_section = ordered_hashmap_free_with_destructor(network->addresses_by_section, address_free);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* we are not in an Address section, so use line number instead. */
|
/* we are not in an Address section, so use line number instead. */
|
||||||
r = address_new_static(network, filename, line, &n);
|
r = address_new_static(network, filename, line, &n);
|
||||||
else
|
} else
|
||||||
r = address_new_static(network, filename, section_line, &n);
|
r = address_new_static(network, filename, section_line, &n);
|
||||||
if (r == -ENOMEM)
|
if (r == -ENOMEM)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
|
||||||
|
[Network]
|
||||||
|
# An empty string clears previously configured addresses.
|
||||||
|
Address=
|
||||||
|
Address=10.4.0.1/16
|
|
@ -1087,7 +1087,7 @@ class NetworkctlTests(unittest.TestCase, Utilities):
|
||||||
self.assertNotIn('dummy98', output)
|
self.assertNotIn('dummy98', output)
|
||||||
|
|
||||||
def test_reconfigure(self):
|
def test_reconfigure(self):
|
||||||
copy_network_unit('25-address-static.network', '12-dummy.netdev')
|
copy_network_unit('25-address-static.network', '12-dummy.netdev', copy_dropins=False)
|
||||||
start_networkd()
|
start_networkd()
|
||||||
self.wait_online(['dummy98:routable'])
|
self.wait_online(['dummy98:routable'])
|
||||||
|
|
||||||
|
@ -1121,7 +1121,7 @@ class NetworkctlTests(unittest.TestCase, Utilities):
|
||||||
self.assertNotIn('inet 10.1.2.4/16 brd 10.1.255.255 scope global secondary dummy98', output)
|
self.assertNotIn('inet 10.1.2.4/16 brd 10.1.255.255 scope global secondary dummy98', output)
|
||||||
self.assertNotIn('inet 10.2.2.4/16 brd 10.2.255.255 scope global dummy98', output)
|
self.assertNotIn('inet 10.2.2.4/16 brd 10.2.255.255 scope global dummy98', output)
|
||||||
|
|
||||||
copy_network_unit('25-address-static.network')
|
copy_network_unit('25-address-static.network', copy_dropins=False)
|
||||||
networkctl_reload()
|
networkctl_reload()
|
||||||
self.wait_online(['dummy98:routable'])
|
self.wait_online(['dummy98:routable'])
|
||||||
|
|
||||||
|
@ -1154,7 +1154,7 @@ class NetworkctlTests(unittest.TestCase, Utilities):
|
||||||
check()
|
check()
|
||||||
|
|
||||||
def test_up_down(self):
|
def test_up_down(self):
|
||||||
copy_network_unit('25-address-static.network', '12-dummy.netdev')
|
copy_network_unit('25-address-static.network', '12-dummy.netdev', copy_dropins=False)
|
||||||
start_networkd()
|
start_networkd()
|
||||||
self.wait_online(['dummy98:routable'])
|
self.wait_online(['dummy98:routable'])
|
||||||
|
|
||||||
|
@ -2756,6 +2756,15 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
|
||||||
for i in range(1, 254):
|
for i in range(1, 254):
|
||||||
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
|
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
|
||||||
|
|
||||||
|
# test for an empty string assignment for Address= in [Network]
|
||||||
|
copy_network_unit('25-address-static.network.d/20-clear-addresses.conf')
|
||||||
|
networkctl_reload()
|
||||||
|
self.wait_online(['dummy98:routable'])
|
||||||
|
output = check_output('ip -4 address show dev dummy98')
|
||||||
|
for i in range(1, 254):
|
||||||
|
self.assertNotIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
|
||||||
|
self.assertIn('inet 10.4.0.1/16 brd 10.4.255.255', output)
|
||||||
|
|
||||||
def test_address_ipv4acd(self):
|
def test_address_ipv4acd(self):
|
||||||
check_output('ip netns add ns99')
|
check_output('ip netns add ns99')
|
||||||
check_output('ip link add veth99 type veth peer veth-peer')
|
check_output('ip link add veth99 type veth peer veth-peer')
|
||||||
|
@ -3186,7 +3195,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
|
||||||
output = check_output(*networkctl_cmd, '--json=short', 'status', env=env)
|
output = check_output(*networkctl_cmd, '--json=short', 'status', env=env)
|
||||||
check_json(output)
|
check_json(output)
|
||||||
|
|
||||||
copy_network_unit('25-address-static.network')
|
copy_network_unit('25-address-static.network', copy_dropins=False)
|
||||||
networkctl_reload()
|
networkctl_reload()
|
||||||
self.wait_online(['dummy98:routable'])
|
self.wait_online(['dummy98:routable'])
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue