From c0b080ab660d9f651f254a8b23621afb7b4115ae Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Mon, 24 Jun 2019 10:44:55 +0000 Subject: [PATCH] =?UTF-8?q?validators:=20=E9=BB=98=E8=AE=A4=E5=B0=86pendin?= =?UTF-8?q?g=20deleted=E7=9A=84=E6=A8=A1=E5=9E=8B=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E5=9C=A8=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudcommon/validators/errors.go | 2 +- pkg/cloudcommon/validators/validators.go | 31 +++++++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/pkg/cloudcommon/validators/errors.go b/pkg/cloudcommon/validators/errors.go index e5d519c9d9..6abf9c142d 100644 --- a/pkg/cloudcommon/validators/errors.go +++ b/pkg/cloudcommon/validators/errors.go @@ -113,7 +113,7 @@ func newModelManagerError(modelKeyword string) error { func newModelNotFoundError(modelKeyword, idOrName string, err error) error { errFmt := "cannot find %q with id/name %q" params := []interface{}{modelKeyword, idOrName} - if err != sql.ErrNoRows { + if err != nil && err != sql.ErrNoRows { errFmt += ": %s" params = append(params, err.Error()) } diff --git a/pkg/cloudcommon/validators/validators.go b/pkg/cloudcommon/validators/validators.go index a86d6ceb71..726136face 100644 --- a/pkg/cloudcommon/validators/validators.go +++ b/pkg/cloudcommon/validators/validators.go @@ -381,11 +381,12 @@ func NewNonNegativeValidator(key string) *ValidatorRange { type ValidatorModelIdOrName struct { Validator - ModelKeyword string - OwnerId mcclient.IIdentityProvider - ModelManager db.IModelManager - Model db.IModel - modelIdKey string + ModelKeyword string + OwnerId mcclient.IIdentityProvider + ModelManager db.IModelManager + Model db.IModel + modelIdKey string + noPendingDeleted bool } func (v *ValidatorModelIdOrName) GetProjectId() string { @@ -434,10 +435,11 @@ func (v *ValidatorModelIdOrName) getValue() interface{} { func NewModelIdOrNameValidator(key string, modelKeyword string, ownerId mcclient.IIdentityProvider) *ValidatorModelIdOrName { v := &ValidatorModelIdOrName{ - Validator: Validator{Key: key}, - OwnerId: ownerId, - ModelKeyword: modelKeyword, - modelIdKey: key + "_id", + Validator: Validator{Key: key}, + OwnerId: ownerId, + ModelKeyword: modelKeyword, + modelIdKey: key + "_id", + noPendingDeleted: true, } v.SetParent(v) return v @@ -448,6 +450,12 @@ func (v *ValidatorModelIdOrName) ModelIdKey(modelIdKey string) *ValidatorModelId return v } +// AllowPendingDeleted allows the to-be-validated id or name to be of a pending deleted model +func (v *ValidatorModelIdOrName) AllowPendingDeleted(b bool) *ValidatorModelIdOrName { + v.noPendingDeleted = !b + return v +} + func (v *ValidatorModelIdOrName) validate(data *jsonutils.JSONDict) error { if err, isSet := v.Validator.validateEx(data); err != nil || !isSet { return err @@ -466,6 +474,11 @@ func (v *ValidatorModelIdOrName) validate(data *jsonutils.JSONDict) error { if err != nil { return newModelNotFoundError(v.ModelKeyword, modelIdOrName, err) } + if v.noPendingDeleted { + if pd, ok := model.(db.IPendingDeletable); ok && pd.GetPendingDeleted() { + return newModelNotFoundError(v.ModelKeyword, modelIdOrName, nil) + } + } v.Model = model return nil }