From 66b58af9bc34550de4e7d62e8aefe5c9a6192b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Mon, 15 Apr 2024 15:50:16 +0800 Subject: [PATCH] fix(region): simplfy cached-image-list filter (#19986) --- pkg/apis/compute/cachedimage.go | 19 +++++++++ pkg/apis/compute/input.go | 18 --------- pkg/compute/models/cachedimages.go | 62 ++++++++++-------------------- 3 files changed, 39 insertions(+), 60 deletions(-) diff --git a/pkg/apis/compute/cachedimage.go b/pkg/apis/compute/cachedimage.go index be484b9094..235e9c918c 100644 --- a/pkg/apis/compute/cachedimage.go +++ b/pkg/apis/compute/cachedimage.go @@ -68,3 +68,22 @@ type CachedimageDetails struct { type CachedImageSetClassMetadataInput struct { ClassMetadata map[string]string `json:"class_metadata"` } + +type CachedimageListInput struct { + apis.SharableVirtualResourceListInput + apis.ExternalizedResourceBaseListInput + + CloudproviderResourceListInput + CloudregionResourceListInput + ZoneResourceInput + + // 镜像类型,可能值为: system(公有云公共镜像), customized(自定义镜像) + // example: system + ImageType []string `json:"image_type"` + + // filter by host schedtag + HostSchedtagId string `json:"host_schedtag_id"` + + // valid cachedimage + Valid bool `json:"valid"` +} diff --git a/pkg/apis/compute/input.go b/pkg/apis/compute/input.go index 155a7fba62..8b846a8770 100644 --- a/pkg/apis/compute/input.go +++ b/pkg/apis/compute/input.go @@ -49,24 +49,6 @@ type KeypairListInput struct { Fingerprint []string `json:"fingerprint"` } -type CachedimageListInput struct { - apis.SharableVirtualResourceListInput - apis.ExternalizedResourceBaseListInput - - ManagedResourceListInput - ZonalFilterListInput - - // 镜像类型,可能值为: system(公有云公共镜像), customized(自定义镜像) - // example: system - ImageType []string `json:"image_type"` - - // filter by host schedtag - HostSchedtagId string `json:"host_schedtag_id"` - - // valid cachedimage - Valid *bool `json:"valid"` -} - type ExternalProjectListInput struct { apis.VirtualResourceListInput apis.ExternalizedResourceBaseListInput diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index cb98d00b75..303406c2fd 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -848,21 +848,29 @@ func (manager *SCachedimageManager) ListItemFilter( { var idFilter bool - storagecachedImages := StoragecachedimageManager.Query().SubQuery() + storagecachedImages := StoragecachedimageManager.Query("cachedimage_id").Equals("status", api.CACHED_IMAGE_STATUS_ACTIVE).SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() - var storages *sqlchemy.SSubQuery - if query.Valid == nil { - storages = StorageManager.Query().SubQuery() - } else if *query.Valid { + storagesQ := StorageManager.Query() + if query.Valid { idFilter = true - storages = StorageManager.Query().In("status", []string{api.STORAGE_ENABLED, api.STORAGE_ONLINE}).IsTrue("enabled").SubQuery() - } else { - idFilter = true - stroage := StorageManager.Query() - storages = stroage.Filter(sqlchemy.OR(sqlchemy.NotIn(stroage.Field("status"), []string{}), sqlchemy.IsFalse(stroage.Field("enabled")))).SubQuery() + storagesQ = storagesQ.In("status", []string{api.STORAGE_ENABLED, api.STORAGE_ONLINE}).IsTrue("enabled") } - zones := ZoneManager.Query().SubQuery() + if len(query.CloudproviderId) > 0 { + idFilter = true + storagesQ = storagesQ.In("manager_id", query.CloudproviderId) + } + storages := storagesQ.SubQuery() + zonesQ := ZoneManager.Query() + if len(query.ZoneId) > 0 { + idFilter = true + zonesQ = zonesQ.Equals("id", query.ZoneId) + } + if len(query.CloudregionId) > 0 { + idFilter = true + zonesQ = zonesQ.In("cloudregion_id", query.CloudregionId) + } + zones := zonesQ.SubQuery() subq := storagecachedImages.Query(storagecachedImages.Field("cachedimage_id")) subq = subq.Join(storageCaches, sqlchemy.Equals(storagecachedImages.Field("storagecache_id"), storageCaches.Field("id"))) @@ -871,41 +879,11 @@ func (manager *SCachedimageManager) ListItemFilter( if len(query.HostSchedtagId) > 0 { idFilter = true - schedTagObj, err := SchedtagManager.FetchByIdOrName(ctx, userCred, query.HostSchedtagId) - if err != nil { - if errors.Cause(err) == sql.ErrNoRows { - return nil, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", SchedtagManager.Keyword(), query.HostSchedtagId) - } else { - return nil, errors.Wrap(err, "SchedtagManager.FetchByIdOrName") - } - } hoststorages := HoststorageManager.Query("host_id", "storage_id").SubQuery() - hostschedtags := HostschedtagManager.Query().Equals("schedtag_id", schedTagObj.GetId()).SubQuery() + hostschedtags := HostschedtagManager.Query().Equals("schedtag_id", query.HostSchedtagId).SubQuery() subq = subq.Join(hoststorages, sqlchemy.Equals(hoststorages.Field("storage_id"), storages.Field("id"))) subq = subq.Join(hostschedtags, sqlchemy.Equals(hostschedtags.Field("host_id"), hoststorages.Field("host_id"))) } - subq = subq.Filter(sqlchemy.Equals(storagecachedImages.Field("status"), api.CACHED_IMAGE_STATUS_ACTIVE)) - - subq = subq.Snapshot() - - subq, err = managedResourceFilterByAccount(ctx, subq, query.ManagedResourceListInput, "", nil) - if err != nil { - return nil, errors.Wrap(err, "managedResourceFilterByAccount") - } - - subq, err = managedResourceFilterByRegion(ctx, subq, query.RegionalFilterListInput, "", nil) - if err != nil { - return nil, errors.Wrap(err, "_managedResourceFilterByRegion") - } - - subq, err = managedResourceFilterByZone(ctx, subq, query.ZonalFilterListInput, "", nil) - if err != nil { - return nil, errors.Wrap(err, "_managedResourceFilterByZone") - } - - if subq.IsAltered() { - idFilter = true - } if idFilter { subQ := subq.Distinct().SubQuery()