diff --git a/pkg/compute/guestdrivers/cloudpods.go b/pkg/compute/guestdrivers/cloudpods.go index a445cf1907..a2e6c53b89 100644 --- a/pkg/compute/guestdrivers/cloudpods.go +++ b/pkg/compute/guestdrivers/cloudpods.go @@ -15,11 +15,14 @@ package guestdrivers import ( + "yunion.io/x/pkg/utils" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" + "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -85,6 +88,16 @@ func (self *SCloudpodsGuestDriver) IsSupportLiveMigrate() bool { return true } +func (self *SCloudpodsGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *models.SDisk, storage *models.SStorage) error { + if guest.GetDiskIndex(disk.Id) <= 0 && guest.Status == api.VM_RUNNING { + return httperrors.NewUnsupportOperationError("Cann't online resize root disk") + } + if !utils.IsInStringArray(guest.Status, []string{api.VM_READY, api.VM_RUNNING}) { + return httperrors.NewServerStatusError("Cannot resize disk when guest in status %s", guest.Status) + } + return nil +} + func (self *SCloudpodsGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} keys.SBaseProjectQuotaKeys = quotas.OwnerIdProjectQuotaKeys(scope, ownerId) diff --git a/pkg/compute/tasks/guest_stop_task.go b/pkg/compute/tasks/guest_stop_task.go index a468dea0a3..0adddfab35 100644 --- a/pkg/compute/tasks/guest_stop_task.go +++ b/pkg/compute/tasks/guest_stop_task.go @@ -62,9 +62,12 @@ func (self *GuestStopTask) stopGuest(ctx context.Context, guest *models.SGuest) func (self *GuestStopTask) OnGuestStopTaskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { db.OpsLog.LogEvent(guest, db.ACT_STOP, guest.GetShortDesc(ctx), self.UserCred) models.HostManager.ClearSchedDescCache(guest.HostId) + if guest.Status != api.VM_READY { // for kvm + guest.SetStatus(self.GetUserCred(), api.VM_READY, "") + } logclient.AddActionLogWithStartable(self, guest, logclient.ACT_VM_STOP, "success", self.UserCred, true) self.SetStageComplete(ctx, nil) - if guest.Status == api.VM_READY && guest.DisableDelete.IsFalse() && guest.ShutdownBehavior == api.SHUTDOWN_TERMINATE { + if guest.DisableDelete.IsFalse() && guest.ShutdownBehavior == api.SHUTDOWN_TERMINATE { guest.StartAutoDeleteGuestTask(ctx, self.UserCred, "") return } diff --git a/pkg/multicloud/cloudpods/image.go b/pkg/multicloud/cloudpods/image.go index e3f5a78108..c5de5d0c2c 100644 --- a/pkg/multicloud/cloudpods/image.go +++ b/pkg/multicloud/cloudpods/image.go @@ -91,7 +91,7 @@ func (self *SImage) GetOsType() cloudprovider.TOsType { } func (self *SImage) GetOsDist() string { - osDist, ok := self.Properties["os_dist"] + osDist, ok := self.Properties["os_distribution"] if ok { return osDist } @@ -107,6 +107,10 @@ func (self *SImage) GetOsVersion() string { } func (self *SImage) GetOsArch() string { + osArch, ok := self.Properties["os_arch"] + if ok { + return osArch + } return self.OsArch }