in controllers/daemon/staticgatewayconfiguration_controller.go [510:568]
func (r *StaticGatewayConfigurationReconciler) reconcileIlbIPOnHost(ctx context.Context, ilbIP string) error {
log := log.FromContext(ctx)
eth0, err := r.Netlink.LinkByName("eth0")
if err != nil {
return fmt.Errorf("failed to retrieve link eth0: %w", err)
}
if len(nodeMeta.Network.Interface) == 0 || len(nodeMeta.Network.Interface[0].IPv4.Subnet) == 0 {
return fmt.Errorf("imds does not provide subnet information about the node")
}
prefix, err := strconv.Atoi(nodeMeta.Network.Interface[0].IPv4.Subnet[0].Prefix)
if err != nil {
return fmt.Errorf("failed to retrieve and parse prefix: %w", err)
}
addresses, err := r.Netlink.AddrList(eth0, nl.FAMILY_ALL)
if err != nil {
return fmt.Errorf("failed to retrieve IP addresses for eth0: %w", err)
}
if ilbIP == "" {
// cleanup process
for _, address := range addresses {
if address.Label == consts.ILBIPLabel {
log.Info("Removing ILB IP from eth0", "ilb IP", address.IPNet.String())
if err := r.Netlink.AddrDel(eth0, &address); err != nil {
return fmt.Errorf("failed to delete ILB IP from eth0: %w", err)
}
}
}
return nil
}
ilbIpCidr := fmt.Sprintf("%s/%d", ilbIP, prefix)
ilbIpNet, err := netlink.ParseIPNet(ilbIpCidr)
if err != nil {
return fmt.Errorf("failed to parse ILB IP address: %s", ilbIpCidr)
}
addressPresent := false
for _, address := range addresses {
if address.IPNet.IP.Equal(ilbIpNet.IP) {
addressPresent = true
break
}
}
if !addressPresent {
log.Info("Adding ILB IP to eth0", "ilb IP", ilbIpCidr)
if err := r.Netlink.AddrAdd(eth0, &netlink.Addr{
IPNet: ilbIpNet,
Label: consts.ILBIPLabel,
}); err != nil {
return fmt.Errorf("failed to add ILB IP to eth0: %w", err)
}
}
return nil
}