in cmd/core_plugin/network/dhclient/dhclient_linux.go [395:444]
func (ds *dhclientService) Rollback(ctx context.Context, opts *service.Options) error {
galog.Infof("Rolling back changes for dhclient.")
// Determine if we can even rollback dhclient processes.
if isInstalled, err := dhclientInstalled(); !isInstalled || err != nil {
galog.Debugf("No preconditions met for dhclient roll back, skipping.")
return nil
}
// Release all the interface leases from dhclient.
for _, iface := range opts.NICConfigs {
ifaceName := iface.Interface.Name()
// Release IPv4 leases.
ipv4Exists, err := dhclientProcessExists(iface, ipv4)
if err != nil {
return fmt.Errorf("failed to check if IPv4 process exists for %s: %w", ifaceName, err)
}
// Only release IPv4 leases if the process exists.
if ipv4Exists {
if err := ds.runDhclient(ctx, ifaceName, ipv4, releaseLease); err != nil {
return fmt.Errorf("failed to release IPv4 lease for %s: %w", ifaceName, err)
}
}
// Release IPv6 leases.
if iface.SupportsIPv6 {
ipv6Exists, err := dhclientProcessExists(iface, ipv6)
if err != nil {
return fmt.Errorf("failed to check if IPv6 process exists for %s: %w", ifaceName, err)
}
// Only release IPv6 leases if the process exists.
if ipv6Exists {
if err := ds.runDhclient(ctx, ifaceName, ipv6, releaseLease); err != nil {
return fmt.Errorf("failed to release IPv6 lease for %s: %w", ifaceName, err)
}
}
}
if err := ds.removeVlanInterfaces(ctx, iface, nil); err != nil {
return fmt.Errorf("failed to remove vlan interfaces: %w", err)
}
if err := route.RemoveRoutes(ctx, iface.Interface.Name()); err != nil {
return fmt.Errorf("failed to remove routes managed by dhclient manager: %w", err)
}
}
return nil
}