From f4d86b4fb24c3cd43dfd31b521c10b54ac0aa854 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 20 Mar 2020 15:04:46 +0800 Subject: [PATCH] guest add metadata cpu mode - live migrate if guest cpu mode is qemu, do not check host cpu mode - disk name generation replace '_' to '-' --- pkg/apis/compute/guest_const.go | 5 +++++ pkg/apis/scheduler/api.go | 1 + pkg/compute/models/guests.go | 2 +- pkg/compute/tasks/guest_live_migrate_task.go | 11 ++++++++--- pkg/hostman/guestman/qemu-kvm.go | 5 +++++ .../algorithm/predicates/guest/migrate_predicate.go | 3 ++- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pkg/apis/compute/guest_const.go b/pkg/apis/compute/guest_const.go index 1d1d34475e..3b3e3996b2 100644 --- a/pkg/apis/compute/guest_const.go +++ b/pkg/apis/compute/guest_const.go @@ -150,6 +150,11 @@ const ( HYPERVISOR_DEFAULT = HYPERVISOR_KVM ) +const ( + CPU_MODE_QEMU = "qemu" + CPU_MODE_HOST = "host" +) + var VM_RUNNING_STATUS = []string{VM_START_START, VM_STARTING, VM_RUNNING, VM_BLOCK_STREAM, VM_BLOCK_STREAM_FAIL} var VM_CREATING_STATUS = []string{VM_CREATE_NETWORK, VM_CREATE_DISK, VM_START_DEPLOY, VM_DEPLOYING} diff --git a/pkg/apis/scheduler/api.go b/pkg/apis/scheduler/api.go index 45ad6e2896..dfd313e694 100644 --- a/pkg/apis/scheduler/api.go +++ b/pkg/apis/scheduler/api.go @@ -77,6 +77,7 @@ type ScheduleInput struct { LiveMigrate bool `json:"live_migrate"` CpuDesc string `json:"cpu_desc"` CpuMicrocode string `json:"cpu_microcode"` + CpuMode string `json:"cpu_mode"` PendingUsages []jsonutils.JSONObject } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 3e5be6034c..14dbce23fb 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3151,7 +3151,7 @@ func (self *SGuest) createDiskOnStorage(ctx context.Context, userCred mcclient.T lockman.LockClass(ctx, QuotaManager, self.ProjectId) defer lockman.ReleaseClass(ctx, QuotaManager, self.ProjectId) - diskName := fmt.Sprintf("vdisk_%s_%d", self.Name, time.Now().UnixNano()) + diskName := fmt.Sprintf("vdisk-%s-%d", self.Name, time.Now().UnixNano()) billingType := billing_api.BILLING_TYPE_POSTPAID billingCycle := "" diff --git a/pkg/compute/tasks/guest_live_migrate_task.go b/pkg/compute/tasks/guest_live_migrate_task.go index 71027cd7c3..1664eb408a 100644 --- a/pkg/compute/tasks/guest_live_migrate_task.go +++ b/pkg/compute/tasks/guest_live_migrate_task.go @@ -59,9 +59,14 @@ func (self *GuestMigrateTask) GetSchedParams() (*schedapi.ScheduleInput, error) guestStatus, _ := self.Params.GetString("guest_status") if !jsonutils.QueryBoolean(self.Params, "is_rescue_mode", false) && (guestStatus == api.VM_RUNNING || guestStatus == api.VM_SUSPEND) { schedDesc.LiveMigrate = true - host := guest.GetHost() - schedDesc.CpuDesc = host.CpuDesc - schedDesc.CpuMicrocode = host.CpuMicrocode + if guest.GetMetadata("__cpu_mode", self.UserCred) != api.CPU_MODE_QEMU { + host := guest.GetHost() + schedDesc.CpuDesc = host.CpuDesc + schedDesc.CpuMicrocode = host.CpuMicrocode + schedDesc.CpuMode = api.CPU_MODE_HOST + } else { + schedDesc.CpuMode = api.CPU_MODE_QEMU + } } return schedDesc, nil } diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index d8a1bfb0fb..0483965005 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -1294,6 +1294,11 @@ func (s *SKVMGuestInstance) OnResumeSyncMetadataInfo() { if options.HostOptions.HugepagesOption == "native" { meta.Set("__hugepage", jsonutils.NewString("native")) } + if !options.HostOptions.HostCpuPassthrough || s.getOsname() == OS_NAME_MACOS { + meta.Set("__cpu_mode", jsonutils.NewString(compute.CPU_MODE_QEMU)) + } else { + meta.Set("__cpu_mode", jsonutils.NewString(compute.CPU_MODE_HOST)) + } if s.syncMeta != nil { meta.Update(s.syncMeta) } diff --git a/pkg/scheduler/algorithm/predicates/guest/migrate_predicate.go b/pkg/scheduler/algorithm/predicates/guest/migrate_predicate.go index 522a89532b..95df299053 100644 --- a/pkg/scheduler/algorithm/predicates/guest/migrate_predicate.go +++ b/pkg/scheduler/algorithm/predicates/guest/migrate_predicate.go @@ -15,6 +15,7 @@ package guest import ( + "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/scheduler/algorithm/predicates" "yunion.io/x/onecloud/pkg/scheduler/core" ) @@ -45,7 +46,7 @@ func (p *MigratePredicate) Execute(u *core.Unit, c core.Candidater) (bool, []cor return h.GetResult() } - if schedData.LiveMigrate { + if schedData.LiveMigrate && schedData.CpuMode != compute.CPU_MODE_QEMU { host := c.Getter().Host() if schedData.CpuDesc != host.CpuDesc { h.Exclude(predicates.ErrHostCpuModelIsNotMatchForLiveMigrate)