From 3875ac219db771b46b36606526aca567d8adfdda Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Mon, 30 Dec 2019 17:56:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20metadata-list=E9=80=9A=E7=94=A8=E5=8C=96?= =?UTF-8?q?=E6=89=80=E6=9C=89=E8=B5=84=E6=BA=90=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudcommon/db/interface.go | 1 + pkg/cloudcommon/db/metadata.go | 43 +++++++++++++------------------- pkg/cloudcommon/db/modelbase.go | 4 +++ pkg/cloudcommon/db/standalone.go | 4 +++ 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/pkg/cloudcommon/db/interface.go b/pkg/cloudcommon/db/interface.go index ecdc5f8820..0a817e93ab 100644 --- a/pkg/cloudcommon/db/interface.go +++ b/pkg/cloudcommon/db/interface.go @@ -39,6 +39,7 @@ type IModelManager interface { lockman.ILockedClass object.IObject + IsStandaloneManager() bool GetContextManagers() [][]IModelManager GetIModelManager() IModelManager diff --git a/pkg/cloudcommon/db/metadata.go b/pkg/cloudcommon/db/metadata.go index ab6c60f9a2..7466d61242 100644 --- a/pkg/cloudcommon/db/metadata.go +++ b/pkg/cloudcommon/db/metadata.go @@ -61,7 +61,6 @@ type SMetadata struct { } var Metadata *SMetadataManager -var ResourceMap map[string]*SVirtualResourceBaseManager func init() { Metadata = &SMetadataManager{ @@ -73,15 +72,6 @@ func init() { ), } Metadata.SetVirtualObject(Metadata) - - ResourceMap = map[string]*SVirtualResourceBaseManager{ - "disk": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "disks_tbl", "disk", "disks")}, - "server": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "guests_tbl", "server", "servers")}, - "eip": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "elasticips_tbl", "eip", "eips")}, - "snapshot": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "snapshots_tbl", "snpashot", "snpashots")}, - "dbinstance": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "dbinstances_tbl", "dbinstance", "dbinstances")}, - "host": {SStatusStandaloneResourceBaseManager: NewStatusStandaloneResourceBaseManager(SVirtualResourceBase{}, "hosts_tbl", "host", "hosts")}, - } } func (m *SMetadata) GetId() string { @@ -195,28 +185,31 @@ func (manager *SMetadataManager) AllowListItems(ctx context.Context, userCred mc func (manager *SMetadataManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { resources := jsonutils.GetQueryStringArray(query, "resources") if len(resources) == 0 { - for resource := range ResourceMap { + for resource := range globalTables { resources = append(resources, resource) } } conditions := []sqlchemy.ICondition{} for _, resource := range resources { - if man, ok := ResourceMap[resource]; ok { - resourceView := man.Query().IsFalse("pending_deleted").SubQuery() - prefix := sqlchemy.NewStringField(fmt.Sprintf("%s::", man.Keyword())) - field := sqlchemy.CONCAT(man.Keyword(), prefix, resourceView.Field("id")) - sq := resourceView.Query(field) - ownerId, queryScope, err := FetchCheckQueryOwnerScope(ctx, userCred, query, man, policy.PolicyActionList, true) - if err != nil { - return nil, httperrors.NewGeneralError(errors.Wrap(err, "FetchCheckQueryOwnerScope")) - } - sq = man.FilterByOwner(sq, ownerId, queryScope) - sq = man.FilterBySystemAttributes(sq, userCred, query, queryScope) - sq = man.FilterByHiddenSystemAttributes(sq, userCred, query, queryScope) - conditions = append(conditions, sqlchemy.In(q.Field("id"), sq)) - } else { + man, ok := globalTables[resource] + if !ok { return nil, httperrors.NewInputParameterError("Not support resource %s tag filter", resource) } + if !man.IsStandaloneManager() { + continue + } + resourceView := man.Query().SubQuery() + prefix := sqlchemy.NewStringField(fmt.Sprintf("%s::", man.Keyword())) + field := sqlchemy.CONCAT(man.Keyword(), prefix, resourceView.Field("id")) + sq := resourceView.Query(field) + ownerId, queryScope, err := FetchCheckQueryOwnerScope(ctx, userCred, query, man, policy.PolicyActionList, true) + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrap(err, "FetchCheckQueryOwnerScope")) + } + sq = man.FilterByOwner(sq, ownerId, queryScope) + sq = man.FilterBySystemAttributes(sq, userCred, query, queryScope) + sq = man.FilterByHiddenSystemAttributes(sq, userCred, query, queryScope) + conditions = append(conditions, sqlchemy.In(q.Field("id"), sq)) } if len(conditions) > 0 { q = q.Filter(sqlchemy.OR(conditions...)) diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index c2b56ae037..3d7dedc384 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -56,6 +56,10 @@ func NewModelBaseManager(model interface{}, tableName string, keyword string, ke return modelMan } +func (manager *SModelBaseManager) IsStandaloneManager() bool { + return false +} + func (manager *SModelBaseManager) GetIModelManager() IModelManager { virt := manager.GetVirtualObject() if virt == nil { diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index 28e977f67c..29ba62b834 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -68,6 +68,10 @@ func NewStandaloneResourceBaseManager(dt interface{}, tableName string, keyword return SStandaloneResourceBaseManager{SResourceBaseManager: NewResourceBaseManager(dt, tableName, keyword, keywordPlural)} } +func (manager *SStandaloneResourceBaseManager) IsStandaloneManager() bool { + return true +} + func (manager *SStandaloneResourceBaseManager) GetIStandaloneModelManager() IStandaloneModelManager { return manager.GetVirtualObject().(IStandaloneModelManager) }