From 0bda9e7514e37ad94ec1da4534e8c4f0a056df2d Mon Sep 17 00:00:00 2001 From: rainzm Date: Wed, 23 Sep 2020 15:32:01 +0800 Subject: [PATCH] feat(region): sync CapacityUsed for Storage --- pkg/compute/models/storages.go | 56 ++++++++++++++++++++++++++++++++++ pkg/compute/options/options.go | 2 ++ pkg/compute/service/service.go | 2 ++ 3 files changed, 60 insertions(+) diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 4ad4820833..8dd4f8bf48 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -758,6 +758,58 @@ func (self *SStorage) syncRemoveCloudStorage(ctx context.Context, userCred mccli return err } +var CapacityUsedCloudStorageProvider = []string{ + api.CLOUD_PROVIDER_VMWARE, +} + +func (sm *SStorageManager) SyncCapacityUsedForStorage(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { + cpSubQ := CloudproviderManager.Query("id").In("provider", CapacityUsedCloudStorageProvider).SubQuery() + sQ := sm.Query() + sQ = sQ.Join(cpSubQ, sqlchemy.Equals(sQ.Field("manager_id"), cpSubQ.Field("id"))) + storages := make([]SStorage, 0, 5) + err := db.FetchModelObjects(sm, sQ, &storages) + if err != nil { + log.Errorf("unable to fetch storages with sql %q: %v", sQ.String(), err) + } + for i := range storages { + err := storages[i].SyncCapacityUsed(ctx) + if err != nil { + log.Errorf("unable to sync CapacityUsed for storage %q: %v", storages[i].Id, err) + } + } +} + +func (s *SStorage) SyncCapacityUsed(ctx context.Context) error { + cp := s.GetCloudprovider() + if cp == nil { + return errors.Wrapf(errors.ErrNotFound, "no cloudprovider for storage %s", s.Id) + } + if !utils.IsInStringArray(cp.Provider, CapacityUsedCloudStorageProvider) { + return nil + } + icp, err := cp.GetProvider() + if err != nil { + return errors.Wrap(err, "GetProvider") + } + iregion, err := icp.GetOnPremiseIRegion() + if err != nil { + return errors.Wrap(err, "GetOnPremiseIRegion") + } + cloudStorage, err := iregion.GetIStorageById(s.ExternalId) + if err != nil { + return errors.Wrap(err, "GetIStorageById") + } + capacityUsed := cloudStorage.GetCapacityUsedMB() + if s.ActualCapacityUsed == capacityUsed { + return nil + } + _, err = db.UpdateWithLock(ctx, s, func() error { + s.ActualCapacityUsed = capacityUsed + return nil + }) + return err +} + func (self *SStorage) syncWithCloudStorage(ctx context.Context, userCred mcclient.TokenCredential, extStorage cloudprovider.ICloudStorage, provider *SCloudprovider) error { diff, err := db.UpdateWithLock(ctx, self, func() error { // self.Name = extStorage.GetName() @@ -767,6 +819,9 @@ func (self *SStorage) syncWithCloudStorage(ctx context.Context, userCred mcclien if capacity := extStorage.GetCapacityMB(); capacity != 0 { self.Capacity = capacity } + if capacity := extStorage.GetCapacityUsedMB(); capacity != 0 { + self.ActualCapacityUsed = capacity + } self.StorageConf = extStorage.GetStorageConf() self.Enabled = tristate.NewFromBool(extStorage.GetEnabled()) @@ -807,6 +862,7 @@ func (manager *SStorageManager) newFromCloudStorage(ctx context.Context, userCre storage.MediumType = extStorage.GetMediumType() storage.StorageConf = extStorage.GetStorageConf() storage.Capacity = extStorage.GetCapacityMB() + storage.ActualCapacityUsed = extStorage.GetCapacityUsedMB() storage.Cmtbound = 1.0 storage.Enabled = tristate.NewFromBool(extStorage.GetEnabled()) diff --git a/pkg/compute/options/options.go b/pkg/compute/options/options.go index b462bb0a16..c88980176b 100644 --- a/pkg/compute/options/options.go +++ b/pkg/compute/options/options.go @@ -143,6 +143,8 @@ type ComputeOptions struct { EnableAutoRenameProject bool `help:"when it set true, auto create project will rename when cloud project name changed" default:"false"` + SyncStorageCapacityUsedIntervalMinutes int `help:"interval sync storage capacity used" default:"10"` + SCapabilityOptions SASControllerOptions common_options.CommonOptions diff --git a/pkg/compute/service/service.go b/pkg/compute/service/service.go index 0fcb57cf9c..d30a562d30 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -135,6 +135,8 @@ func StartService() { cron.AddJobAtIntervalsWithStartRun("AutoSyncCloudaccountTask", time.Duration(opts.CloudAutoSyncIntervalSeconds)*time.Second, models.CloudaccountManager.AutoSyncCloudaccountTask, true) cron.AddJobAtIntervalsWithStartRun("ReconcileBackupGuests", time.Duration(opts.ReconcileGuestBackupIntervalSeconds)*time.Second, models.GuestManager.ReconcileBackupGuests, true) + cron.AddJobAtIntervalsWithStartRun("SyncCapacityUsedForStorage", time.Duration(opts.SyncStorageCapacityUsedIntervalMinutes)*time.Minute, models.StorageManager.SyncCapacityUsedForStorage, true) + cron.AddJobEveryFewHour("AutoDiskSnapshot", 1, 5, 0, models.DiskManager.AutoDiskSnapshot, false) cron.AddJobEveryFewHour("SnapshotsCleanup", 1, 35, 0, models.SnapshotManager.CleanupSnapshots, false) cron.AddJobEveryFewHour("AutoSyncExtDiskSnapshot", 1, 10, 0, models.DiskManager.AutoSyncExtDiskSnapshot, false)