Merge pull request #1322 from ioito/hotfix/qx-image-zone

避免产生storagecacheimage脏数据
This commit is contained in:
yunion-ci-robot
2019-06-20 15:43:48 +08:00
committed by GitHub
2 changed files with 36 additions and 3 deletions
+27
View File
@@ -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 {
+9 -3
View File
@@ -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 {