mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
feature: allow manager to preapre query context (#19451)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -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