Skip to content

Commit 032e05c

Browse files
committed
Fixes the disk device diff bug after attching it to instance
1 parent 8179bdc commit 032e05c

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/bosh-alicloud-cpi/action/attach_disk.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,12 @@ func (a AttachDiskMethod) attach(vmCID apiv1.VMCID, diskCID apiv1.DiskCID, cpiVe
6868
err := a.disks.ChangeDiskStatus(diskCid, alicloud.DiskStatusInUse, func(disk *ecs.Disk) (bool, error) {
6969
switch alicloud.DiskStatus(disk.Status) {
7070
case alicloud.DiskStatusInUse:
71-
device = alicloud.AmendDiskPath(disk.Device, alicloud.DiskCategory(disk.Category))
71+
inst, er := a.instances.GetInstance(instCid)
72+
if er == nil {
73+
device = a.disks.GetDiskPath(disk.Device, diskCid, inst.InstanceType, alicloud.DiskCategory(disk.Category))
74+
} else {
75+
device = a.disks.GetDiskPath(disk.Device, diskCid, "", alicloud.DiskCategory(disk.Category))
76+
}
7277
return true, nil
7378
case alicloud.DiskStatusAvailable:
7479
return false, a.disks.AttachDisk(instCid, diskCid)

src/bosh-alicloud-cpi/alicloud/disk_manager.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
package alicloud
55

66
import (
7+
"strings"
8+
9+
util "github.com/alibabacloud-go/tea-utils/service"
710
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
811

912
"encoding/json"
@@ -38,6 +41,8 @@ type DiskManager interface {
3841

3942
WaitForDiskStatus(diskCid string, toStatus DiskStatus) (string, error)
4043
ChangeDiskStatus(cid string, toStatus DiskStatus, checkFunc func(*ecs.Disk) (bool, error)) error
44+
45+
GetDiskPath(path, diskId, instanceType string, category DiskCategory) string
4146
}
4247

4348
type DiskManagerImpl struct {
@@ -362,6 +367,53 @@ func AmendDiskPath(path string, category DiskCategory) string {
362367
return path
363368
}
364369

370+
func (a DiskManagerImpl) GetDiskPath(path, diskId, instanceType string, category DiskCategory) string {
371+
amendPath := AmendDiskPath(path, category)
372+
373+
if instanceType == "" || diskId == "" {
374+
return amendPath
375+
}
376+
377+
conn, err := a.config.EcsTeaClient("")
378+
if err != nil {
379+
a.log("EcsTeaClient", err, nil, "")
380+
return amendPath
381+
}
382+
383+
invoker := NewInvoker()
384+
invoker.AddCatcher(CreateInstanceCatcher_IdempotentProcessing)
385+
invoker.AddCatcher(CreateInstanceCatcher_TokenProcessing)
386+
invoker.AddCatcher(CreateInstanceCatcher_IpUsed)
387+
invoker.AddCatcher(CreateInstanceCatcher_IpUsed2)
388+
389+
action := "DescribeInstanceTypes"
390+
request := map[string]interface{}{
391+
"InstanceTypes.1": instanceType,
392+
"NvmeSupport": "required",
393+
}
394+
runtime := util.RuntimeOptions{}
395+
runtime.SetAutoretry(true)
396+
err = invoker.Run(func() error {
397+
resp, e := conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2014-05-26"), StringPointer("AK"), nil, request, &runtime)
398+
if e != nil {
399+
return e
400+
}
401+
if resp["InstanceTypes"] != nil &&
402+
resp["InstanceTypes"].(map[string]interface{})["InstanceType"] != nil &&
403+
len(resp["InstanceTypes"].(map[string]interface{})["InstanceType"].([]interface{})) > 0 {
404+
amendPath = "/dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_" + strings.Split(diskId, "-")[1]
405+
} else {
406+
amendPath = "/dev/disk/by-id/virtio-" + strings.Split(diskId, "-")[1]
407+
}
408+
return e
409+
})
410+
if err != nil {
411+
a.log(action, err, request, "")
412+
}
413+
414+
return amendPath
415+
}
416+
365417
func DescribeDisks(client *ecs.Client, diskId string) (disk *ecs.Disk, err error) {
366418
args := ecs.CreateDescribeDisksRequest()
367419
bytes, _ := json.Marshal([]string{diskId})

0 commit comments

Comments
 (0)