feat(region): sync CapacityUsed for Storage

This commit is contained in:
rainzm
2020-09-24 19:55:24 +08:00
parent fd14e7b6c8
commit 0bda9e7514
3 changed files with 60 additions and 0 deletions
+56
View File
@@ -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())
+2
View File
@@ -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
+2
View File
@@ -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)