Skip to content

Commit 1719ce7

Browse files
authored
Merge pull request #81266 from andyzhangx/fix-detach-azuredisk-issue
fix: detach azure disk issue using dangling error
2 parents df65fdd + 1fe12be commit 1719ce7

File tree

5 files changed

+38
-10
lines changed

5 files changed

+38
-10
lines changed

pkg/volume/azure_dd/attacher.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (a *azureDiskAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (
8787
klog.V(2).Infof("Attach operation successful: volume %q attached to node %q.", volumeSource.DataDiskURI, nodeName)
8888
} else {
8989
klog.V(2).Infof("Attach volume %q to instance %q failed with %v", volumeSource.DataDiskURI, nodeName, err)
90-
return "", fmt.Errorf("Attach volume %q to instance %q failed with %v", volumeSource.DiskName, nodeName, err)
90+
return "", err
9191
}
9292
}
9393

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common.go

+28
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ package azure
1919
import (
2020
"context"
2121
"fmt"
22+
"path"
2223
"time"
2324

2425
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-03-01/compute"
2526

2627
"k8s.io/apimachinery/pkg/types"
2728
kwait "k8s.io/apimachinery/pkg/util/wait"
2829
cloudprovider "k8s.io/cloud-provider"
30+
volerr "k8s.io/cloud-provider/volume/errors"
2931
"k8s.io/klog"
3032
"k8s.io/utils/keymutex"
3133
)
@@ -93,6 +95,32 @@ func (c *controllerCommon) getNodeVMSet(nodeName types.NodeName) (VMSet, error)
9395
// AttachDisk attaches a vhd to vm. The vhd must exist, can be identified by diskName, diskURI.
9496
// return (lun, error)
9597
func (c *controllerCommon) AttachDisk(isManagedDisk bool, diskName, diskURI string, nodeName types.NodeName, cachingMode compute.CachingTypes) (int32, error) {
98+
if isManagedDisk {
99+
diskName := path.Base(diskURI)
100+
resourceGroup, err := getResourceGroupFromDiskURI(diskURI)
101+
if err != nil {
102+
return -1, err
103+
}
104+
105+
ctx, cancel := getContextWithCancel()
106+
defer cancel()
107+
108+
disk, err := c.cloud.DisksClient.Get(ctx, resourceGroup, diskName)
109+
if err != nil {
110+
return -1, err
111+
}
112+
113+
if disk.ManagedBy != nil {
114+
attachErr := fmt.Sprintf(
115+
"disk(%s) already attached to node(%s), could not be attached to node(%s)",
116+
diskURI, *disk.ManagedBy, nodeName)
117+
attachedNode := path.Base(*disk.ManagedBy)
118+
klog.V(2).Infof("found dangling volume %s attached to node %s", diskURI, attachedNode)
119+
danglingErr := volerr.NewDanglingError(attachErr, types.NodeName(attachedNode), "")
120+
return -1, danglingErr
121+
}
122+
}
123+
96124
vmset, err := c.getNodeVMSet(nodeName)
97125
if err != nil {
98126
return -1, err

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_common_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ func TestCommonAttachDisk(t *testing.T) {
5353
desc: "correct LUN and no error shall be returned if everything is good",
5454
vmList: map[string]string{"vm1": "PowerState/Running"},
5555
nodeName: "vm1",
56-
expectedLun: 1,
57-
expectedErr: false,
56+
expectedLun: -1,
57+
expectedErr: true,
5858
},
5959
}
6060

@@ -73,7 +73,7 @@ func TestCommonAttachDisk(t *testing.T) {
7373

7474
lun, err := common.AttachDisk(true, "", diskURI, test.nodeName, compute.CachingTypesReadOnly)
7575
assert.Equal(t, test.expectedLun, lun, "TestCase[%d]: %s", i, test.desc)
76-
assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc)
76+
assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s, return error: %v", i, test.desc, err)
7777
}
7878
}
7979

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_standard.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ func (as *availabilitySet) DetachDisk(diskName, diskURI string, nodeName types.N
118118

119119
bFoundDisk := false
120120
for i, disk := range disks {
121-
if disk.Lun != nil && (disk.Name != nil && diskName != "" && *disk.Name == diskName) ||
122-
(disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && *disk.Vhd.URI == diskURI) ||
123-
(disk.ManagedDisk != nil && diskURI != "" && *disk.ManagedDisk.ID == diskURI) {
121+
if disk.Lun != nil && (disk.Name != nil && diskName != "" && strings.EqualFold(*disk.Name, diskName)) ||
122+
(disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && strings.EqualFold(*disk.Vhd.URI, diskURI)) ||
123+
(disk.ManagedDisk != nil && diskURI != "" && strings.EqualFold(*disk.ManagedDisk.ID, diskURI)) {
124124
// found the disk
125125
klog.V(2).Infof("azureDisk - detach disk: name %q uri %q", diskName, diskURI)
126126
disks = append(disks[:i], disks[i+1:]...)

staging/src/k8s.io/legacy-cloud-providers/azure/azure_controller_vmss.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ func (ss *scaleSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName
123123
}
124124
bFoundDisk := false
125125
for i, disk := range disks {
126-
if disk.Lun != nil && (disk.Name != nil && diskName != "" && *disk.Name == diskName) ||
127-
(disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && *disk.Vhd.URI == diskURI) ||
128-
(disk.ManagedDisk != nil && diskURI != "" && *disk.ManagedDisk.ID == diskURI) {
126+
if disk.Lun != nil && (disk.Name != nil && diskName != "" && strings.EqualFold(*disk.Name, diskName)) ||
127+
(disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && strings.EqualFold(*disk.Vhd.URI, diskURI)) ||
128+
(disk.ManagedDisk != nil && diskURI != "" && strings.EqualFold(*disk.ManagedDisk.ID, diskURI)) {
129129
// found the disk
130130
klog.V(2).Infof("azureDisk - detach disk: name %q uri %q", diskName, diskURI)
131131
disks = append(disks[:i], disks[i+1:]...)

0 commit comments

Comments
 (0)