feature: allow manager to preapre query context (#19455)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2024-02-06 00:01:26 +08:00
committed by GitHub
co-authored by Qiu Jian
parent 1bd5f73365
commit eef9e48e02
270 changed files with 1463 additions and 1323 deletions
+3 -2
View File
@@ -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
}
+52
View File
@@ -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)
}
+11 -6
View File
@@ -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
}
+34 -26
View File
@@ -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 {
+5 -7
View File
@@ -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
}
+1 -1
View File
@@ -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()
+6 -6
View File
@@ -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 {
+2 -2
View File
@@ -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 {
+4 -3
View File
@@ -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 {
+6 -6
View File
@@ -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
+17 -13
View File
@@ -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))
+7 -3
View File
@@ -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
}
+14 -14
View File
@@ -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
+1 -1
View File
@@ -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:
+8 -8
View File
@@ -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
}
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
}
+8 -8
View File
@@ -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)
}
}
}
+2 -2
View File
@@ -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 {
+5 -5
View File
@@ -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")
}
+3 -3
View File
@@ -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:
+1 -1
View File
@@ -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:
+5 -5
View File
@@ -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) {
+3 -3
View File
@@ -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())
+5 -5
View File
@@ -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()
+4 -2
View File
@@ -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
}
+23 -22
View File
@@ -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)