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

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2024-02-05 20:06:40 +08:00
committed by GitHub
co-authored by Qiu Jian
parent 7ad776ed5d
commit 81a12d1f16
270 changed files with 1460 additions and 1323 deletions
+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)