From b5258a53809bde48cac07848d787a0fc7db16b2a Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Tue, 31 Jul 2018 13:53:27 -0700 Subject: [PATCH] storage: Move precondition check as a method of preconditions --- .../pkg/registry/generic/registry/dryrun.go | 21 ++-------------- .../apiserver/pkg/storage/etcd/etcd_helper.go | 19 ++------------ .../apiserver/pkg/storage/etcd3/store.go | 19 ++------------ .../apiserver/pkg/storage/interfaces.go | 25 +++++++++++++++++++ 4 files changed, 31 insertions(+), 53 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go index dd6d443efca..08046fa22cc 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go @@ -18,9 +18,7 @@ package registry import ( "context" - "fmt" - "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/storage" @@ -51,7 +49,7 @@ func (s *DryRunnableStorage) Delete(ctx context.Context, key string, out runtime if err := s.Storage.Get(ctx, key, "", out, false); err != nil { return err } - return checkPreconditions(key, preconditions, out) + return preconditions.Check(key, out) } return s.Storage.Delete(ctx, key, out, preconditions) } @@ -84,7 +82,7 @@ func (s *DryRunnableStorage) GuaranteedUpdate( if err != nil { return err } - err = checkPreconditions(key, preconditions, ptrToType) + err = preconditions.Check(key, ptrToType) if err != nil { return err } @@ -103,21 +101,6 @@ func (s *DryRunnableStorage) Count(key string) (int64, error) { return s.Storage.Count(key) } -func checkPreconditions(key string, preconditions *storage.Preconditions, obj runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := meta.Accessor(obj) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, obj, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.GetUID()) - return storage.NewInvalidObjError(key, errMsg) - } - return nil -} - func (s *DryRunnableStorage) copyInto(in, out runtime.Object) error { var data []byte diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go b/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go index 0906a181751..c6bdd9c92cd 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go @@ -153,21 +153,6 @@ func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Ob return err } -func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := meta.Accessor(out) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.GetUID()) - return storage.NewInvalidObjError(key, errMsg) - } - return nil -} - // Implements storage.Interface. func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error { if ctx == nil { @@ -199,7 +184,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, if err != nil { return toStorageErr(err, key, 0) } - if err := checkPreconditions(key, preconditions, obj); err != nil { + if err := preconditions.Check(key, obj); err != nil { return toStorageErr(err, key, 0) } index := uint64(0) @@ -493,7 +478,7 @@ func (h *etcdHelper) GuaranteedUpdate( if err != nil { return toStorageErr(err, key, 0) } - if err := checkPreconditions(key, preconditions, obj); err != nil { + if err := preconditions.Check(key, obj); err != nil { return toStorageErr(err, key, 0) } meta := storage.ResponseMeta{} diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go index 6385ea9736d..83354478d8e 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go @@ -233,7 +233,7 @@ func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.O if err != nil { return err } - if err := checkPreconditions(key, preconditions, origState.obj); err != nil { + if err := preconditions.Check(key, origState.obj); err != nil { return err } txnResp, err := s.client.KV.Txn(ctx).If( @@ -294,7 +294,7 @@ func (s *store) GuaranteedUpdate( transformContext := authenticatedDataString(key) for { - if err := checkPreconditions(key, preconditions, origState.obj); err != nil { + if err := preconditions.Check(key, origState.obj); err != nil { return err } @@ -791,21 +791,6 @@ func appendListItem(v reflect.Value, data []byte, rev uint64, pred storage.Selec return nil } -func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := meta.Accessor(out) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.GetUID()) - return storage.NewInvalidObjError(key, errMsg) - } - return nil -} - func notFound(key string) clientv3.Cmp { return clientv3.Compare(clientv3.ModRevision(key), "=", 0) } diff --git a/staging/src/k8s.io/apiserver/pkg/storage/interfaces.go b/staging/src/k8s.io/apiserver/pkg/storage/interfaces.go index ed1a78887ea..2b5da24ff86 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/interfaces.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/interfaces.go @@ -18,7 +18,9 @@ package storage import ( "context" + "fmt" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -106,6 +108,29 @@ func NewUIDPreconditions(uid string) *Preconditions { return &Preconditions{UID: &u} } +func (p *Preconditions) Check(key string, obj runtime.Object) error { + if p == nil { + return nil + } + objMeta, err := meta.Accessor(obj) + if err != nil { + return NewInternalErrorf( + "can't enforce preconditions %v on un-introspectable object %v, got error: %v", + *p, + obj, + err) + } + if p.UID != nil && *p.UID != objMeta.GetUID() { + err := fmt.Sprintf( + "Precondition failed: UID in precondition: %v, UID in object meta: %v", + *p.UID, + objMeta.GetUID()) + return NewInvalidObjError(key, err) + } + return nil + +} + // Interface offers a common interface for object marshaling/unmarshaling operations and // hides all the storage-related operations behind it. type Interface interface {