diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index f3a0719374..a1cd09ccab 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -1390,6 +1390,47 @@ func syncPublicCloudProviderInfo( return nil } +func syncOnPremiseCloudProviderStorage(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, iregion cloudprovider.ICloudRegion, driver cloudprovider.ICloudProvider, syncRange *SSyncRange) []sStoragecacheSyncPair { + istorages, err := iregion.GetIStorages() + if err != nil { + msg := fmt.Sprintf("GetIStorages for provider %s failed %s", provider.GetName(), err) + log.Errorf(msg) + return nil + } + localStorages, remoteStorages, result := StorageManager.SyncStorages(ctx, userCred, provider, nil, istorages) + syncResults.Add(StorageManager, result) + + msg := result.Result() + notes := fmt.Sprintf("SyncStorages for provider %s result: %s", provider.Name, msg) + log.Infof(notes) + if result.IsError() { + return nil + } + + storageCachePairs := make([]sStoragecacheSyncPair, 0) + for i := 0; i < len(localStorages); i += 1 { + func() { + lockman.LockObject(ctx, &localStorages[i]) + defer lockman.ReleaseObject(ctx, &localStorages[i]) + + if localStorages[i].Deleted { + return + } + + if !isInCache(storageCachePairs, localStorages[i].StoragecacheId) { + cachePair := syncStorageCaches(ctx, userCred, provider, &localStorages[i], remoteStorages[i]) + if cachePair.remote != nil && cachePair.local != nil { + storageCachePairs = append(storageCachePairs, cachePair) + } + } + if !remoteStorages[i].DisableSync() { + syncStorageDisks(ctx, userCred, syncResults, provider, driver, &localStorages[i], remoteStorages[i], syncRange) + } + }() + } + return storageCachePairs +} + func syncOnPremiseCloudProviderInfo( ctx context.Context, userCred mcclient.TokenCredential, @@ -1413,8 +1454,9 @@ func syncOnPremiseCloudProviderInfo( syncRegionBuckets(ctx, userCred, syncResults, provider, localRegion, iregion) } - storageCachePairs := make([]sStoragecacheSyncPair, 0) + var storageCachePairs []sStoragecacheSyncPair if cloudprovider.IsSupportCompute(driver) { + storageCachePairs = syncOnPremiseCloudProviderStorage(ctx, userCred, syncResults, provider, iregion, driver, syncRange) ihosts, err := iregion.GetIHosts() if err != nil { msg := fmt.Sprintf("GetIHosts for provider %s failed %s", provider.GetName(), err) diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index d0ebeb3e54..dd12673cf6 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -655,9 +655,12 @@ func (self *SStorage) SyncStatusWithHosts() { } } -func (manager *SStorageManager) getStoragesByZoneId(zoneId string, provider *SCloudprovider) ([]SStorage, error) { +func (manager *SStorageManager) getStoragesByZone(zone *SZone, provider *SCloudprovider) ([]SStorage, error) { storages := make([]SStorage, 0) - q := manager.Query().Equals("zone_id", zoneId) + q := manager.Query() + if zone != nil { + q = q.Equals("zone_id", zone.Id) + } if provider != nil { q = q.Equals("manager_id", provider.Id) } @@ -698,7 +701,7 @@ func (manager *SStorageManager) SyncStorages(ctx context.Context, userCred mccli return nil, nil, syncResult } - dbStorages, err := manager.getStoragesByZoneId(zone.Id, provider) + dbStorages, err := manager.getStoragesByZone(zone, provider) if err != nil { syncResult.Error(err) return nil, nil, syncResult