mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-28 03:23:25 +08:00
feature: allow manager to preapre query context (#19455)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -68,10 +68,11 @@ func ApplyQueryDistinctExtraField(
|
||||
type FilterByOwnerProvider interface {
|
||||
Keyword() string
|
||||
KeywordPlural() string
|
||||
FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery
|
||||
FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery
|
||||
}
|
||||
|
||||
func ApplyFilterByOwner(
|
||||
ctx context.Context,
|
||||
q *sqlchemy.SQuery,
|
||||
userCred mcclient.TokenCredential,
|
||||
owner mcclient.IIdentityProvider,
|
||||
@@ -79,7 +80,7 @@ func ApplyFilterByOwner(
|
||||
managers ...FilterByOwnerProvider,
|
||||
) *sqlchemy.SQuery {
|
||||
for _, manager := range managers {
|
||||
q = manager.FilterByOwner(q, manager, userCred, owner, scope)
|
||||
q = manager.FilterByOwner(ctx, q, manager, userCred, owner, scope)
|
||||
}
|
||||
return q
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
// Copyright 2019 Yunion
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/pkg/appctx"
|
||||
)
|
||||
|
||||
const (
|
||||
APP_CONTEXT_KEY_DB_METADATA_MANAGER = appctx.AppContextKey("db_metadata_manager")
|
||||
APP_CONTEXT_KEY_DB_TENANT_CACHE_MANAGER = appctx.AppContextKey("db_tenant_cache_manager")
|
||||
)
|
||||
|
||||
func GetMetadaManagerInContext(ctx context.Context) *SMetadataManager {
|
||||
val := ctx.Value(APP_CONTEXT_KEY_DB_METADATA_MANAGER)
|
||||
if val != nil {
|
||||
return val.(*SMetadataManager)
|
||||
} else {
|
||||
return Metadata
|
||||
}
|
||||
}
|
||||
|
||||
func SaveMetadaManagerInContext(ctx context.Context, manager *SMetadataManager) context.Context {
|
||||
return context.WithValue(ctx, APP_CONTEXT_KEY_DB_METADATA_MANAGER, manager)
|
||||
}
|
||||
|
||||
func GetTenantCacheManagerInContext(ctx context.Context) *STenantCacheManager {
|
||||
val := ctx.Value(APP_CONTEXT_KEY_DB_TENANT_CACHE_MANAGER)
|
||||
if val != nil {
|
||||
return val.(*STenantCacheManager)
|
||||
} else {
|
||||
return TenantCacheManager
|
||||
}
|
||||
}
|
||||
|
||||
func SaveTenantCacheManagerInContext(ctx context.Context, manager *STenantCacheManager) context.Context {
|
||||
return context.WithValue(ctx, APP_CONTEXT_KEY_DB_TENANT_CACHE_MANAGER, manager)
|
||||
}
|
||||
@@ -253,7 +253,8 @@ func ListItemQueryFilters(manager IModelManager,
|
||||
return listItemQueryFilters(manager, ctx, q, userCred, query, action, false)
|
||||
}
|
||||
|
||||
func listItemQueryFiltersRaw(manager IModelManager,
|
||||
func listItemQueryFiltersRaw(
|
||||
manager IModelManager,
|
||||
ctx context.Context, q *sqlchemy.SQuery,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
@@ -274,7 +275,7 @@ func listItemQueryFiltersRaw(manager IModelManager,
|
||||
if !useRawQuery {
|
||||
// Specifically for joint resource, these filters will exclude
|
||||
// deleted resources by joining with master/slave tables
|
||||
q = manager.FilterByOwner(q, manager, userCred, ownerId, queryScope)
|
||||
q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, queryScope)
|
||||
q = manager.FilterBySystemAttributes(q, userCred, query, queryScope)
|
||||
q = manager.FilterByHiddenSystemAttributes(q, userCred, query, queryScope)
|
||||
}
|
||||
@@ -915,6 +916,7 @@ func (dispatcher *DBModelDispatcher) List(ctx context.Context, query jsonutils.J
|
||||
userCred := fetchUserCredential(ctx)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
// list详情
|
||||
items, err := ListItems(manager, ctx, userCred, query, ctxIds)
|
||||
if err != nil {
|
||||
@@ -977,10 +979,10 @@ func getItemDetails(manager IModelManager, item IModel, ctx context.Context, use
|
||||
return nil, httperrors.NewInternalServerError("FetchCustomizeColumns returns incorrect results(expect 1 actual %d)", len(extraRows))
|
||||
}
|
||||
|
||||
func (dispatcher *DBModelDispatcher) tryGetModelProperty(ctx context.Context, property string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
func tryGetModelProperty(manager IModelManager, ctx context.Context, property string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
userCred := fetchUserCredential(ctx)
|
||||
funcName := fmt.Sprintf("GetProperty%s", utils.Kebab2Camel(property, "-"))
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
|
||||
modelValue := reflect.ValueOf(manager)
|
||||
// params := []interface{}{ctx, userCred, query}
|
||||
|
||||
@@ -1019,8 +1021,9 @@ func (dispatcher *DBModelDispatcher) Get(ctx context.Context, idStr string, quer
|
||||
// log.Debugf("Get %s", idStr)
|
||||
userCred := fetchUserCredential(ctx)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
data, err := dispatcher.tryGetModelProperty(ctx, idStr, query)
|
||||
data, err := tryGetModelProperty(manager, ctx, idStr, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if data != nil {
|
||||
@@ -1057,6 +1060,8 @@ func (dispatcher *DBModelDispatcher) Get(ctx context.Context, idStr string, quer
|
||||
func (dispatcher *DBModelDispatcher) GetSpecific(ctx context.Context, idStr string, spec string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
userCred := fetchUserCredential(ctx)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
model, err := fetchItem(manager, ctx, userCred, idStr, query)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), idStr)
|
||||
@@ -1287,7 +1292,7 @@ func _doCreateItem(
|
||||
uniqValues := manager.FetchUniqValues(ctx, dataDict)
|
||||
name, _ := dataDict.GetString("name")
|
||||
if len(name) > 0 {
|
||||
err = NewNameValidator(manager, ownerId, name, uniqValues)
|
||||
err = NewNameValidator(ctx, manager, ownerId, name, uniqValues)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -70,19 +70,22 @@ func (dispatcher *DBJointModelDispatcher) ListMasterDescendent(ctx context.Conte
|
||||
}
|
||||
}
|
||||
|
||||
model, err := fetchItem(dispatcher.JointModelManager().GetMasterManager(), ctx, userCred, idStr, query)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query).(IJointModelManager)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
model, err := fetchItem(manager.GetMasterManager(), ctx, userCred, idStr, query)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(dispatcher.JointModelManager().GetMasterManager().Keyword(), idStr)
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.GetMasterManager().Keyword(), idStr)
|
||||
} else if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", dispatcher.JointModelManager().GetMasterManager().Keyword()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), dispatcher.JointModelManager().GetMasterFieldName())
|
||||
if len(dispatcher.JointModelManager().GetMasterManager().Alias()) > 0 {
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", dispatcher.JointModelManager().GetMasterManager().Alias()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", manager.GetMasterManager().Keyword()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), manager.GetMasterFieldName())
|
||||
if len(manager.GetMasterManager().Alias()) > 0 {
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", manager.GetMasterManager().Alias()))
|
||||
}
|
||||
|
||||
return dispatcher._listJoint(ctx, userCred, model.(IStandaloneModel), queryDict)
|
||||
return _listJoint(manager, ctx, userCred, model.(IStandaloneModel), queryDict)
|
||||
}
|
||||
|
||||
func (dispatcher *DBJointModelDispatcher) ListSlaveDescendent(ctx context.Context, idStr string, query jsonutils.JSONObject) (*printutils.ListResult, error) {
|
||||
@@ -97,23 +100,26 @@ func (dispatcher *DBJointModelDispatcher) ListSlaveDescendent(ctx context.Contex
|
||||
}
|
||||
}
|
||||
|
||||
model, err := fetchItem(dispatcher.JointModelManager().GetSlaveManager(), ctx, userCred, idStr, query)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query).(IJointModelManager)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
model, err := fetchItem(manager.GetSlaveManager(), ctx, userCred, idStr, query)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(dispatcher.JointModelManager().GetSlaveManager().Keyword(), idStr)
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.GetSlaveManager().Keyword(), idStr)
|
||||
} else if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", dispatcher.JointModelManager().GetSlaveManager().Keyword()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), dispatcher.JointModelManager().GetSlaveFieldName())
|
||||
if len(dispatcher.JointModelManager().GetSlaveManager().Alias()) > 0 {
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", dispatcher.JointModelManager().GetSlaveManager().Alias()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", manager.GetSlaveManager().Keyword()))
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), manager.GetSlaveFieldName())
|
||||
if len(manager.GetSlaveManager().Alias()) > 0 {
|
||||
queryDict.Add(jsonutils.NewString(model.GetId()), fmt.Sprintf("%s_id", manager.GetSlaveManager().Alias()))
|
||||
}
|
||||
|
||||
return dispatcher._listJoint(ctx, userCred, model.(IStandaloneModel), queryDict)
|
||||
return _listJoint(manager, ctx, userCred, model.(IStandaloneModel), queryDict)
|
||||
}
|
||||
|
||||
func (dispatcher *DBJointModelDispatcher) _listJoint(ctx context.Context, userCred mcclient.TokenCredential, ctxModel IStandaloneModel, queryDict jsonutils.JSONObject) (*printutils.ListResult, error) {
|
||||
items, err := ListItems(dispatcher.JointModelManager(), ctx, userCred, queryDict, nil)
|
||||
func _listJoint(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, ctxModel IStandaloneModel, queryDict jsonutils.JSONObject) (*printutils.ListResult, error) {
|
||||
items, err := ListItems(manager, ctx, userCred, queryDict, nil)
|
||||
if err != nil {
|
||||
log.Errorf("Fail to list items: %s", err)
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
@@ -121,16 +127,16 @@ func (dispatcher *DBJointModelDispatcher) _listJoint(ctx context.Context, userCr
|
||||
return items, nil
|
||||
}
|
||||
|
||||
func fetchJointItem(dispatcher *DBJointModelDispatcher, ctx context.Context, userCred mcclient.TokenCredential, id1 string, id2 string, query jsonutils.JSONObject) (IStandaloneModel, IStandaloneModel, IJointModel, error) {
|
||||
master, err := fetchItem(dispatcher.JointModelManager().GetMasterManager(), ctx, userCred, id1, query)
|
||||
func fetchJointItem(manager IJointModelManager, ctx context.Context, userCred mcclient.TokenCredential, id1 string, id2 string, query jsonutils.JSONObject) (IStandaloneModel, IStandaloneModel, IJointModel, error) {
|
||||
master, err := fetchItem(manager.GetMasterManager(), ctx, userCred, id1, query)
|
||||
if err != nil {
|
||||
return nil, nil, nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
slave, err := fetchItem(dispatcher.JointModelManager().GetSlaveManager(), ctx, userCred, id2, query)
|
||||
slave, err := fetchItem(manager.GetSlaveManager(), ctx, userCred, id2, query)
|
||||
if err != nil {
|
||||
return nil, nil, nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
item, err := FetchJointByIds(dispatcher.JointModelManager(), master.GetId(), slave.GetId(), query)
|
||||
item, err := FetchJointByIds(manager, master.GetId(), slave.GetId(), query)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
@@ -139,9 +145,11 @@ func fetchJointItem(dispatcher *DBJointModelDispatcher, ctx context.Context, use
|
||||
|
||||
func (dispatcher *DBJointModelDispatcher) Get(ctx context.Context, id1 string, id2 string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
userCred := fetchUserCredential(ctx)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
|
||||
_, _, item, err := fetchJointItem(dispatcher, ctx, userCred, id1, id2, query)
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query).(IJointModelManager)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
_, _, item, err := fetchJointItem(manager, ctx, userCred, id1, id2, query)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), id1+"-"+id2)
|
||||
} else if err != nil {
|
||||
@@ -151,7 +159,7 @@ func (dispatcher *DBJointModelDispatcher) Get(ctx context.Context, id1 string, i
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return getItemDetails(dispatcher.JointModelManager(), item, ctx, userCred, query)
|
||||
return getItemDetails(manager, item, ctx, userCred, query)
|
||||
}
|
||||
|
||||
func attachItems(
|
||||
@@ -214,7 +222,7 @@ func (dispatcher *DBJointModelDispatcher) Attach(ctx context.Context, id1 string
|
||||
}
|
||||
}
|
||||
|
||||
_, _, joinItem, err := fetchJointItem(dispatcher, ctx, userCred, master.GetId(), slave.GetId(), query)
|
||||
_, _, joinItem, err := fetchJointItem(dispatcher.JointModelManager(), ctx, userCred, master.GetId(), slave.GetId(), query)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return nil, err
|
||||
}
|
||||
@@ -237,7 +245,7 @@ func (dispatcher *DBJointModelDispatcher) Update(ctx context.Context, id1 string
|
||||
manager := dispatcher.manager.GetMutableInstance(ctx, userCred, query, data)
|
||||
|
||||
// 获取对象与关联表(such as guestdisks_tbl)
|
||||
master, slave, item, err := fetchJointItem(dispatcher, ctx, userCred, id1, id2, query)
|
||||
master, slave, item, err := fetchJointItem(dispatcher.JointModelManager(), ctx, userCred, id1, id2, query)
|
||||
if err == sql.ErrNoRows {
|
||||
if jsonutils.QueryBoolean(query, "auto_create", false) {
|
||||
queryDict := query.(*jsonutils.JSONDict)
|
||||
@@ -265,7 +273,7 @@ func (dispatcher *DBJointModelDispatcher) Detach(ctx context.Context, id1 string
|
||||
userCred := fetchUserCredential(ctx)
|
||||
manager := dispatcher.manager.GetMutableInstance(ctx, userCred, query, data)
|
||||
|
||||
master, slave, item, err := fetchJointItem(dispatcher, ctx, userCred, id1, id2, query)
|
||||
master, slave, item, err := fetchJointItem(dispatcher.JointModelManager(), ctx, userCred, id1, id2, query)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), id1+"-"+id2)
|
||||
} else if err != nil {
|
||||
|
||||
@@ -54,7 +54,7 @@ func (manager *SDomainizedResourceBaseManager) ResourceScope() rbacscope.TRbacSc
|
||||
return rbacscope.ScopeDomain
|
||||
}
|
||||
|
||||
func (manager *SDomainizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SDomainizedResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
switch scope {
|
||||
case rbacscope.ScopeProject, rbacscope.ScopeDomain:
|
||||
@@ -64,9 +64,8 @@ func (manager *SDomainizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery,
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
|
||||
}
|
||||
case rbacscope.ScopeSystem:
|
||||
if userCred != nil {
|
||||
@@ -74,14 +73,13 @@ func (manager *SDomainizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery,
|
||||
if !result.DomainTags.IsEmpty() {
|
||||
policyFilters := tagutils.STagFilters{}
|
||||
policyFilters.AddFilters(result.DomainTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "domain_id", "domain", policyFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "domain_id", "domain", policyFilters)
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -149,7 +147,7 @@ func (manager *SDomainizedResourceBaseManager) ListItemFilter(
|
||||
if !query.NoDomainTags.IsEmpty() {
|
||||
tagFilters.AddNoFilters(query.NoDomainTags)
|
||||
}
|
||||
q = ObjectIdQueryWithTagFilters(q, "domain_id", "domain", tagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "domain_id", "domain", tagFilters)
|
||||
return q, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ func (model *SDomainLevelResourceBase) PerformChangeOwner(ctx context.Context, u
|
||||
}
|
||||
|
||||
q := manager.Query().Equals("name", model.GetName())
|
||||
q = manager.FilterByOwner(q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
q = q.NotEquals("id", model.GetId())
|
||||
cnt, err := q.CountWithError()
|
||||
|
||||
@@ -96,7 +96,7 @@ func FetchById(manager IModelManager, idStr string) (IModel, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func FetchByName(manager IModelManager, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
func FetchByName(ctx context.Context, manager IModelManager, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
q := manager.Query()
|
||||
q = manager.FilterByName(q, idStr)
|
||||
count, err := q.CountWithError()
|
||||
@@ -104,7 +104,7 @@ func FetchByName(manager IModelManager, userCred mcclient.IIdentityProvider, idS
|
||||
return nil, err
|
||||
}
|
||||
if count > 0 && userCred != nil {
|
||||
q = manager.FilterByOwner(q, manager, nil, userCred, manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, nil, userCred, manager.NamespaceScope())
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
count, err = q.CountWithError()
|
||||
if err != nil {
|
||||
@@ -129,13 +129,13 @@ func FetchByName(manager IModelManager, userCred mcclient.IIdentityProvider, idS
|
||||
}
|
||||
}
|
||||
|
||||
func FetchByIdOrName(manager IModelManager, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
func FetchByIdOrName(ctx context.Context, manager IModelManager, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
if stringutils2.IsUtf8(idStr) {
|
||||
return FetchByName(manager, userCred, idStr)
|
||||
return FetchByName(ctx, manager, userCred, idStr)
|
||||
}
|
||||
obj, err := FetchById(manager, idStr)
|
||||
if err == sql.ErrNoRows {
|
||||
return FetchByName(manager, userCred, idStr)
|
||||
return FetchByName(ctx, manager, userCred, idStr)
|
||||
} else {
|
||||
return obj, err
|
||||
}
|
||||
@@ -197,7 +197,7 @@ func fetchItemByName(manager IModelManager, ctx context.Context, userCred mcclie
|
||||
if err != nil {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
q = manager.FilterByOwner(q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
count, err = q.CountWithError()
|
||||
if err != nil {
|
||||
|
||||
@@ -54,8 +54,8 @@ func (manager *SInfrasResourceBaseManager) GetIInfrasModelManager() IInfrasModel
|
||||
return manager.GetVirtualObject().(IInfrasModelManager)
|
||||
}
|
||||
|
||||
func (manager *SInfrasResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
return SharableManagerFilterByOwner(manager.GetIInfrasModelManager(), q, userCred, owner, scope)
|
||||
func (manager *SInfrasResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
return SharableManagerFilterByOwner(ctx, manager.GetIInfrasModelManager(), q, userCred, owner, scope)
|
||||
}
|
||||
|
||||
func (model *SInfrasResourceBase) IsSharable(reqUsrId mcclient.IIdentityProvider) bool {
|
||||
|
||||
@@ -78,7 +78,6 @@ type IModelManager interface {
|
||||
FilterByName(q *sqlchemy.SQuery, name string) *sqlchemy.SQuery
|
||||
|
||||
FilterByOwnerProvider
|
||||
//FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery
|
||||
|
||||
FilterBySystemAttributes(q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject, scope rbacscope.TRbacScope) *sqlchemy.SQuery
|
||||
FilterByHiddenSystemAttributes(q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject, scope rbacscope.TRbacScope) *sqlchemy.SQuery
|
||||
@@ -88,8 +87,8 @@ type IModelManager interface {
|
||||
|
||||
// RawFetchById(idStr string) (IModel, error)
|
||||
FetchById(idStr string) (IModel, error)
|
||||
FetchByName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error)
|
||||
FetchByIdOrName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error)
|
||||
FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error)
|
||||
FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error)
|
||||
|
||||
// create hooks
|
||||
// AllowCreateItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool
|
||||
@@ -142,6 +141,8 @@ type IModelManager interface {
|
||||
CreateByInsertOrUpdate() bool
|
||||
|
||||
CustomizedTotalCount(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, totalQ *sqlchemy.SQuery) (int, jsonutils.JSONObject, error)
|
||||
|
||||
PrepareQueryContext(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) context.Context
|
||||
}
|
||||
|
||||
type IModel interface {
|
||||
|
||||
@@ -147,9 +147,9 @@ func (m *SMetadata) GetName() string {
|
||||
return fmt.Sprintf("%s-%s", m.Id, m.Key)
|
||||
}
|
||||
|
||||
func (m *SMetadata) GetModelManager() IModelManager {
|
||||
return Metadata
|
||||
}
|
||||
// func (m *SMetadata) GetModelManager() IModelManager {
|
||||
// return Metadata
|
||||
// }
|
||||
|
||||
func GetModelIdstr(model IModel) string {
|
||||
return getObjectIdstr(model.GetModelManager().Keyword(), model.GetId())
|
||||
@@ -412,7 +412,7 @@ func (manager *SMetadataManager) ListItemFilter(ctx context.Context, q *sqlchemy
|
||||
log.Warningf("FetchCheckQueryOwnerScope.%s error: %v", man.Keyword(), err)
|
||||
continue
|
||||
}
|
||||
sq = man.FilterByOwner(sq, man, userCred, ownerId, queryScope)
|
||||
sq = man.FilterByOwner(ctx, sq, man, userCred, ownerId, queryScope)
|
||||
sq = man.FilterBySystemAttributes(sq, userCred, query, queryScope)
|
||||
sq = man.FilterByHiddenSystemAttributes(sq, userCred, query, queryScope)
|
||||
conditions = append(conditions, sqlchemy.In(q.Field("obj_id"), sq))
|
||||
@@ -446,7 +446,7 @@ func (manager *SMetadataManager) GetStringValue(ctx context.Context, model IMode
|
||||
}
|
||||
idStr := GetModelIdstr(model)
|
||||
m := SMetadata{}
|
||||
err := manager.Query().Equals("id", idStr).Equals("key", key).First(&m)
|
||||
err := manager.Query("value").Equals("id", idStr).Equals("key", key).First(&m)
|
||||
if err == nil {
|
||||
return m.Value
|
||||
}
|
||||
@@ -462,7 +462,7 @@ func (manager *SMetadataManager) GetJsonValue(ctx context.Context, model IModel,
|
||||
}
|
||||
idStr := GetModelIdstr(model)
|
||||
m := SMetadata{}
|
||||
err := manager.Query().Equals("id", idStr).Equals("key", key).First(&m)
|
||||
err := manager.Query("value").Equals("id", idStr).Equals("key", key).First(&m)
|
||||
if err == nil {
|
||||
json, _ := jsonutils.ParseString(m.Value)
|
||||
return json
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
@@ -32,40 +33,40 @@ import (
|
||||
|
||||
type SMetadataResourceBaseModelManager struct{}
|
||||
|
||||
func ObjectIdQueryWithPolicyResult(q *sqlchemy.SQuery, manager IModelManager, result rbacutils.SPolicyResult) *sqlchemy.SQuery {
|
||||
func ObjectIdQueryWithPolicyResult(ctx context.Context, q *sqlchemy.SQuery, manager IModelManager, result rbacutils.SPolicyResult) *sqlchemy.SQuery {
|
||||
scope := manager.ResourceScope()
|
||||
if scope == rbacscope.ScopeDomain || scope == rbacscope.ScopeProject {
|
||||
if !result.DomainTags.IsEmpty() {
|
||||
tagFilters := tagutils.STagFilters{}
|
||||
tagFilters.AddFilters(result.DomainTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "domain_id", "domain", tagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "domain_id", "domain", tagFilters)
|
||||
}
|
||||
}
|
||||
if scope == rbacscope.ScopeProject {
|
||||
if !result.ProjectTags.IsEmpty() {
|
||||
tagFilters := tagutils.STagFilters{}
|
||||
tagFilters.AddFilters(result.ProjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", tagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", tagFilters)
|
||||
}
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
tagFilters := tagutils.STagFilters{}
|
||||
tagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), tagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), tagFilters)
|
||||
}
|
||||
return q
|
||||
}
|
||||
|
||||
func ObjectIdQueryWithTagFilters(q *sqlchemy.SQuery, idField string, modelName string, filters tagutils.STagFilters) *sqlchemy.SQuery {
|
||||
func ObjectIdQueryWithTagFilters(ctx context.Context, q *sqlchemy.SQuery, idField string, modelName string, filters tagutils.STagFilters) *sqlchemy.SQuery {
|
||||
if len(filters.Filters) > 0 {
|
||||
sq := objIdQueryWithTags(modelName, filters.Filters)
|
||||
sq := objIdQueryWithTags(ctx, modelName, filters.Filters)
|
||||
if sq != nil {
|
||||
sqq := sq.SubQuery()
|
||||
q = q.Join(sqq, sqlchemy.Equals(q.Field(idField), sqq.Field("obj_id")))
|
||||
}
|
||||
}
|
||||
if len(filters.NoFilters) > 0 {
|
||||
sq := objIdQueryWithTags(modelName, filters.NoFilters)
|
||||
sq := objIdQueryWithTags(ctx, modelName, filters.NoFilters)
|
||||
if sq != nil {
|
||||
q = q.Filter(sqlchemy.NotIn(q.Field(idField), sq.SubQuery()))
|
||||
}
|
||||
@@ -73,8 +74,9 @@ func ObjectIdQueryWithTagFilters(q *sqlchemy.SQuery, idField string, modelName s
|
||||
return q
|
||||
}
|
||||
|
||||
func objIdQueryWithTags(modelName string, tagsList []map[string][]string) *sqlchemy.SQuery {
|
||||
metadataResQ := Metadata.Query().Equals("obj_type", modelName).SubQuery()
|
||||
func objIdQueryWithTags(ctx context.Context, modelName string, tagsList []map[string][]string) *sqlchemy.SQuery {
|
||||
manager := GetMetadaManagerInContext(ctx)
|
||||
metadataResQ := manager.Query().Equals("obj_type", modelName).SubQuery()
|
||||
|
||||
queries := make([]sqlchemy.IQuery, 0)
|
||||
for _, tags := range tagsList {
|
||||
@@ -106,10 +108,12 @@ func objIdQueryWithTags(modelName string, tagsList []map[string][]string) *sqlch
|
||||
}
|
||||
|
||||
func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
|
||||
ctx context.Context,
|
||||
manager IModelManager,
|
||||
q *sqlchemy.SQuery,
|
||||
input apis.MetadataResourceListInput,
|
||||
) *sqlchemy.SQuery {
|
||||
metadataMan := GetMetadaManagerInContext(ctx)
|
||||
|
||||
inputTagFilters := tagutils.STagFilters{}
|
||||
if len(input.Tags) > 0 {
|
||||
@@ -124,7 +128,7 @@ func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
|
||||
if !input.NoObjTags.IsEmpty() {
|
||||
inputTagFilters.AddNoFilters(input.NoObjTags)
|
||||
}
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), inputTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), inputTagFilters)
|
||||
|
||||
//if !input.PolicyObjectTags.IsEmpty() {
|
||||
// projTagFilters := tagutils.STagFilters{}
|
||||
@@ -133,7 +137,7 @@ func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
|
||||
//}
|
||||
|
||||
if input.WithoutUserMeta != nil || input.WithUserMeta != nil {
|
||||
metadatas := Metadata.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
metadatas := metadataMan.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
sq := metadatas.Query(metadatas.Field("obj_id")).Startswith("key", USER_TAG_PREFIX).Distinct().SubQuery()
|
||||
if (input.WithoutUserMeta != nil && *input.WithoutUserMeta) || (input.WithUserMeta != nil && !*input.WithUserMeta) {
|
||||
q = q.Filter(sqlchemy.NotIn(q.Field("id"), sq))
|
||||
@@ -143,7 +147,7 @@ func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
|
||||
}
|
||||
|
||||
if input.WithCloudMeta != nil {
|
||||
metadatas := Metadata.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
metadatas := metadataMan.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
sq := metadatas.Query(metadatas.Field("obj_id")).Startswith("key", CLOUD_TAG_PREFIX).Distinct().SubQuery()
|
||||
if *input.WithCloudMeta {
|
||||
q = q.Filter(sqlchemy.In(q.Field("id"), sq))
|
||||
@@ -153,7 +157,7 @@ func (meta *SMetadataResourceBaseModelManager) ListItemFilter(
|
||||
}
|
||||
|
||||
if input.WithAnyMeta != nil {
|
||||
metadatas := Metadata.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
metadatas := metadataMan.Query().Equals("obj_type", manager.Keyword()).SubQuery()
|
||||
sq := metadatas.Query(metadatas.Field("obj_id")).Distinct().SubQuery()
|
||||
if *input.WithAnyMeta {
|
||||
q = q.Filter(sqlchemy.In(q.Field("id"), sq))
|
||||
|
||||
@@ -137,6 +137,10 @@ func (manager *SModelBaseManager) GetMutableInstance(ctx context.Context, userCr
|
||||
return manager.GetIModelManager()
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) PrepareQueryContext(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) context.Context {
|
||||
return ctx
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) SetAlias(alias string, aliasPlural string) {
|
||||
manager.alias = alias
|
||||
manager.aliasPlural = aliasPlural
|
||||
@@ -260,7 +264,7 @@ func (manager *SModelBaseManager) FilterByName(q *sqlchemy.SQuery, name string)
|
||||
return q
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SModelBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
return q
|
||||
}
|
||||
|
||||
@@ -280,11 +284,11 @@ func (manager *SModelBaseManager) FetchById(idStr string) (IModel, error) {
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) FetchByName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
func (manager *SModelBaseManager) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
|
||||
func (manager *SModelBaseManager) FetchByIdOrName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
func (manager *SModelBaseManager) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
|
||||
|
||||
@@ -28,11 +28,11 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/util/stringutils2"
|
||||
)
|
||||
|
||||
func isNameUnique(manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject) (bool, error) {
|
||||
return isRawNameUnique(manager, ownerId, name, uniqValues, false)
|
||||
func isNameUnique(ctx context.Context, manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject) (bool, error) {
|
||||
return isRawNameUnique(ctx, manager, ownerId, name, uniqValues, false)
|
||||
}
|
||||
|
||||
func isRawNameUnique(manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject, isRaw bool) (bool, error) {
|
||||
func isRawNameUnique(ctx context.Context, manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject, isRaw bool) (bool, error) {
|
||||
var q *sqlchemy.SQuery
|
||||
if isRaw {
|
||||
q = manager.TableSpec().Instance().Query()
|
||||
@@ -40,7 +40,7 @@ func isRawNameUnique(manager IModelManager, ownerId mcclient.IIdentityProvider,
|
||||
q = manager.Query()
|
||||
}
|
||||
q = manager.FilterByName(q, name)
|
||||
q = manager.FilterByOwner(q, manager, nil, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, nil, ownerId, manager.NamespaceScope())
|
||||
if !isRaw {
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
if uniqValues != nil {
|
||||
@@ -54,12 +54,12 @@ func isRawNameUnique(manager IModelManager, ownerId mcclient.IIdentityProvider,
|
||||
return cnt == 0, nil
|
||||
}
|
||||
|
||||
func NewNameValidator(manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject) error {
|
||||
func NewNameValidator(ctx context.Context, manager IModelManager, ownerId mcclient.IIdentityProvider, name string, uniqValues jsonutils.JSONObject) error {
|
||||
err := manager.ValidateName(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
uniq, err := isNameUnique(manager, ownerId, name, uniqValues)
|
||||
uniq, err := isNameUnique(ctx, manager, ownerId, name, uniqValues)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -69,11 +69,11 @@ func NewNameValidator(manager IModelManager, ownerId mcclient.IIdentityProvider,
|
||||
return nil
|
||||
}
|
||||
|
||||
func isAlterNameUnique(model IModel, name string) (bool, error) {
|
||||
return isRawAlterNameUnique(model, name, false)
|
||||
func isAlterNameUnique(ctx context.Context, model IModel, name string) (bool, error) {
|
||||
return isRawAlterNameUnique(ctx, model, name, false)
|
||||
}
|
||||
|
||||
func isRawAlterNameUnique(model IModel, name string, isRaw bool) (bool, error) {
|
||||
func isRawAlterNameUnique(ctx context.Context, model IModel, name string, isRaw bool) (bool, error) {
|
||||
manager := model.GetModelManager()
|
||||
var q *sqlchemy.SQuery
|
||||
if isRaw {
|
||||
@@ -82,7 +82,7 @@ func isRawAlterNameUnique(model IModel, name string, isRaw bool) (bool, error) {
|
||||
q = manager.Query()
|
||||
}
|
||||
q = manager.FilterByName(q, name)
|
||||
q = manager.FilterByOwner(q, manager, nil, model.GetOwnerId(), manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, nil, model.GetOwnerId(), manager.NamespaceScope())
|
||||
q = manager.FilterByNotId(q, model.GetId())
|
||||
if !isRaw {
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
@@ -97,12 +97,12 @@ func isRawAlterNameUnique(model IModel, name string, isRaw bool) (bool, error) {
|
||||
return cnt == 0, nil
|
||||
}
|
||||
|
||||
func alterNameValidator(model IModel, name string) error {
|
||||
func alterNameValidator(ctx context.Context, model IModel, name string) error {
|
||||
err := model.GetModelManager().ValidateName(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
uniq, err := isAlterNameUnique(model, name)
|
||||
uniq, err := isAlterNameUnique(ctx, model, name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -139,9 +139,9 @@ func GenerateName2(ctx context.Context, manager IModelManager, ownerId mcclient.
|
||||
var uniq bool
|
||||
var err error
|
||||
if model == nil {
|
||||
uniq, err = isRawNameUnique(manager, ownerId, name, nil, consts.IsHistoricalUniqueName())
|
||||
uniq, err = isRawNameUnique(ctx, manager, ownerId, name, nil, consts.IsHistoricalUniqueName())
|
||||
} else {
|
||||
uniq, err = isRawAlterNameUnique(model, name, consts.IsHistoricalUniqueName())
|
||||
uniq, err = isRawAlterNameUnique(ctx, model, name, consts.IsHistoricalUniqueName())
|
||||
}
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
||||
@@ -362,7 +362,7 @@ func (manager *SOpsLogManager) LogSyncUpdate(m IModel, uds sqlchemy.UpdateDiffs,
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SOpsLogManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (self *SOpsLogManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if ownerId != nil {
|
||||
switch scope {
|
||||
case rbacscope.ScopeUser:
|
||||
|
||||
@@ -52,7 +52,7 @@ func (model *SProjectizedResourceBase) GetOwnerId() mcclient.IIdentityProvider {
|
||||
return &owner
|
||||
}
|
||||
|
||||
func (manager *SProjectizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SProjectizedResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
switch scope {
|
||||
case rbacscope.ScopeProject:
|
||||
@@ -62,7 +62,7 @@ func (manager *SProjectizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
case rbacscope.ScopeDomain:
|
||||
@@ -72,12 +72,12 @@ func (manager *SProjectizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery
|
||||
if !result.ProjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ProjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", policyTagFilters)
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
case rbacscope.ScopeSystem:
|
||||
@@ -86,17 +86,17 @@ func (manager *SProjectizedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery
|
||||
if !result.DomainTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.DomainTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "domain_id", "domain", policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "domain_id", "domain", policyTagFilters)
|
||||
}
|
||||
if !result.ProjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ProjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", policyTagFilters)
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,7 +162,7 @@ func (manager *SProjectizedResourceBaseManager) ListItemFilter(
|
||||
if !query.NoProjectTags.IsEmpty() {
|
||||
tagFilters.AddNoFilters(query.NoProjectTags)
|
||||
}
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", tagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", tagFilters)
|
||||
return q, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -236,8 +236,8 @@ func RegisterReferrer(man db.IModelManager) {
|
||||
referrersMen = append(referrersMen, man)
|
||||
}
|
||||
|
||||
func ValidateProxySettingResourceInput(userCred mcclient.TokenCredential, input proxyapi.ProxySettingResourceInput) (*SProxySetting, proxyapi.ProxySettingResourceInput, error) {
|
||||
m, err := ProxySettingManager.FetchByIdOrName(userCred, input.ProxySettingId)
|
||||
func ValidateProxySettingResourceInput(ctx context.Context, userCred mcclient.TokenCredential, input proxyapi.ProxySettingResourceInput) (*SProxySetting, proxyapi.ProxySettingResourceInput, error) {
|
||||
m, err := ProxySettingManager.FetchByIdOrName(ctx, userCred, input.ProxySettingId)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == sql.ErrNoRows {
|
||||
return nil, input, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", ProxySettingManager.Keyword(), input.ProxySettingId)
|
||||
|
||||
@@ -110,7 +110,7 @@ func (m *SScopedResourceBase) IsOwner(userCred mcclient.TokenCredential) bool {
|
||||
return userCred.HasSystemAdminPrivilege()
|
||||
}
|
||||
|
||||
func (m *SScopedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (m *SScopedResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner == nil {
|
||||
return q
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ func SharableManagerValidateCreateData(
|
||||
return input, nil
|
||||
}
|
||||
|
||||
func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func SharableManagerFilterByOwner(ctx context.Context, manager IStandaloneModelManager, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
resScope := manager.ResourceScope()
|
||||
if resScope == rbacscope.ScopeUser {
|
||||
@@ -254,7 +254,7 @@ func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.S
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
} else if resScope == rbacscope.ScopeProject && scope == rbacscope.ScopeProject {
|
||||
@@ -289,7 +289,7 @@ func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.S
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -317,12 +317,12 @@ func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.S
|
||||
if !result.ProjectTags.IsEmpty() && resScope == rbacscope.ScopeProject {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ProjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", policyTagFilters)
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -336,7 +336,7 @@ func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.S
|
||||
subq := manager.Query("id")
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.DomainTags)
|
||||
subq = ObjectIdQueryWithTagFilters(subq, "domain_id", "domain", policyTagFilters)
|
||||
subq = ObjectIdQueryWithTagFilters(ctx, subq, "domain_id", "domain", policyTagFilters)
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.In(q.Field("id"), subq.SubQuery()),
|
||||
sqlchemy.AND(
|
||||
@@ -348,12 +348,12 @@ func SharableManagerFilterByOwner(manager IStandaloneModelManager, q *sqlchemy.S
|
||||
if !result.ProjectTags.IsEmpty() && resScope == rbacscope.ScopeProject {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ProjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "tenant_id", "project", policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "tenant_id", "project", policyTagFilters)
|
||||
}
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", manager.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", manager.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,8 +48,8 @@ func (manager *SSharableVirtualResourceBaseManager) GetISharableVirtualModelMana
|
||||
return manager.GetVirtualObject().(ISharableVirtualModelManager)
|
||||
}
|
||||
|
||||
func (manager *SSharableVirtualResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
return SharableManagerFilterByOwner(manager.GetISharableVirtualModelManager(), q, userCred, owner, scope)
|
||||
func (manager *SSharableVirtualResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
return SharableManagerFilterByOwner(ctx, manager.GetISharableVirtualModelManager(), q, userCred, owner, scope)
|
||||
}
|
||||
|
||||
func (model *SSharableVirtualResourceBase) IsSharable(reqUsrId mcclient.IIdentityProvider) bool {
|
||||
|
||||
@@ -72,12 +72,12 @@ func (manager *SStandaloneResourceBaseManager) ValidateName(name string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *SStandaloneResourceBaseManager) FetchByName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(manager.GetIStandaloneModelManager(), userCred, idStr)
|
||||
func (manager *SStandaloneResourceBaseManager) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(ctx, manager.GetIStandaloneModelManager(), userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SStandaloneResourceBaseManager) FetchByIdOrName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(manager.GetIStandaloneModelManager(), userCred, idStr)
|
||||
func (manager *SStandaloneResourceBaseManager) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(ctx, manager.GetIStandaloneModelManager(), userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SStandaloneResourceBaseManager) ListItemFilter(
|
||||
@@ -203,7 +203,7 @@ func (model *SStandaloneResourceBase) ValidateUpdateData(ctx context.Context, us
|
||||
if strings.ContainsAny(input.Name, "\n\r\t") {
|
||||
return input, errors.Wrap(httperrors.ErrInputParameter, "name should not contains any \\n\\r\\t")
|
||||
}
|
||||
err = alterNameValidator(model.GetIStandaloneModel(), input.Name)
|
||||
err = alterNameValidator(ctx, model.GetIStandaloneModel(), input.Name)
|
||||
if err != nil {
|
||||
return input, errors.Wrap(err, "alterNameValidator")
|
||||
}
|
||||
|
||||
@@ -100,13 +100,13 @@ func (manager *SStandaloneAnonResourceBaseManager) FilterByNotId(q *sqlchemy.SQu
|
||||
return q.NotEquals("id", idStr)
|
||||
}
|
||||
|
||||
func (manager *SStandaloneAnonResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SStandaloneAnonResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if userCred != nil {
|
||||
result := policy.PolicyManager.Allow(scope, userCred, consts.GetServiceType(), man.KeywordPlural(), policy.PolicyActionList)
|
||||
if !result.ObjectTags.IsEmpty() {
|
||||
policyTagFilters := tagutils.STagFilters{}
|
||||
policyTagFilters.AddFilters(result.ObjectTags)
|
||||
q = ObjectIdQueryWithTagFilters(q, "id", man.Keyword(), policyTagFilters)
|
||||
q = ObjectIdQueryWithTagFilters(ctx, q, "id", man.Keyword(), policyTagFilters)
|
||||
}
|
||||
}
|
||||
return q
|
||||
@@ -153,7 +153,7 @@ func (manager *SStandaloneAnonResourceBaseManager) ListItemFilter(
|
||||
q = q.In("id", input.Ids)
|
||||
}
|
||||
|
||||
q = manager.SMetadataResourceBaseModelManager.ListItemFilter(manager.GetIModelManager(), q, input.MetadataResourceListInput)
|
||||
q = manager.SMetadataResourceBaseModelManager.ListItemFilter(ctx, manager.GetIModelManager(), q, input.MetadataResourceListInput)
|
||||
|
||||
return q, nil
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ func (manager *SStatusDomainLevelUserResourceBaseManager) ValidateCreateData(ctx
|
||||
return input, nil
|
||||
}
|
||||
|
||||
func (manager *SStatusDomainLevelUserResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SStatusDomainLevelUserResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
switch scope {
|
||||
case rbacscope.ScopeProject, rbacscope.ScopeUser:
|
||||
|
||||
@@ -149,7 +149,7 @@ func (self *STask) GetOwnerId() mcclient.IIdentityProvider {
|
||||
return &owner
|
||||
}
|
||||
|
||||
func (manager *STaskManager) FilterByOwner(q *sqlchemy.SQuery, man db.FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *STaskManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man db.FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
switch scope {
|
||||
case rbacscope.ScopeProject:
|
||||
|
||||
@@ -125,7 +125,7 @@ func (manager *SUserResourceBaseManager) FetchCustomizeColumns(
|
||||
return rows
|
||||
}
|
||||
|
||||
func (manager *SUserResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SUserResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
if scope == rbacscope.ScopeUser {
|
||||
if len(owner.GetUserId()) > 0 {
|
||||
@@ -149,12 +149,12 @@ func (manager *SUserResourceBaseManager) GetIUserModelManager() IUserModelManage
|
||||
return manager.GetVirtualObject().(IUserModelManager)
|
||||
}
|
||||
|
||||
func (manager *SUserResourceBaseManager) FetchByName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(manager, userCred, idStr)
|
||||
func (manager *SUserResourceBaseManager) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(ctx, manager, userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SUserResourceBaseManager) FetchByIdOrName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(manager, userCred, idStr)
|
||||
func (manager *SUserResourceBaseManager) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(ctx, manager, userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SUserResourceBaseManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input apis.UserResourceCreateInput) (apis.UserResourceCreateInput, error) {
|
||||
|
||||
@@ -59,12 +59,12 @@ func (manager *SVirtualJointResourceBaseManager) AllowAttach(ctx context.Context
|
||||
return false
|
||||
}
|
||||
|
||||
func (manager *SVirtualJointResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
func (manager *SVirtualJointResourceBaseManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
|
||||
if owner != nil {
|
||||
masterQ := manager.GetMasterManager().Query("id")
|
||||
masterQ = manager.GetMasterManager().FilterByOwner(masterQ, manager.GetMasterManager(), userCred, owner, scope)
|
||||
masterQ = manager.GetMasterManager().FilterByOwner(ctx, masterQ, manager.GetMasterManager(), userCred, owner, scope)
|
||||
slaveQ := manager.GetSlaveManager().Query("id")
|
||||
slaveQ = manager.GetSlaveManager().FilterByOwner(slaveQ, manager.GetSlaveManager(), userCred, owner, scope)
|
||||
slaveQ = manager.GetSlaveManager().FilterByOwner(ctx, slaveQ, manager.GetSlaveManager(), userCred, owner, scope)
|
||||
iManager := manager.GetIJointModelManager()
|
||||
q = q.In(iManager.GetMasterFieldName(), masterQ.SubQuery())
|
||||
q = q.In(iManager.GetSlaveFieldName(), slaveQ.SubQuery())
|
||||
|
||||
@@ -213,12 +213,12 @@ func (manager *SVirtualResourceBaseManager) FilterBySystemAttributes(q *sqlchemy
|
||||
return q
|
||||
}
|
||||
|
||||
func (manager *SVirtualResourceBaseManager) FetchByName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(manager, userCred, idStr)
|
||||
func (manager *SVirtualResourceBaseManager) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByName(ctx, manager, userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SVirtualResourceBaseManager) FetchByIdOrName(userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(manager, userCred, idStr)
|
||||
func (manager *SVirtualResourceBaseManager) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) {
|
||||
return FetchByIdOrName(ctx, manager, userCred, idStr)
|
||||
}
|
||||
|
||||
func (manager *SVirtualResourceBaseManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input apis.VirtualResourceCreateInput) (apis.VirtualResourceCreateInput, error) {
|
||||
@@ -380,7 +380,7 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
|
||||
}
|
||||
|
||||
q := manager.Query().Equals("name", model.GetName())
|
||||
q = manager.FilterByOwner(q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, manager.NamespaceScope())
|
||||
q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope())
|
||||
q = q.NotEquals("id", model.GetId())
|
||||
cnt, err := q.CountWithError()
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/sqlchemy"
|
||||
|
||||
@@ -27,7 +29,7 @@ type ModelFilterOptions struct {
|
||||
OwnerId mcclient.IIdentityProvider
|
||||
}
|
||||
|
||||
func ApplyModelFilters(q *sqlchemy.SQuery, data *jsonutils.JSONDict, opts []*ModelFilterOptions) (*sqlchemy.SQuery, error) {
|
||||
func ApplyModelFilters(ctx context.Context, q *sqlchemy.SQuery, data *jsonutils.JSONDict, opts []*ModelFilterOptions) (*sqlchemy.SQuery, error) {
|
||||
var err error
|
||||
for _, opt := range opts {
|
||||
v := NewModelIdOrNameValidator(
|
||||
@@ -36,7 +38,7 @@ func ApplyModelFilters(q *sqlchemy.SQuery, data *jsonutils.JSONDict, opts []*Mod
|
||||
opt.OwnerId,
|
||||
)
|
||||
v.Optional(true)
|
||||
q, err = v.QueryFilter(q, data)
|
||||
q, err = v.QueryFilter(ctx, q, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ package validators
|
||||
// uri
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"math"
|
||||
"net"
|
||||
@@ -42,10 +43,10 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/util/choices"
|
||||
)
|
||||
|
||||
type ValidatorFunc func(*jsonutils.JSONDict) error
|
||||
type ValidatorFunc func(context.Context, *jsonutils.JSONDict) error
|
||||
|
||||
type IValidatorBase interface {
|
||||
Validate(data *jsonutils.JSONDict) error
|
||||
Validate(ctx context.Context, data *jsonutils.JSONDict) error
|
||||
}
|
||||
|
||||
type IValidator interface {
|
||||
@@ -144,7 +145,7 @@ func NewIPv4PrefixValidator(key string) *ValidatorIPv4Prefix {
|
||||
return v
|
||||
}
|
||||
|
||||
func (v *ValidatorIPv4Prefix) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorIPv4Prefix) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -197,7 +198,7 @@ func (v *ValidatorIntChoices) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorIntChoices) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorIntChoices) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -241,7 +242,7 @@ func (v *ValidatorStringChoices) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorStringChoices) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorStringChoices) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -325,7 +326,7 @@ func (v *ValidatorStringMultiChoices) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorStringMultiChoices) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorStringMultiChoices) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -355,7 +356,7 @@ func (v *ValidatorBool) getValue() interface{} {
|
||||
func (v *ValidatorBool) Default(i bool) IValidator {
|
||||
return v.Validator.Default(i)
|
||||
}
|
||||
func (v *ValidatorBool) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorBool) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -393,7 +394,7 @@ func (v *ValidatorRange) Default(i int64) IValidator {
|
||||
}
|
||||
panic("invalid default for " + v.Key)
|
||||
}
|
||||
func (v *ValidatorRange) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorRange) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -519,7 +520,7 @@ func (v *ValidatorModelIdOrName) AllowEmpty(b bool) *ValidatorModelIdOrName {
|
||||
return v
|
||||
}
|
||||
|
||||
func (v *ValidatorModelIdOrName) validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorModelIdOrName) validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if !data.Contains(v.Key) && data.Contains(v.modelIdKey) {
|
||||
// a hack when validator is used solely for fetching model
|
||||
// object. This can happen when input json data was validated
|
||||
@@ -550,7 +551,7 @@ func (v *ValidatorModelIdOrName) validate(data *jsonutils.JSONDict) error {
|
||||
return newModelManagerError(v.ModelKeyword)
|
||||
}
|
||||
v.ModelManager = modelManager
|
||||
model, err := modelManager.FetchByIdOrName(v, modelIdOrName)
|
||||
model, err := modelManager.FetchByIdOrName(ctx, v, modelIdOrName)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return newModelNotFoundError(v.ModelKeyword, modelIdOrName, err)
|
||||
@@ -567,8 +568,8 @@ func (v *ValidatorModelIdOrName) validate(data *jsonutils.JSONDict) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v *ValidatorModelIdOrName) Validate(data *jsonutils.JSONDict) error {
|
||||
err := v.validate(data)
|
||||
func (v *ValidatorModelIdOrName) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
err := v.validate(ctx, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -587,8 +588,8 @@ func (v *ValidatorModelIdOrName) Validate(data *jsonutils.JSONDict) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v *ValidatorModelIdOrName) QueryFilter(q *sqlchemy.SQuery, data *jsonutils.JSONDict) (*sqlchemy.SQuery, error) {
|
||||
err := v.validate(data)
|
||||
func (v *ValidatorModelIdOrName) QueryFilter(ctx context.Context, q *sqlchemy.SQuery, data *jsonutils.JSONDict) (*sqlchemy.SQuery, error) {
|
||||
err := v.validate(ctx, data)
|
||||
if err != nil {
|
||||
if IsModelNotFoundError(err) {
|
||||
// hack
|
||||
@@ -620,7 +621,7 @@ func (v *ValidatorRegexp) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorRegexp) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorRegexp) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -697,8 +698,8 @@ func (v *ValidatorHostPort) OptionalPort(optionalPort bool) *ValidatorHostPort {
|
||||
return v
|
||||
}
|
||||
|
||||
func (v *ValidatorHostPort) Validate(data *jsonutils.JSONDict) error {
|
||||
err := v.ValidatorRegexp.Validate(data)
|
||||
func (v *ValidatorHostPort) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
err := v.ValidatorRegexp.Validate(ctx, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -753,7 +754,7 @@ func (v *ValidatorStruct) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorStruct) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorStruct) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -762,7 +763,7 @@ func (v *ValidatorStruct) Validate(data *jsonutils.JSONDict) error {
|
||||
return newGeneralError(v.Key, err)
|
||||
}
|
||||
if valueValidator, ok := v.Value.(IValidatorBase); ok {
|
||||
err = valueValidator.Validate(data)
|
||||
err = valueValidator.Validate(ctx, data)
|
||||
if err != nil {
|
||||
return newInvalidStructError(v.Key, err)
|
||||
}
|
||||
@@ -803,7 +804,7 @@ func (v *ValidatorIPv4Addr) setDefault(data *jsonutils.JSONDict) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (v *ValidatorIPv4Addr) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorIPv4Addr) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -827,12 +828,12 @@ func NewIPv4AddrValidator(key string) *ValidatorIPv4Addr {
|
||||
return v
|
||||
}
|
||||
|
||||
var ValidateModel = func(userCred mcclient.TokenCredential, manager db.IStandaloneModelManager, id *string) (db.IModel, error) {
|
||||
var ValidateModel = func(ctx context.Context, userCred mcclient.TokenCredential, manager db.IStandaloneModelManager, id *string) (db.IModel, error) {
|
||||
if len(*id) == 0 {
|
||||
return nil, httperrors.NewMissingParameterError(manager.Keyword() + "_id")
|
||||
}
|
||||
|
||||
model, err := manager.FetchByIdOrName(userCred, *id)
|
||||
model, err := manager.FetchByIdOrName(ctx, userCred, *id)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), *id)
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -152,7 +153,7 @@ func (v *ValidatorByActor) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorByActor) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorByActor) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ func (v *ValidatorPEM) setDefault(data *jsonutils.JSONDict) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (v *ValidatorPEM) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorPEM) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -170,7 +170,7 @@ func (v *ValidatorCertificate) setCertificates(certs []*x509.Certificate, data *
|
||||
v.Certificates = certs
|
||||
}
|
||||
|
||||
func (v *ValidatorCertificate) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorCertificate) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -341,7 +341,7 @@ func (v *ValidatorPrivateKey) setPrivateKey(pkey crypto.PrivateKey, data *jsonut
|
||||
v.PrivateKey = pkey
|
||||
}
|
||||
|
||||
func (v *ValidatorPrivateKey) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorPrivateKey) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
@@ -392,13 +392,13 @@ func NewCertKeyValidator(cert, key string) *ValidatorCertKey {
|
||||
}
|
||||
}
|
||||
|
||||
func (v *ValidatorCertKey) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorCertKey) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
keyV := map[string]IValidator{
|
||||
"certificate": v.ValidatorCertificate,
|
||||
"private_key": v.ValidatorPrivateKey,
|
||||
}
|
||||
for _, v := range keyV {
|
||||
if err := v.Validate(data); err != nil {
|
||||
if err := v.Validate(ctx, data); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
@@ -113,7 +114,7 @@ Oycn3Dy2jpdE7SpoBCt3HsIhra8a6h7BcCQ87UwObqTsdLe+7/oD
|
||||
ValidatorPrivateKey: tt.fields.ValidatorPrivateKey,
|
||||
certPubKeyAlgo: tt.fields.certPubKeyAlgo,
|
||||
}
|
||||
if err := v.Validate(tt.args.data); (err != nil) != tt.wantErr {
|
||||
if err := v.Validate(context.Background(), tt.args.data); (err != nil) != tt.wantErr {
|
||||
t.Errorf("ValidateCertKey.Validator() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"golang.org/x/crypto/ssh"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
@@ -55,7 +57,7 @@ func (v *ValidatorSSHKey) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorSSHKey) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorSSHKey) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
package validators
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
)
|
||||
|
||||
@@ -61,7 +63,7 @@ func (v *ValidatorStringLen) getValue() interface{} {
|
||||
return v.Value
|
||||
}
|
||||
|
||||
func (v *ValidatorStringLen) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *ValidatorStringLen) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ package validators
|
||||
// - invalid default for string choice, range
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"reflect"
|
||||
"testing"
|
||||
@@ -79,7 +80,7 @@ func testS(t *testing.T, v IValidator, c *C) {
|
||||
|
||||
j, _ := jsonutils.ParseString(c.In)
|
||||
jd := j.(*jsonutils.JSONDict)
|
||||
err := v.Validate(jd)
|
||||
err := v.Validate(context.Background(), jd)
|
||||
if err != nil {
|
||||
verr, ok := err.(*ValidateError)
|
||||
if ok {
|
||||
@@ -777,7 +778,7 @@ type TestStruct struct {
|
||||
|
||||
type TestVStruct TestStruct
|
||||
|
||||
func (v *TestVStruct) Validate(data *jsonutils.JSONDict) error {
|
||||
func (v *TestVStruct) Validate(ctx context.Context, data *jsonutils.JSONDict) error {
|
||||
switch v.Name {
|
||||
case "bad":
|
||||
return newInvalidValueError("Name", v.Name)
|
||||
|
||||
Reference in New Issue
Block a user