feat(region): sync capacityUsed for storage after deploying or deleting guest

This commit is contained in:
rainzm
2020-09-25 10:33:45 +08:00
parent 0bda9e7514
commit 390cc11e7a
3 changed files with 77 additions and 0 deletions
+47
View File
@@ -3660,6 +3660,53 @@ func (self *SGuest) PerformRenew(ctx context.Context, userCred mcclient.TokenCre
return nil, nil
}
func (self *SGuest) GetStorages() []*SStorage {
disks := self.GetDisks()
storageMap := make(map[string]*SStorage)
for i := range disks {
storage := disks[i].GetStorage()
if _, ok := storageMap[storage.GetId()]; !ok {
storageMap[storage.GetId()] = storage
}
}
ret := make([]*SStorage, 0, len(storageMap))
for _, s := range storageMap {
ret = append(ret, s)
}
return ret
}
func (self *SGuest) SyncCapacityUsedForStorage(ctx context.Context, storageIds []string) error {
if self.Hypervisor != api.HYPERVISOR_ESXI {
return nil
}
var storages []*SStorage
if len(storageIds) == 0 {
storages = self.GetStorages()
} else {
q := StorageManager.Query()
if len(storageIds) == 1 {
q = q.Equals("id", storageIds[0])
} else {
q = q.In("id", storageIds[0])
}
ss := make([]SStorage, 0, len(storageIds))
err := db.FetchModelObjects(StorageManager, q, &ss)
if err != nil {
return errors.Wrap(err, "FetchModelObjects")
}
storages = make([]*SStorage, len(ss))
for i := range ss {
storages[i] = &ss[i]
}
}
for _, s := range storages {
err := s.SyncCapacityUsed(ctx)
return errors.Wrapf(err, "unable to SyncCapacityUsed for storage %q", s.GetId())
}
return nil
}
func (self *SGuest) startGuestRenewTask(ctx context.Context, userCred mcclient.TokenCredential, duration string, parentTaskId string) error {
self.SetStatus(userCred, api.VM_RENEWING, "")
data := jsonutils.NewDict()
+5
View File
@@ -109,6 +109,11 @@ func (self *GuestCreateTask) StartDeployGuest(ctx context.Context, guest *models
func (self *GuestCreateTask) OnDeployGuestDescComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
guest := obj.(*models.SGuest)
// sync capacityUsed for storage
err := guest.SyncCapacityUsedForStorage(ctx, nil)
if err != nil {
log.Errorf("unable to SyncCapacityUsedForStorage: %v", err)
}
// bind eip
{
+25
View File
@@ -36,6 +36,10 @@ type GuestDeleteTask struct {
SGuestBaseTask
}
var (
STORAGEIDS = "storage_ids"
)
func init() {
taskman.RegisterTask(GuestDeleteTask{})
}
@@ -251,6 +255,15 @@ func (self *GuestDeleteTask) OnPendingDeleteCompleteFailed(ctx context.Context,
}
func (self *GuestDeleteTask) StartDeleteGuest(ctx context.Context, guest *models.SGuest) {
// Temporary storageids to sync capacityUsed after delete
{
storages := guest.GetStorages()
storageIds := make([]string, len(storages))
for i := range storages {
storageIds[i] = storages[i].GetId()
}
self.Params.Set(STORAGEIDS, jsonutils.NewStringArray(storageIds))
}
// No snapshot
self.SetStage("OnGuestDetachDisksComplete", nil)
guest.GetDriver().RequestDetachDisksFromGuestForDelete(ctx, guest, self)
@@ -303,6 +316,18 @@ func (self *GuestDeleteTask) OnGuestDeleteComplete(ctx context.Context, obj db.I
guest.EjectIso(self.UserCred)
guest.DeleteEip(ctx, self.UserCred)
guest.GetDriver().OnDeleteGuestFinalCleanup(ctx, guest, self.UserCred)
// sync capacity used for storage
ja, err := self.Params.GetArray(STORAGEIDS)
if err == nil {
storageIds := make([]string, len(ja))
for i := range ja {
storageIds[i], _ = ja[i].GetString()
}
err = guest.SyncCapacityUsedForStorage(ctx, storageIds)
if err != nil {
log.Errorf("unable to SyncCapacityUsedForStoarage: %v", err)
}
}
self.DeleteGuest(ctx, guest)
}