fix: metadata-list通用化所有资源标签

This commit is contained in:
Qu Xuan
2019-12-31 11:15:11 +08:00
parent 53972dc1ec
commit 3875ac219d
4 changed files with 27 additions and 25 deletions
+1
View File
@@ -39,6 +39,7 @@ type IModelManager interface {
lockman.ILockedClass
object.IObject
IsStandaloneManager() bool
GetContextManagers() [][]IModelManager
GetIModelManager() IModelManager
+18 -25
View File
@@ -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...))
+4
View File
@@ -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 {
+4
View File
@@ -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)
}