From a93968e0d2590a3cad7ee3eccc248e6ef7ddc13c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 20 Mar 2019 14:37:37 +0800 Subject: [PATCH] fix: 1. vmware detch disk logic error 2. host add storage commit_rate 3. host enable netif failed if a fake ipaddr is given --- pkg/compute/guestdrivers/base.go | 4 ++ pkg/compute/guestdrivers/esxi.go | 28 ++++++------- pkg/compute/guestdrivers/managedvirtual.go | 49 +--------------------- pkg/compute/models/hosts.go | 43 ++++++++++++++----- pkg/compute/models/storages.go | 28 ++++++------- pkg/compute/tasks/guest_sync_task.go | 1 + pkg/util/esxi/storage.go | 13 ++++++ pkg/util/esxi/virtualmachine.go | 8 +++- 8 files changed, 87 insertions(+), 87 deletions(-) diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 5321e6c8c2..dea371d62d 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -235,3 +235,7 @@ func (self *SBaseGuestDriver) IsSupportEip() bool { func (self *SBaseGuestDriver) NeedStopForChangeSpec() bool { return true } + +func (self *SBaseGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { + return fmt.Errorf("SBaseGuestDriver: Not Implement") +} diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index ebc2abbb6b..e83ee8e7fb 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -38,10 +38,10 @@ func (self *SESXiGuestDriver) GetMinimalSysDiskSizeGb() int { return options.Options.DefaultDiskSizeMB / 1024 } -func (self *SESXiGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { - task.ScheduleRun(nil) - return nil -} +// func (self *SESXiGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +// task.ScheduleRun(nil) +// return nil +// } func (self *SESXiGuestDriver) GetMaxSecurityGroupCount() int { //暂不支持绑定安全组 @@ -49,11 +49,11 @@ func (self *SESXiGuestDriver) GetMaxSecurityGroupCount() int { } func (self *SESXiGuestDriver) GetDetachDiskStatus() ([]string, error) { - return []string{models.VM_READY}, nil + return []string{models.VM_READY, models.VM_RUNNING}, nil } func (self *SESXiGuestDriver) GetAttachDiskStatus() ([]string, error) { - return []string{models.VM_READY}, nil + return []string{models.VM_READY, models.VM_RUNNING}, nil } func (self *SESXiGuestDriver) GetChangeConfigStatus() ([]string, error) { @@ -64,14 +64,14 @@ func (self *SESXiGuestDriver) CanKeepDetachDisk() bool { return false } -func (self *SESXiGuestDriver) RequestDeleteDetachedDisk(ctx context.Context, disk *models.SDisk, task taskman.ITask, isPurge bool) error { - err := disk.RealDelete(ctx, task.GetUserCred()) - if err != nil { - return err - } - task.ScheduleRun(nil) - return nil -} +// func (self *SESXiGuestDriver) RequestDeleteDetachedDisk(ctx context.Context, disk *models.SDisk, task taskman.ITask, isPurge bool) error { +// err := disk.RealDelete(ctx, task.GetUserCred()) +// if err != nil { +// return err +// } +// task.ScheduleRun(nil) +// return nil +// } func (self *SESXiGuestDriver) RequestGuestHotAddIso(ctx context.Context, guest *models.SGuest, path string, task taskman.ITask) error { task.ScheduleRun(nil) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 6cbadcac2a..7c5f86a6cc 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -497,7 +497,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestSyncConfigOnHost(ctx context. return nil, err } for _, disk := range removed { - if err := iVM.DetachDisk(ctx, disk.GetId()); err != nil { + if err := iVM.DetachDisk(ctx, disk.GetGlobalId()); err != nil { return nil, err } } @@ -511,53 +511,6 @@ func (self *SManagedVirtualizedGuestDriver) RequestSyncConfigOnHost(ctx context. return nil } -/*func (self *SManagedVirtualizedGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { - taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { - if ihost, err := host.GetIHost(); err != nil { - return nil, err - } else if iVM, err := ihost.GetIVMById(guest.ExternalId); err != nil { - return nil, err - } else { - if fw_only, _ := task.GetParams().Bool("fw_only"); fw_only { - if err := iVM.SyncSecurityGroup(guest.SecgrpId, guest.GetSecgroupName(), guest.GetSecRules()); err != nil { - return nil, err - } - } else { - if iDisks, err := iVM.GetIDisks(); err != nil { - return nil, err - } else { - disks := make([]models.SDisk, 0) - for _, guestdisk := range guest.GetDisks() { - disk := guestdisk.GetDisk() - disks = append(disks, *disk) - } - - added := make([]models.SDisk, 0) - commondb := make([]models.SDisk, 0) - commonext := make([]cloudprovider.ICloudDisk, 0) - removed := make([]cloudprovider.ICloudDisk, 0) - - if err := compare.CompareSets(disks, iDisks, &added, &commondb, &commonext, &removed); err != nil { - return nil, err - } - for _, disk := range removed { - if err := iVM.DetachDisk(ctx, disk.GetId()); err != nil { - return nil, err - } - } - for _, disk := range added { - if err := iVM.AttachDisk(ctx, disk.ExternalId); err != nil { - return nil, err - } - } - } - } - } - return nil, nil - }) - return nil -}*/ - func (self *SManagedVirtualizedGuestDriver) RequestRenewInstance(guest *models.SGuest, bc billing.SBillingCycle) (time.Time, error) { iVM, err := guest.GetIVM() if err != nil { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index e1556945bd..aaca90f080 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -955,24 +955,43 @@ func (self *SHost) GetHardwareSpecification() *jsonutils.JSONDict { } type SStorageCapacity struct { - Capacity int - Used int - Wasted int - VCapacity int + Capacity int `json:"capacity,omitzero"` + Used int `json:"used_capacity,omitzero"` + Wasted int `json:"waste_capacity,omitzero"` + VCapacity int `json:"virtual_capacity,omitzero"` } -func (capa SStorageCapacity) GetFree() int { - return capa.VCapacity - capa.Used - capa.Wasted +func (cap *SStorageCapacity) GetFree() int { + return cap.VCapacity - cap.Used - cap.Wasted +} + +func (cap *SStorageCapacity) GetCommitRate() float64 { + if cap.Capacity > 0 { + return float64(int(float64(cap.Used)*100.0/float64(cap.Capacity)+0.5) / 100.0) + } else { + return 0.0 + } +} + +func (cap *SStorageCapacity) Add(cap2 SStorageCapacity) { + cap.Capacity += cap2.Capacity + cap.Used += cap2.Used + cap.Wasted += cap2.Wasted + cap.VCapacity += cap2.VCapacity +} + +func (cap *SStorageCapacity) ToJson() *jsonutils.JSONDict { + ret := jsonutils.Marshal(cap).(*jsonutils.JSONDict) + ret.Add(jsonutils.NewFloat(cap.GetCommitRate()), "commit_rate") + ret.Add(jsonutils.NewInt(int64(cap.GetFree())), "free_capacity") + return ret } func (self *SHost) GetAttachedStorageCapacity() SStorageCapacity { ret := SStorageCapacity{} storages := self.GetAttachedStorages("") for _, s := range storages { - ret.Capacity += s.GetCapacity() - ret.Used += s.GetUsedCapacity(tristate.True) - ret.Wasted += s.GetUsedCapacity(tristate.False) - ret.VCapacity += int(float32(s.GetCapacity()) * s.GetOvercommitBound()) + ret.Add(s.getStorageCapacity()) } return ret } @@ -2140,6 +2159,7 @@ func (self *SHost) getMoreDetails(ctx context.Context, extra *jsonutils.JSONDict extra.Add(jsonutils.NewInt(int64(capa.Wasted)), "storage_waste") extra.Add(jsonutils.NewInt(int64(capa.VCapacity)), "storage_virtual") extra.Add(jsonutils.NewInt(int64(capa.GetFree())), "storage_free") + extra.Add(jsonutils.NewFloat(capa.GetCommitRate()), "storage_commit_rate") extra.Add(self.GetHardwareSpecification(), "spec") // extra = self.SManagedResourceBase.getExtraDetails(ctx, extra) @@ -2985,6 +3005,9 @@ func (self *SHost) EnableNetif(ctx context.Context, userCred mcclient.TokenCrede } else if requireDesignatedIp { log.Errorf("Cannot allocate IP %s, not reachable", ipAddr) return fmt.Errorf("Cannot allocate IP %s, not reachable", ipAddr) + } else { + // the ipaddr is not usable, should be reset to empty + ipAddr = "" } } wire := netif.GetWire() diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 9f5ec361d2..d8f3537219 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -338,21 +338,21 @@ func (self *SStorage) GetStorageCachePath(mountPoint, imageCachePath string) str } } +func (self *SStorage) getStorageCapacity() SStorageCapacity { + capa := SStorageCapacity{} + + capa.Capacity = self.GetCapacity() + capa.Used = self.GetUsedCapacity(tristate.True) + capa.Wasted = self.GetUsedCapacity(tristate.False) + capa.VCapacity = int(float32(self.GetCapacity()) * self.GetOvercommitBound()) + + return capa +} + func (self *SStorage) getMoreDetails(extra *jsonutils.JSONDict) *jsonutils.JSONDict { - used := self.GetUsedCapacity(tristate.True) - waste := self.GetUsedCapacity(tristate.False) - vcapa := float32(self.GetCapacity()) * self.GetOvercommitBound() - extra.Add(jsonutils.NewInt(int64(used)), "used_capacity") - extra.Add(jsonutils.NewInt(int64(waste)), "waste_capacity") - extra.Add(jsonutils.NewFloat(float64(vcapa)), "virtual_capacity") - extra.Add(jsonutils.NewFloat(float64(vcapa-float32(used)-float32(waste))), "free_capacity") - if self.GetCapacity() > 0 { - value := float64(used * 1.0 / self.GetCapacity()) - value = float64(int(value*100+0.5) / 100.0) - extra.Add(jsonutils.NewFloat(value), "commit_rate") - } else { - extra.Add(jsonutils.NewFloat(0.0), "commit_rate") - } + capa := self.getStorageCapacity() + extra.Update(capa.ToJson()) + extra.Add(jsonutils.NewFloat(float64(self.GetOvercommitBound())), "commit_bound") info := self.getCloudProviderInfo() diff --git a/pkg/compute/tasks/guest_sync_task.go b/pkg/compute/tasks/guest_sync_task.go index 710abfe646..6d853cbba3 100644 --- a/pkg/compute/tasks/guest_sync_task.go +++ b/pkg/compute/tasks/guest_sync_task.go @@ -40,6 +40,7 @@ func (self *GuestSyncConfTask) OnSyncComplete(ctx context.Context, obj db.IStand db.OpsLog.LogEvent(guest, db.ACT_SYNC_CONF, nil, self.UserCred) self.SetStageComplete(ctx, guest.GetShortDesc(ctx)) } else if data.Contains("task") { + // XXX this is only applied to KVM, which will call task_complete twice self.SetStage("on_disk_sync_complete", nil) } else { self.OnDiskSyncComplete(ctx, guest, data) diff --git a/pkg/util/esxi/storage.go b/pkg/util/esxi/storage.go index 2cca88c460..20979e3bd3 100644 --- a/pkg/util/esxi/storage.go +++ b/pkg/util/esxi/storage.go @@ -683,3 +683,16 @@ func (self *SDatastore) RemoveDir(ctx context.Context, remotePath string) error func (self *SDatastore) IsSysDiskStore() bool { return true } + +func (self *SDatastore) MoveVmdk(ctx context.Context, srcPath string, dstPath string) error { + dm := object.NewVirtualDiskManager(self.manager.client.Client) + defer dm.Destroy(ctx) + + srcUrl := self.GetPathUrl(srcPath) + dstUrl := self.GetPathUrl(dstPath) + task, err := dm.MoveVirtualDisk(ctx, srcUrl, nil, dstUrl, nil, true) + if err != nil { + return err + } + return task.Wait(ctx) +} diff --git a/pkg/util/esxi/virtualmachine.go b/pkg/util/esxi/virtualmachine.go index 6ccdad303a..938b9eba1d 100644 --- a/pkg/util/esxi/virtualmachine.go +++ b/pkg/util/esxi/virtualmachine.go @@ -120,8 +120,14 @@ func (self *SVirtualMachine) UpdateVM(ctx context.Context, name string) error { return cloudprovider.ErrNotImplemented } +// TODO: detach disk to a separate directory, so as to keep disk independent of VM + func (self *SVirtualMachine) DetachDisk(ctx context.Context, diskId string) error { - return cloudprovider.ErrNotImplemented + vdisk, err := self.GetIDiskById(diskId) + if err != nil { + return err + } + return self.doDetachDisk(ctx, vdisk.(*SVirtualDisk), false) } func (self *SVirtualMachine) AttachDisk(ctx context.Context, diskId string) error {