diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD index 409ad725022..df5b16f3b52 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD @@ -122,6 +122,7 @@ go_test( "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", ], ) diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go index d8fc3b6798f..7382e9c69ea 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go @@ -300,3 +300,17 @@ func (c *controllerCommon) DisksAreAttached(diskNames []string, nodeName types.N return attached, nil } + +func filterDetachingDisks(unfilteredDisks []compute.DataDisk) []compute.DataDisk { + filteredDisks := []compute.DataDisk{} + for _, disk := range unfilteredDisks { + if disk.ToBeDetached != nil && *disk.ToBeDetached { + if disk.Name != nil { + klog.V(2).Infof("Filtering disk: %s with ToBeDetached flag set.", *disk.Name) + } + } else { + filteredDisks = append(filteredDisks, disk) + } + } + return filteredDisks +} diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go index f54e470fac5..5db74cb5a6a 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/assert" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/pointer" ) func TestCommonAttachDisk(t *testing.T) { @@ -248,3 +249,38 @@ func TestDisksAreAttached(t *testing.T) { assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc) } } + +func TestFilteredDetatchingDisks(t *testing.T) { + + disks := []compute.DataDisk{ + { + Name: pointer.StringPtr("DiskName1"), + ToBeDetached: pointer.BoolPtr(false), + ManagedDisk: &compute.ManagedDiskParameters{ + ID: pointer.StringPtr("ManagedID"), + }, + }, + { + Name: pointer.StringPtr("DiskName2"), + ToBeDetached: pointer.BoolPtr(true), + }, + { + Name: pointer.StringPtr("DiskName3"), + ToBeDetached: nil, + }, + { + Name: pointer.StringPtr("DiskName4"), + ToBeDetached: nil, + }, + } + + filteredDisks := filterDetachingDisks(disks) + assert.Equal(t, 3, len(filteredDisks)) + assert.Equal(t, "DiskName1", *filteredDisks[0].Name) + assert.Equal(t, "ManagedID", *filteredDisks[0].ManagedDisk.ID) + assert.Equal(t, "DiskName3", *filteredDisks[1].Name) + + disks = []compute.DataDisk{} + filteredDisks = filterDetachingDisks(disks) + assert.Equal(t, 0, len(filteredDisks)) +} diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_standard.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_standard.go index 995609d6899..93440be6aa6 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_standard.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_standard.go @@ -42,8 +42,7 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri return err } - disks := make([]compute.DataDisk, len(*vm.StorageProfile.DataDisks)) - copy(disks, *vm.StorageProfile.DataDisks) + disks := filterDetachingDisks(*vm.StorageProfile.DataDisks) if isManagedDisk { managedDisk := &compute.ManagedDiskParameters{ID: &diskURI} @@ -117,8 +116,7 @@ func (as *availabilitySet) DetachDisk(diskName, diskURI string, nodeName types.N return nil, err } - disks := make([]compute.DataDisk, len(*vm.StorageProfile.DataDisks)) - copy(disks, *vm.StorageProfile.DataDisks) + disks := filterDetachingDisks(*vm.StorageProfile.DataDisks) bFoundDisk := false for i, disk := range disks { diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_vmss.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_vmss.go index 664993085a5..2b237482f63 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_vmss.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_vmss.go @@ -44,8 +44,7 @@ func (ss *scaleSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod disks := []compute.DataDisk{} if vm.StorageProfile != nil && vm.StorageProfile.DataDisks != nil { - disks = make([]compute.DataDisk, len(*vm.StorageProfile.DataDisks)) - copy(disks, *vm.StorageProfile.DataDisks) + disks = filterDetachingDisks(*vm.StorageProfile.DataDisks) } if isManagedDisk { managedDisk := &compute.ManagedDiskParameters{ID: &diskURI} @@ -121,8 +120,7 @@ func (ss *scaleSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName disks := []compute.DataDisk{} if vm.StorageProfile != nil && vm.StorageProfile.DataDisks != nil { - disks = make([]compute.DataDisk, len(*vm.StorageProfile.DataDisks)) - copy(disks, *vm.StorageProfile.DataDisks) + disks = filterDetachingDisks(*vm.StorageProfile.DataDisks) } bFoundDisk := false for i, disk := range disks {