diff --git a/cmd/climc/shell/disks.go b/cmd/climc/shell/disks.go index 3f4d35033b..36654af96e 100644 --- a/cmd/climc/shell/disks.go +++ b/cmd/climc/shell/disks.go @@ -10,11 +10,12 @@ import ( func init() { type DiskListOptions struct { BaseListOptions - Unused bool `help:"Show unused disks"` - Share bool `help:"Show Share storage disks"` - Local bool `help:"Show Local storage disks"` - Guest string `help:"Guest ID or name"` - Storage string `help:"Storage ID or name"` + Unused bool `help:"Show unused disks"` + Share bool `help:"Show Share storage disks"` + Local bool `help:"Show Local storage disks"` + Guest string `help:"Guest ID or name"` + Storage string `help:"Storage ID or name"` + Provider string `help:"Provider for disk" choices:"Aliyun|VMware"` } R(&DiskListOptions{}, "disk-list", "List virtual disks", func(s *mcclient.ClientSession, suboptions *DiskListOptions) error { params := FetchPagingParams(suboptions.BaseListOptions) @@ -33,6 +34,9 @@ func init() { if len(suboptions.Storage) > 0 { params.Add(jsonutils.NewString(suboptions.Storage), "storage") } + if len(suboptions.Provider) > 0 { + params.Add(jsonutils.NewString(suboptions.Provider), "provider") + } result, err := modules.Disks.List(s, params) if err != nil { return err diff --git a/pkg/compute/hostdrivers/aliyun.go b/pkg/compute/hostdrivers/aliyun.go index f82adef93b..0bcfa18005 100644 --- a/pkg/compute/hostdrivers/aliyun.go +++ b/pkg/compute/hostdrivers/aliyun.go @@ -4,6 +4,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" ) @@ -55,12 +56,19 @@ func (self *SAliyunHostDriver) RequestAllocateDiskOnStorage(host *models.SHost, return err } else { size = size >> 10 - if disk, err := iCloudStorage.CreateIDisk(disk.GetName(), int(size), ""); err != nil { + if iDisk, err := iCloudStorage.CreateIDisk(disk.GetName(), int(size), ""); err != nil { return err } else { + if _, err := disk.GetModelManager().TableSpec().Update(disk, func() error { + disk.ExternalId = iDisk.GetGlobalId() + return nil + }); err != nil { + log.Errorf("Update disk externalId err: %v", err) + return err + } data := jsonutils.NewDict() - data.Add(jsonutils.NewInt(int64(disk.GetDiskSizeMB())), "disk_size") - data.Add(jsonutils.NewString(disk.GetDiskFormat()), "disk_format") + data.Add(jsonutils.NewInt(int64(iDisk.GetDiskSizeMB())), "disk_size") + data.Add(jsonutils.NewString(iDisk.GetDiskFormat()), "disk_format") task.ScheduleRun(data) } } @@ -87,7 +95,7 @@ func (self *SAliyunHostDriver) RequestResizeDiskOnHost(host *models.SHost, stora return err } else if iDisk, err := iCloudStorage.GetIDisk(disk.GetExternalId()); err != nil { return err - } else if err := iDisk.Resize(size); err != nil { + } else if err := iDisk.Resize(size >> 10); err != nil { return err } else { task.ScheduleRun(jsonutils.Marshal(map[string]int64{"disk_size": size})) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index ff710444d3..17f1e23bc4 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -115,6 +115,14 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu sq := storages.Query(storages.Field("id")).Filter(sqlchemy.In(storages.Field("storage_type"), STORAGE_LOCAL_TYPES)) q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } + if provier, _ := queryDict.GetString("provider"); len(provier) > 0 { + cloudprovider := CloudproviderManager.Query().SubQuery() + sq := storages.Query(storages.Field("id")).Join(cloudprovider, + sqlchemy.AND( + sqlchemy.Equals(cloudprovider.Field("id"), storages.Field("manager_id")), + sqlchemy.Equals(cloudprovider.Field("provider"), provier))) + q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) + } guestId, _ := queryDict.GetString("guest") if len(guestId) != 0 { guest := GuestManager.FetchGuestById(guestId) diff --git a/pkg/compute/tasks/disk_create_task.go b/pkg/compute/tasks/disk_create_task.go index 35b6c035f1..46383e7a83 100644 --- a/pkg/compute/tasks/disk_create_task.go +++ b/pkg/compute/tasks/disk_create_task.go @@ -4,6 +4,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" @@ -54,9 +55,15 @@ func (self *DiskCreateTask) OnStartAllocateFailed(ctx context.Context, disk *mod func (self *DiskCreateTask) OnDiskReady(ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject) { diskSize, _ := data.Int("disk_size") - disk.DiskSize = int(diskSize) - disk.DiskFormat, _ = data.GetString("disk_format") - disk.AccessPath, _ = data.GetString("disk_path") + if _, err := disk.GetModelManager().TableSpec().Update(disk, func() error { + disk.DiskSize = int(diskSize) + disk.DiskFormat, _ = data.GetString("disk_format") + disk.AccessPath, _ = data.GetString("disk_path") + return nil + }); err != nil { + log.Errorf("update disk info error: %v", err) + } + disk.SetStatus(self.UserCred, models.DISK_READY, "") self.CleanHostSchedCache(disk) db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE, disk.GetShortDesc(), self.UserCred)