diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 3bb3fb73a1..c739b5db44 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -536,6 +536,33 @@ func (image *SCachedimage) GetRegions() ([]SCloudregion, error) { return regions, nil } +func (image *SCachedimage) GetUsableZones() ([]SZone, error) { + zones := ZoneManager.Query().SubQuery() + storages := StorageManager.Query().SubQuery() + storagecaches := StoragecacheManager.Query().SubQuery() + storagecacheimages := StoragecachedimageManager.Query().SubQuery() + providers := CloudproviderManager.Query().SubQuery() + + q := zones.Query() + q = q.Join(storages, sqlchemy.Equals(q.Field("id"), storages.Field("zone_id"))) + q = q.Join(storagecaches, sqlchemy.Equals(storages.Field("storagecache_id"), storagecaches.Field("id"))) + q = q.Join(providers, sqlchemy.Equals(providers.Field("id"), storagecaches.Field("manager_id"))) + q = q.Join(storagecacheimages, sqlchemy.Equals(storagecaches.Field("id"), storagecacheimages.Field("storagecache_id"))) + q = q.Filter(sqlchemy.IsTrue(providers.Field("enabled"))) + q = q.Filter(sqlchemy.In(providers.Field("status"), api.CLOUD_PROVIDER_VALID_STATUS)) + q = q.Filter(sqlchemy.In(providers.Field("health_status"), api.CLOUD_PROVIDER_VALID_HEALTH_STATUS)) + q = q.Filter(sqlchemy.Equals(storagecacheimages.Field("cachedimage_id"), image.Id)) + q = q.Filter(sqlchemy.Equals(storagecacheimages.Field("status"), api.CACHED_IMAGE_STATUS_READY)) + q = q.Filter(sqlchemy.Equals(q.Field("status"), api.ZONE_ENABLE)) + + result := []SZone{} + err := db.FetchModelObjects(ZoneManager, q, &result) + if err != nil { + return nil, err + } + return result, nil +} + func (image *SCachedimage) GetCloudprovider() (*SCloudprovider, error) { caches := image.getValidStoragecache() if len(caches) == 0 { diff --git a/pkg/util/zstack/storagecache.go b/pkg/util/zstack/storagecache.go index e35b475f65..8393007aae 100644 --- a/pkg/util/zstack/storagecache.go +++ b/pkg/util/zstack/storagecache.go @@ -77,12 +77,18 @@ func (scache *SStoragecache) GetIImages() ([]cloudprovider.ICloudImage, error) { } func (scache *SStoragecache) GetIImageById(extId string) (cloudprovider.ICloudImage, error) { - image, err := scache.region.GetImage(extId) + images, err := scache.region.GetImages(scache.ZoneId, extId) if err != nil { return nil, err } - image.storageCache = scache - return image, nil + if len(images) == 1 { + images[0].storageCache = scache + return &images[0], nil + } + if len(images) == 0 { + return nil, cloudprovider.ErrNotFound + } + return nil, cloudprovider.ErrDuplicateId } func (scache *SStoragecache) GetPath() string {