diff --git a/src/networkd.c b/src/networkd.c index 0e6c0afe9..982781e0d 100644 --- a/src/networkd.c +++ b/src/networkd.c @@ -1501,8 +1501,12 @@ _netplan_networkd_write_wait_online(const NetplanState* np_state, const char* ro || netplan_netdef_get_link_local_ipv6(def); _netplan_address_iter_free(addr_iter); - // no matching => single interface, ignoring non-existing interfaces - if (!netplan_netdef_has_match(def) && g_hash_table_contains(system_interfaces, def->id)) { + // no matching => single physical interface, ignoring non-existing interfaces + // OR: virtual interfaces, those will be created later on and cannot have a matching condition + gboolean physical_no_match_or_virtual = FALSE + || (!netplan_netdef_has_match(def) && g_hash_table_contains(system_interfaces, def->id)) + || (netplan_netdef_get_type(def) >= NETPLAN_DEF_TYPE_VIRTUAL); + if (physical_no_match_or_virtual) { g_hash_table_replace(non_optional_interfaces, g_strdup(def->id), any_ips ? g_strdup("degraded") : g_strdup("carrier")); } else if (def->set_name) { // matching on a single interface, to be renamed _netplan_enumerate_interfaces(def, system_interfaces, non_optional_interfaces, any_ips ? "degraded" : "carrier", def->set_name, rootdir); diff --git a/tests/generator/test_args.py b/tests/generator/test_args.py index de5aaa89c..b48291a36 100644 --- a/tests/generator/test_args.py +++ b/tests/generator/test_args.py @@ -133,7 +133,10 @@ def test_systemd_generator(self): dhcp4: true optional: true lo: - addresses: ["127.0.0.1/8", "::1/128"]''') + addresses: ["127.0.0.1/8", "::1/128"] + bridges: + br0: + dhcp4: true''') outdir = os.path.join(self.workdir.name, 'out') os.mkdir(outdir) @@ -151,6 +154,9 @@ def test_systemd_generator(self): n = os.path.join(self.workdir.name, 'run', 'systemd', 'network', '10-netplan-lo.network') self.assertTrue(os.path.exists(n)) os.unlink(n) + n = os.path.join(self.workdir.name, 'run', 'systemd', 'network', '10-netplan-br0.network') + self.assertTrue(os.path.exists(n)) + os.unlink(n) # should auto-enable networkd and -wait-online service_dir = os.path.join(self.workdir.name, 'run', 'systemd', 'system') @@ -166,7 +172,7 @@ def test_systemd_generator(self): [Service] ExecStart= -ExecStart=/lib/systemd/systemd-networkd-wait-online -i lo:carrier\n''') # eth99 does not exist on the system +ExecStart=/lib/systemd/systemd-networkd-wait-online -i br0:degraded -i lo:carrier\n''') # eth99 does not exist on the system # should be a no-op the second time while the stamp exists out = subprocess.check_output([generator, '--root-dir', self.workdir.name, outdir, outdir, outdir], diff --git a/tests/integration/ethernets.py b/tests/integration/ethernets.py index 7028a498c..1e57816cf 100644 --- a/tests/integration/ethernets.py +++ b/tests/integration/ethernets.py @@ -409,8 +409,12 @@ def test_systemd_networkd_wait_online(self): set-name: "findme" %(e2c)s: addresses: ["10.0.0.1/24"] + bridges: + br0: + addresses: ["10.0.0.2/24"] + interfaces: [%(e2c)s] ''' % {'r': self.backend, 'ec_mac': self.dev_e_client_mac, 'e2c': self.dev_e2_client}) - self.generate_and_settle([self.dev_e2_client]) + self.generate_and_settle([self.dev_e2_client, 'br0']) override = os.path.join('/run', 'systemd', 'system', 'systemd-networkd-wait-online.service.d', '10-netplan.conf') self.assertTrue(os.path.isfile(override)) @@ -424,7 +428,7 @@ def test_systemd_networkd_wait_online(self): [Service] ExecStart= -ExecStart=/lib/systemd/systemd-networkd-wait-online -i %s:degraded -i findme:carrier +ExecStart=/lib/systemd/systemd-networkd-wait-online -i %s:degraded -i br0:degraded -i findme:carrier ''' % self.dev_e2_client)