mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 10:18:13 +00:00 
			
		
		
		
	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:
		| @@ -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) | ||||||
|   | |||||||
| @@ -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) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -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, | ||||||
| 				}, | 				}, | ||||||
|   | |||||||
| @@ -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 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Prow Robot
					Kubernetes Prow Robot