in pkg/provider/prefix/provider.go [202:260]
func (p *ipv4PrefixProvider) UpdateResourceCapacity(instance ec2.EC2Instance) error {
resourceProviderAndPool, isPresent := p.getInstanceProviderAndPool(instance.Name())
if !isPresent {
p.log.Error(utils.ErrNotFound, utils.ErrMsgProviderAndPoolNotFound, "node name", instance.Name())
return nil
}
resourceProviderAndPool.lock.Lock()
defer resourceProviderAndPool.lock.Unlock()
// Check if PD is enabled
isCurrPDEnabled := p.conditions.IsWindowsPrefixDelegationEnabled()
// Previous state and current state are both PD disabled, which means secondary IP provider has been active without toggling, hence
// no need to update the warm pool config or node capacity as prefix provider
if !resourceProviderAndPool.isPrevPDEnabled && !isCurrPDEnabled {
p.log.V(1).Info("secondary IP provider has been active without toggling, no update from prefix provider",
"isPrevPDEnabled", resourceProviderAndPool.isPrevPDEnabled, "isCurrPDEnabled", isCurrPDEnabled)
return nil
}
// If toggling from PD to secondary IP mode, then set the prefix IP pool state to draining and
// do not update the capacity as that would be done by secondary IP provider
if resourceProviderAndPool.isPrevPDEnabled && !isCurrPDEnabled {
resourceProviderAndPool.isPrevPDEnabled = false
p.log.Info("Secondary IP provider should be active")
job := resourceProviderAndPool.resourcePool.SetToDraining()
if job.Operations != worker.OperationReconcileNotRequired {
p.SubmitAsyncJob(job)
}
return nil
}
resourceProviderAndPool.isPrevPDEnabled = true
warmPoolConfig := pool.GetWinWarmPoolConfig(p.log, p.apiWrapper, isCurrPDEnabled)
// Set the secondary IP provider pool state to active
job := resourceProviderAndPool.resourcePool.SetToActive(warmPoolConfig)
if job.Operations != worker.OperationReconcileNotRequired {
p.SubmitAsyncJob(job)
}
instanceType := instance.Type()
instanceName := instance.Name()
os := instance.Os()
capacity := resourceProviderAndPool.capacity
// Advertise capacity of private IPv4 addresses deconstructed from prefixes
err := p.apiWrapper.K8sAPI.AdvertiseCapacityIfNotSet(instanceName, config.ResourceNameIPAddress, capacity)
if err != nil {
return err
}
p.log.V(1).Info("advertised capacity",
"instance", instanceName, "instance type", instanceType, "os", os, "capacity", capacity)
return nil
}