Merge pull request #87635 from feiskyer/cache-nil-for-deleting-node

Set cache to nil data when Azure node provisioning state is deleting
This commit is contained in:
Kubernetes Prow Robot 2020-01-31 20:07:21 -08:00 committed by GitHub
commit fa83cf56eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 4 deletions

View File

@ -156,13 +156,20 @@ func (ss *scaleSet) newVMSSVirtualMachinesCache() (*timedCache, error) {
} }
computerName := strings.ToLower(*vm.OsProfile.ComputerName) computerName := strings.ToLower(*vm.OsProfile.ComputerName)
localCache.Store(computerName, &vmssVirtualMachinesEntry{ vmssVMCacheEntry := &vmssVirtualMachinesEntry{
resourceGroup: resourceGroup, resourceGroup: resourceGroup,
vmssName: ssName, vmssName: ssName,
instanceID: to.String(vm.InstanceID), instanceID: to.String(vm.InstanceID),
virtualMachine: &vm, virtualMachine: &vm,
lastUpdate: time.Now().UTC(), lastUpdate: time.Now().UTC(),
}) }
// set cache entry to nil when the VM is under deleting.
if vm.VirtualMachineScaleSetVMProperties != nil &&
strings.EqualFold(to.String(vm.VirtualMachineScaleSetVMProperties.ProvisioningState), string(compute.ProvisioningStateDeleting)) {
klog.V(4).Infof("VMSS virtualMachine %q is under deleting, setting its cache to nil", computerName)
vmssVMCacheEntry.virtualMachine = nil
}
localCache.Store(computerName, vmssVMCacheEntry)
if _, exists := oldCache[computerName]; exists { if _, exists := oldCache[computerName]; exists {
delete(oldCache, computerName) delete(oldCache, computerName)

View File

@ -23,8 +23,10 @@ import (
"sync" "sync"
"testing" "testing"
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
"github.com/Azure/go-autorest/autorest/to" "github.com/Azure/go-autorest/autorest/to"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
cloudprovider "k8s.io/cloud-provider"
) )
func TestExtractVmssVMName(t *testing.T) { func TestExtractVmssVMName(t *testing.T) {
@ -112,3 +114,26 @@ func TestVMSSVMCache(t *testing.T) {
assert.Equal(t, to.String(vm.InstanceID), instanceID) assert.Equal(t, to.String(vm.InstanceID), instanceID)
assert.Equal(t, &vm, realVM) assert.Equal(t, &vm, realVM)
} }
func TestVMSSVMCacheWithDeletingNodes(t *testing.T) {
vmssName := "vmss"
vmList := []string{"vmssee6c2000000", "vmssee6c2000001", "vmssee6c2000002"}
ss, err := newTestScaleSetWithState(vmssName, "", 0, vmList, "Deleting")
assert.NoError(t, err)
virtualMachines, rerr := ss.VirtualMachineScaleSetVMsClient.List(
context.Background(), "rg", "vmss", "")
assert.Nil(t, rerr)
assert.Equal(t, 3, len(virtualMachines))
for i := range virtualMachines {
vm := virtualMachines[i]
vmName := to.String(vm.OsProfile.ComputerName)
assert.Equal(t, vm.ProvisioningState, to.StringPtr(string(compute.ProvisioningStateDeleting)))
ssName, instanceID, realVM, err := ss.getVmssVM(vmName, cacheReadTypeDefault)
assert.Nil(t, realVM)
assert.Equal(t, "", ssName)
assert.Equal(t, instanceID, ssName)
assert.Equal(t, cloudprovider.InstanceNotFound, err)
}
}

View File

@ -34,8 +34,12 @@ const (
) )
func newTestScaleSet(scaleSetName, zone string, faultDomain int32, vmList []string) (*scaleSet, error) { func newTestScaleSet(scaleSetName, zone string, faultDomain int32, vmList []string) (*scaleSet, error) {
return newTestScaleSetWithState(scaleSetName, zone, faultDomain, vmList, "Running")
}
func newTestScaleSetWithState(scaleSetName, zone string, faultDomain int32, vmList []string, state string) (*scaleSet, error) {
cloud := getTestCloud() cloud := getTestCloud()
setTestVirtualMachineCloud(cloud, scaleSetName, zone, faultDomain, vmList) setTestVirtualMachineCloud(cloud, scaleSetName, zone, faultDomain, vmList, state)
ss, err := newScaleSet(cloud) ss, err := newScaleSet(cloud)
if err != nil { if err != nil {
return nil, err return nil, err
@ -44,7 +48,7 @@ func newTestScaleSet(scaleSetName, zone string, faultDomain int32, vmList []stri
return ss.(*scaleSet), nil return ss.(*scaleSet), nil
} }
func setTestVirtualMachineCloud(ss *Cloud, scaleSetName, zone string, faultDomain int32, vmList []string) { func setTestVirtualMachineCloud(ss *Cloud, scaleSetName, zone string, faultDomain int32, vmList []string, state string) {
virtualMachineScaleSetsClient := newFakeVirtualMachineScaleSetsClient() virtualMachineScaleSetsClient := newFakeVirtualMachineScaleSetsClient()
virtualMachineScaleSetVMsClient := newFakeVirtualMachineScaleSetVMsClient() virtualMachineScaleSetVMsClient := newFakeVirtualMachineScaleSetVMsClient()
publicIPAddressesClient := newFakeAzurePIPClient("rg") publicIPAddressesClient := newFakeAzurePIPClient("rg")
@ -99,6 +103,7 @@ func setTestVirtualMachineCloud(ss *Cloud, scaleSetName, zone string, faultDomai
} }
vmssVM := compute.VirtualMachineScaleSetVM{ vmssVM := compute.VirtualMachineScaleSetVM{
VirtualMachineScaleSetVMProperties: &compute.VirtualMachineScaleSetVMProperties{ VirtualMachineScaleSetVMProperties: &compute.VirtualMachineScaleSetVMProperties{
ProvisioningState: to.StringPtr(state),
OsProfile: &compute.OSProfile{ OsProfile: &compute.OSProfile{
ComputerName: &nodeName, ComputerName: &nodeName,
}, },

View File

@ -27,6 +27,7 @@ import (
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute" "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network"
"github.com/Azure/go-autorest/autorest/to"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
cloudprovider "k8s.io/cloud-provider" cloudprovider "k8s.io/cloud-provider"
@ -193,6 +194,12 @@ func (az *Cloud) newVMCache() (*timedCache, error) {
return nil, nil return nil, nil
} }
if vm.VirtualMachineProperties != nil &&
strings.EqualFold(to.String(vm.VirtualMachineProperties.ProvisioningState), string(compute.ProvisioningStateDeleting)) {
klog.V(2).Infof("Virtual machine %q is under deleting", key)
return nil, nil
}
return &vm, nil return &vm, nil
} }