From 0fcf03b4b855586ea28a2f45c5f117f84d8f6d7b Mon Sep 17 00:00:00 2001 From: ioito Date: Wed, 24 Apr 2019 21:48:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E9=87=8D=E8=A3=85=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/base.go | 4 ++++ pkg/compute/guestdrivers/openstack.go | 4 ++++ pkg/compute/models/disks.go | 5 +++++ pkg/compute/models/guest_actions.go | 20 +++++++++++++++++--- pkg/compute/models/guestdrivers.go | 1 + pkg/compute/models/guests.go | 14 -------------- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 47fb9fe27d..45d15ebed8 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -112,6 +112,10 @@ func (self *SBaseGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{}, fmt.Errorf("This Guest driver dose not implement GetRebuildRootStatus") } +func (self *SBaseGuestDriver) IsRebuildRootSupportChangeImage() bool { + return true +} + func (self *SBaseGuestDriver) GetChangeConfigStatus() ([]string, error) { return []string{}, fmt.Errorf("This Guest driver dose not implement GetChangeConfigStatus") } diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index 0ea8f953b9..aa66bd3a25 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -78,6 +78,10 @@ func (self *SOpenStackGuestDriver) IsNeedRestartForResetLoginInfo() bool { return false } +func (self *SOpenStackGuestDriver) IsRebuildRootSupportChangeImage() bool { + return false +} + func (self *SOpenStackGuestDriver) GetDeployStatus() ([]string, error) { return []string{api.VM_RUNNING}, nil } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 295dd94515..3bea2ed01b 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -870,6 +870,11 @@ func (self *SDisk) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenC } func (self *SDisk) GetTemplateId() string { + imageObj, err := CachedimageManager.FetchById(self.TemplateId) + if err != nil || imageObj == nil { + log.Errorf("failed to found disk %s(%s) templateId", self.Name, self.Id) + return "" + } return self.TemplateId } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 3b0079979f..f32d7163c1 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1123,6 +1123,16 @@ func (self *SGuest) PerformRebuildRoot(ctx context.Context, userCred mcclient.To return nil, httperrors.NewInputParameterError(err.Error()) } + if !self.GetDriver().IsRebuildRootSupportChangeImage() && len(imageId) > 0 { + templateId := self.GetTemplateId() + if len(templateId) == 0 { + return nil, httperrors.NewBadRequestError("No template for root disk, cannot rebuild root") + } + if imageId != templateId { + return nil, httperrors.NewInputParameterError("%s not support rebuild root with a different image", self.GetDriver().GetHypervisor()) + } + } + if !utils.IsInStringArray(self.Status, rebuildStatus) { return nil, httperrors.NewInvalidStatusError("Cannot reset root in status %s", self.Status) } @@ -1163,13 +1173,17 @@ func (self *SGuest) PerformRebuildRoot(ctx context.Context, userCred mcclient.To return nil, self.StartRebuildRootTask(ctx, userCred, imageId, needStop, autoStart, passwd, resetPasswd, allDisks) } +func (self *SGuest) GetTemplateId() string { + gdc := self.CategorizeDisks() + return gdc.Root.GetTemplateId() +} + func (self *SGuest) StartRebuildRootTask(ctx context.Context, userCred mcclient.TokenCredential, imageId string, needStop, autoStart bool, passwd string, resetPasswd bool, allDisk bool) error { data := jsonutils.NewDict() if len(imageId) == 0 { - gdc := self.CategorizeDisks() - imageId = gdc.Root.GetTemplateId() + imageId = self.GetTemplateId() if len(imageId) == 0 { - return httperrors.NewBadRequestError("No template for root disk") + return httperrors.NewBadRequestError("No template for root disk, cannot rebuild root") } } data.Set("image_id", jsonutils.NewString(imageId)) diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index abcbe7cc77..a4c5f06c40 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -127,6 +127,7 @@ type IGuestDriver interface { ValidateResizeDisk(guest *SGuest, disk *SDisk, storage *SStorage) error CanKeepDetachDisk() bool IsNeedRestartForResetLoginInfo() bool + IsRebuildRootSupportChangeImage() bool RequestDeleteDetachedDisk(ctx context.Context, disk *SDisk, task taskman.ITask, isPurge bool) error StartGuestDetachdiskTask(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, params *jsonutils.JSONDict, parentTaskId string) error diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 92f6846a9f..7a2b69d560 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3510,20 +3510,6 @@ func (manager *SGuestManager) GetSpecIdent(spec *jsonutils.JSONDict) []string { return specKeys } -func (self *SGuest) GetTemplateId() string { - guestdisks := self.GetDisks() - for _, guestdisk := range guestdisks { - disk := guestdisk.GetDisk() - if disk != nil { - templateId := disk.GetTemplateId() - if len(templateId) > 0 { - return templateId - } - } - } - return "" -} - func (self *SGuest) GetShortDesc(ctx context.Context) *jsonutils.JSONDict { desc := self.SVirtualResourceBase.GetShortDesc(ctx) desc.Set("mem", jsonutils.NewInt(int64(self.VmemSize)))