From 18fdfad79ee0e654340da3915a4fd602f484999f Mon Sep 17 00:00:00 2001 From: rainzm Date: Sat, 17 Oct 2020 17:22:57 +0800 Subject: [PATCH] feat: add valid filter for cachedimage list Use the 'valid' switch to control whether to filter out the cachedimage corresponding to invalid storage --- cmd/climc/shell/compute/cachedimages.go | 1 + pkg/apis/compute/input.go | 3 +++ pkg/compute/models/cachedimages.go | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cmd/climc/shell/compute/cachedimages.go b/cmd/climc/shell/compute/cachedimages.go index fc948a36ad..ac319790f8 100644 --- a/cmd/climc/shell/compute/cachedimages.go +++ b/cmd/climc/shell/compute/cachedimages.go @@ -29,6 +29,7 @@ func init() { Zone string `help:"show images cached at zone"` HostSchedtagId string `help:"filter cached image with host schedtag"` + Valid *bool `help:"valid cachedimage"` } R(&CachedImageListOptions{}, "cached-image-list", "List cached images", func(s *mcclient.ClientSession, args *CachedImageListOptions) error { params, err := options.ListStructToParams(args) diff --git a/pkg/apis/compute/input.go b/pkg/apis/compute/input.go index 1c45ef4bde..9b80a7e02b 100644 --- a/pkg/apis/compute/input.go +++ b/pkg/apis/compute/input.go @@ -61,6 +61,9 @@ type CachedimageListInput struct { // filter by host schedtag HostSchedtagId string `json:"host_schedtag_id"` + + // valid cachedimage + Valid *bool `json:"valid"` } type ExternalProjectListInput struct { diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 4609087cbe..80ec71d0d2 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -711,7 +711,7 @@ func (manager *SCachedimageManager) ListItemFilter( q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() - storages := StorageManager.Query().In("status", []string{api.STORAGE_ENABLED, api.STORAGE_ONLINE}).IsTrue("enabled").SubQuery() + storages := StorageManager.Query().SubQuery() zones := ZoneManager.Query().SubQuery() subq := storagecachedImages.Query(storagecachedImages.Field("cachedimage_id")) @@ -763,6 +763,21 @@ func (manager *SCachedimageManager) ListItemFilter( q = q.In("id", subq.SubQuery()) } + if query.Valid != nil { + storagecachedImages := StoragecachedimageManager.Query().SubQuery() + storageCaches := StoragecacheManager.Query().SubQuery() + storages := StorageManager.Query().In("status", []string{api.STORAGE_ENABLED, api.STORAGE_ONLINE}).IsTrue("enabled").SubQuery() + + subq := storagecachedImages.Query(storagecachedImages.Field("cachedimage_id")) + subq = subq.Join(storageCaches, sqlchemy.Equals(storagecachedImages.Field("storagecache_id"), storageCaches.Field("id"))) + subq = subq.Join(storages, sqlchemy.Equals(storageCaches.Field("id"), storages.Field("storagecache_id"))) + if *query.Valid { + q = q.In("id", subq.SubQuery()) + } else { + q = q.NotIn("id", subq.SubQuery()) + } + } + return q, nil }