netplan apply does not remove defunct VLAN interfaces when --state is specificed
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Netplan |
Triaged
|
Medium
|
Unassigned |
Bug Description
"netplan apply" claims that, when invoked using the "--state" parameter, it will remove virtual interfaces when they are not specified in the new config. This functionality does not work for VLAN interfaces. Here's a reproducible:
# cat /etc/netplan/
network:
version: 2
renderer: networkd
ethernets:
enp0s8: {} # physical ethernet interface
vlans:
enp0s8.998:
id: 998
link: enp0s8
enp0s8.999:
id: 999
link: enp0s8
# netplan-apply
# ip a
1: lo: <LOOPBACK,
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
3: enp0s8.999@enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
4: enp0s8.998@enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
# mkdir /tmp/netplan_state && netplan get | tee /tmp/netplan_
network:
renderer: networkd
version: 2
vlans:
enp0s8.998:
id: 998
link: enp0s8
enp0s8.999:
id: 999
link: enp0s8
Now make edits to /etc/netplan/
# cat /etc/netplan/
network:
version: 2
renderer: networkd
ethernets:
enp0s8: {} # physical ethernet interface
vlans:
enp0s8.998:
id: 998
link: enp0s8
# netplan apply --state /tmp/netplan_state/
# ip a
1: lo: <LOOPBACK,
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
3: enp0s8.999@enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
4: enp0s8.998@enp0s8: <BROADCAST,
link/ether 08:00:27:94:6f:b6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:
valid_lft forever preferred_lft forever
I would expect that enp0s8.999 would be removed from the system.
I did some digging and the lack of removal can either be called a case of unclear documentation or a bug:
On https:/ /github. com/canonical/ netplan/ blob/a42eb7860c 8bbe69b1a2df695 c85a59662898362 /netplan/ cli/commands/ apply.py# L204, it passes self.state (the argument that was passed in on the CLI) as the "prefix" to ConfigManager to parse the old config. However, ConfigManager (https:/ /github. com/canonical/ netplan/ blob/a42eb7860c 8bbe69b1a2df695 c85a59662898362 /netplan/ configmanager. py#L154- L156) is coded to look for YAMLs self.prefix / {lib,etc,run} / netplan.
Thus, in my above example, I needed to place my old YAML in /tmp/netplan_ state/etc/ netplan rather than directyly in /tmp/netplan_state/
Is this desired behavior?