From 0cbad8aea358c7f9eb4e7a347634ff96696e5f9d Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Tue, 1 Sep 2020 10:49:37 +0800 Subject: [PATCH] feature: emualated ssd support (#7701) Co-authored-by: Qiu Jian --- cmd/climc/shell/compute/disks.go | 8 ++++++++ pkg/compute/models/disks.go | 3 +++ pkg/compute/models/guestdisks.go | 3 +++ pkg/hostman/guestman/qemu-kvmhelper.go | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/cmd/climc/shell/compute/disks.go b/cmd/climc/shell/compute/disks.go index 3e05095f06..9615857336 100644 --- a/cmd/climc/shell/compute/disks.go +++ b/cmd/climc/shell/compute/disks.go @@ -149,6 +149,7 @@ func init() { AutoDelete string `help:"enable/disable auto delete of disk" choices:"enable|disable"` AutoSnapshot string `help:"enable/disable auto snapshot of disk" choices:"enable|disable"` DiskType string `help:"Disk type" choices:"data|volume"` + IsSsd *bool `help:"mark disk as ssd" negative:"no-is-ssd"` } R(&DiskUpdateOptions{}, "disk-update", "Update property of a virtual disk", func(s *mcclient.ClientSession, args *DiskUpdateOptions) error { params := jsonutils.NewDict() @@ -175,6 +176,13 @@ func init() { if len(args.DiskType) > 0 { params.Add(jsonutils.NewString(args.DiskType), "disk_type") } + if args.IsSsd != nil { + if *args.IsSsd { + params.Add(jsonutils.JSONTrue, "is_ssd") + } else { + params.Add(jsonutils.JSONFalse, "is_ssd") + } + } if params.Size() == 0 { return InvalidUpdateError() } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index a499c08958..33d2394f53 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -117,6 +117,9 @@ type SDisk struct { // # is persistent Nonpersistent bool `default:"false" list:"user" json:"nonpersistent"` + + // 是否标记为SSD磁盘 + IsSsd bool `nullable:"false" default:"false" list:"user" update:"user" create:"optional"` } func (manager *SDiskManager) GetContextManagers() [][]db.IModelManager { diff --git a/pkg/compute/models/guestdisks.go b/pkg/compute/models/guestdisks.go index d61013ea7c..3435d44ede 100644 --- a/pkg/compute/models/guestdisks.go +++ b/pkg/compute/models/guestdisks.go @@ -242,6 +242,9 @@ func (self *SGuestdisk) GetJsonDescAtHost(host *SHost) jsonutils.JSONObject { if len(dev) > 0 { desc.Add(jsonutils.NewString(dev), "dev") } + if disk.IsSsd { + desc.Add(jsonutils.JSONTrue, "is_ssd") + } return desc } diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index dc74a71903..392a7d6ad2 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -183,6 +183,7 @@ func (s *SKVMGuestInstance) GetDiskDeviceModel(driver string) string { func (s *SKVMGuestInstance) getVdiskDesc(disk jsonutils.JSONObject) string { diskIndex, _ := disk.Int("index") diskDriver, _ := disk.GetString("driver") + isSsd := jsonutils.QueryBoolean(disk, "is_ssd", false) var cmd = "" cmd += fmt.Sprintf(" -device %s", s.GetDiskDeviceModel(diskDriver)) @@ -197,6 +198,9 @@ func (s *SKVMGuestInstance) getVdiskDesc(disk jsonutils.JSONObject) string { cmd += fmt.Sprintf(",bus=ide.%d", diskIndex) } cmd += fmt.Sprintf(",id=drive_%d", diskIndex) + if isSsd { + cmd += ",rotation_rate=1" + } return cmd }