feat(region): Regularly and automatically synchronize the status of cloud accounts (#12750)

This commit is contained in:
Rain Zheng
2021-11-27 22:34:22 +08:00
committed by GitHub
parent 37e76cd37d
commit 486a1bb5b0
2 changed files with 44 additions and 0 deletions
+43
View File
@@ -1943,6 +1943,49 @@ func (self *SCloudaccount) CanSync() bool {
}
}
func (manager *SCloudaccountManager) AutoSyncCloudaccountStatusTask(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) {
if isStart && !options.Options.IsSlaveNode {
// mark all the records to be idle
CloudproviderRegionManager.initAllRecords()
CloudproviderManager.initAllRecords()
CloudaccountManager.initAllRecords()
}
q := manager.Query()
accounts := make([]SCloudaccount, 0)
err := db.FetchModelObjects(manager, q, &accounts)
if err != nil {
log.Errorf("Failed to fetch cloudaccount list to check status")
return
}
for i := range accounts {
if accounts[i].GetEnabled() && accounts[i].shouldProbeStatus() && accounts[i].needSync() && accounts[i].CanSync() {
id, name, account := accounts[i].Id, accounts[i].Name, &accounts[i]
cloudaccountPendingSyncsMutex.Lock()
if _, ok := cloudaccountPendingSyncs[id]; ok {
cloudaccountPendingSyncsMutex.Unlock()
continue
}
cloudaccountPendingSyncs[id] = struct{}{}
cloudaccountPendingSyncsMutex.Unlock()
RunSyncCloudAccountTask(ctx, func() {
defer func() {
cloudaccountPendingSyncsMutex.Lock()
defer cloudaccountPendingSyncsMutex.Unlock()
delete(cloudaccountPendingSyncs, id)
}()
log.Debugf("syncAccountStatus %s %s", id, name)
err := account.syncAccountStatus(ctx, userCred)
if err != nil {
log.Errorf("unable to syncAccountStatus for cloudaccount %s: %s", account.Id, err.Error())
}
account.markEndSync(userCred)
})
}
}
}
func (manager *SCloudaccountManager) AutoSyncCloudaccountTask(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) {
if isStart && !options.Options.IsSlaveNode {
// mark all the records to be idle
+1
View File
@@ -140,6 +140,7 @@ func StartService() {
cron.AddJobAtIntervalsWithStartRun("CalculateProjectQuotaUsages", time.Duration(opts.CalculateQuotaUsageIntervalSeconds)*time.Second, models.ProjectQuotaManager.CalculateQuotaUsages, true)
cron.AddJobAtIntervalsWithStartRun("CalculateDomainQuotaUsages", time.Duration(opts.CalculateQuotaUsageIntervalSeconds)*time.Second, models.DomainQuotaManager.CalculateQuotaUsages, true)
cron.AddJobAtIntervalsWithStartRun("CalculateInfrasQuotaUsages", time.Duration(opts.CalculateQuotaUsageIntervalSeconds)*time.Second, models.InfrasQuotaManager.CalculateQuotaUsages, true)
cron.AddJobAtIntervalsWithStartRun("AutoSyncCloudaccountStatusTask", time.Duration(opts.CloudAutoSyncIntervalSeconds)*time.Second, models.CloudaccountManager.AutoSyncCloudaccountStatusTask, true)
if opts.AutoReconcileBackupServers {
cron.AddJobAtIntervalsWithStartRun("ReconcileBackupGuests", time.Duration(opts.ReconcileGuestBackupIntervalSeconds)*time.Second, models.GuestManager.ReconcileBackupGuests, true)