in google_guest_agent/network/manager/netplan_linux.go [571:636]
func (n *netplan) rollbackVlanNics(ctx context.Context, nics *Interfaces) (bool, error) {
var deleteNics []string
var deleteDirs []string
if len(nics.VlanInterfaces) == 0 {
logger.Debugf("No VLAN interfaces in args, skipping rollback")
return false, nil
}
existingVlanCfgs := netplanDropin{}
netplanVlanDropinFile := n.dropinFile(netplanVlanSuffix)
// There's no config file per interface, single netplan config file lists all the interfaces.
if utils.FileExists(netplanVlanDropinFile, utils.TypeFile) {
if err := readYamlFile(netplanVlanDropinFile, &existingVlanCfgs); err != nil {
return false, fmt.Errorf("unable to read %q trying rollback configs: %w", netplanVlanDropinFile, err)
}
}
for _, iface := range nics.VlanInterfaces {
ifaceName := n.vlanInterfaceName(iface.ParentInterfaceID, iface.VlanInterface.Vlan)
key := n.ID(ifaceName)
deleteNics = append(deleteNics, key)
delete(existingVlanCfgs.Network.Vlans, key)
dropin := filepath.Join(n.networkdDropinDir, fmt.Sprintf("10-netplan-%s.network.d", key))
if utils.FileExists(dropin, utils.TypeDir) {
// Networkd dropin is a directory for each interface with override.conf file.
// Remove should delete the complete directory instead of that one file.
deleteDirs = append(deleteDirs, dropin)
}
}
logger.Infof("Deleting VLAN NICs: %v", deleteNics)
// Simply removing configs on disk and reloading netplan/networkctl doesn't remove
// existing vlan nics, it requires instance reboot or systemd-networkd restart. Instead,
// make sure its removed by [networkctl delete <interfaces>] command.
args := []string{"delete"}
args = append(args, deleteNics...)
if err := run.Quiet(ctx, "networkctl", args...); err != nil {
return false, fmt.Errorf("networkctl %v failed with error: %w", args, err)
}
// If no more VLANs exist simply remove the file.
if len(existingVlanCfgs.Network.Vlans) == 0 {
logger.Infof("Removing %s dropin file for vlan rollback", netplanVlanDropinFile)
if err := os.Remove(netplanVlanDropinFile); err != nil {
return false, fmt.Errorf("unable to remove netplan vlan dropin (%s): %w", netplanVlanDropinFile, err)
}
} else {
logger.Infof("Updating %s dropin file for vlan rollback", netplanVlanDropinFile)
// Otherwise, overwrite configs to reflect expected interfaces.
if _, err := n.write(existingVlanCfgs, netplanVlanSuffix); err != nil {
return false, fmt.Errorf("unable to update vlan config at (%s): %w", netplanVlanDropinFile, err)
}
}
logger.Infof("Removing directories %v as part of vlan rollback", deleteDirs)
for _, dir := range deleteDirs {
if err := os.RemoveAll(dir); err != nil {
return false, fmt.Errorf("unable to remove directory %q: %w", dir, err)
}
}
return true, nil
}