Remove variadic argument from storage interface

This commit is contained in:
wojtekt 2020-11-02 15:52:51 +01:00
parent a704860194
commit 8b98305858
17 changed files with 40 additions and 34 deletions

View File

@ -108,7 +108,7 @@ func (s *storageLeases) UpdateLease(ip string) error {
klog.V(6).Infof("Resetting TTL on master IP %q listed in storage to %v", ip, leaseTime) klog.V(6).Infof("Resetting TTL on master IP %q listed in storage to %v", ip, leaseTime)
return existing, &leaseTime, nil return existing, &leaseTime, nil
}) }, nil)
} }
// RemoveLease removes the lease on a master IP in storage // RemoveLease removes the lease on a master IP in storage

View File

@ -231,7 +231,7 @@ func (r *RollbackREST) setDeploymentRollback(ctx context.Context, deploymentID s
d.Spec.RollbackTo = config d.Spec.RollbackTo = config
finalDeployment = d finalDeployment = d
return d, nil return d, nil
}), dryRun) }), dryRun, nil)
return finalDeployment, err return finalDeployment, err
} }

View File

@ -221,6 +221,7 @@ func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.Va
return existingNamespace, nil return existingNamespace, nil
}), }),
dryrun.IsDryRun(options.DryRun), dryrun.IsDryRun(options.DryRun),
nil,
) )
if err != nil { if err != nil {

View File

@ -214,7 +214,7 @@ func (r *BindingREST) setPodHostAndAnnotations(ctx context.Context, podID, oldMa
}) })
finalPod = pod finalPod = pod
return pod, nil return pod, nil
}), dryRun) }), dryRun, nil)
return finalPod, err return finalPod, err
} }

View File

@ -172,6 +172,7 @@ func (e *Etcd) tryUpdate(fn func() error) error {
existing.Data = data existing.Data = data
return existing, nil return existing, nil
}), }),
nil,
) )
return storeerr.InterpretUpdateError(err, e.resource, "") return storeerr.InterpretUpdateError(err, e.resource, "")
} }
@ -207,6 +208,7 @@ func (e *Etcd) CreateOrUpdate(snapshot *api.RangeAllocation) error {
last = snapshot.ResourceVersion last = snapshot.ResourceVersion
return snapshot, nil return snapshot, nil
}), }),
nil,
) )
if err != nil { if err != nil {
return storeerr.InterpretUpdateError(err, e.resource, "") return storeerr.InterpretUpdateError(err, e.resource, "")

View File

@ -145,6 +145,7 @@ func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.Va
return existingCRD, nil return existingCRD, nil
}), }),
dryrun.IsDryRun(options.DryRun), dryrun.IsDryRun(options.DryRun),
nil,
) )
if err != nil { if err != nil {

View File

@ -78,7 +78,7 @@ func (s *DryRunnableStorage) List(ctx context.Context, key string, opts storage.
func (s *DryRunnableStorage) GuaranteedUpdate( func (s *DryRunnableStorage) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, suggestion ...runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, suggestion runtime.Object) error {
if dryRun { if dryRun {
err := s.Storage.Get(ctx, key, storage.GetOptions{IgnoreNotFound: ignoreNotFound}, ptrToType) err := s.Storage.Get(ctx, key, storage.GetOptions{IgnoreNotFound: ignoreNotFound}, ptrToType)
if err != nil { if err != nil {
@ -98,7 +98,7 @@ func (s *DryRunnableStorage) GuaranteedUpdate(
} }
return s.copyInto(out, ptrToType) return s.copyInto(out, ptrToType)
} }
return s.Storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, suggestion...) return s.Storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, suggestion)
} }
func (s *DryRunnableStorage) Count(key string) (int64, error) { func (s *DryRunnableStorage) Count(key string) (int64, error) {

View File

@ -121,7 +121,7 @@ func TestDryRunUpdateMissingObjectFails(t *testing.T) {
return input, nil, errors.New("UpdateFunction shouldn't be called") return input, nil, errors.New("UpdateFunction shouldn't be called")
} }
err := s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true) err := s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true, nil)
if e, ok := err.(*storage.StorageError); !ok || e.Code != storage.ErrCodeKeyNotFound { if e, ok := err.(*storage.StorageError); !ok || e.Code != storage.ErrCodeKeyNotFound {
t.Errorf("Expected key to be not found, error: %v", err) t.Errorf("Expected key to be not found, error: %v", err)
} }
@ -148,12 +148,12 @@ func TestDryRunUpdatePreconditions(t *testing.T) {
} }
wrongID := types.UID("wrong-uid") wrongID := types.UID("wrong-uid")
myID := types.UID("my-uid") myID := types.UID("my-uid")
err = s.GuaranteedUpdate(context.Background(), "key", obj, false, &storage.Preconditions{UID: &wrongID}, updateFunc, true) err = s.GuaranteedUpdate(context.Background(), "key", obj, false, &storage.Preconditions{UID: &wrongID}, updateFunc, true, nil)
if e, ok := err.(*storage.StorageError); !ok || e.Code != storage.ErrCodeInvalidObj { if e, ok := err.(*storage.StorageError); !ok || e.Code != storage.ErrCodeInvalidObj {
t.Errorf("Expected invalid object, error: %v", err) t.Errorf("Expected invalid object, error: %v", err)
} }
err = s.GuaranteedUpdate(context.Background(), "key", obj, false, &storage.Preconditions{UID: &myID}, updateFunc, true) err = s.GuaranteedUpdate(context.Background(), "key", obj, false, &storage.Preconditions{UID: &myID}, updateFunc, true, nil)
if err != nil { if err != nil {
t.Fatalf("Failed to update with valid precondition: %v", err) t.Fatalf("Failed to update with valid precondition: %v", err)
} }
@ -180,7 +180,7 @@ func TestDryRunUpdateDoesntUpdate(t *testing.T) {
return u, nil, nil return u, nil, nil
} }
err = s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true) err = s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true, nil)
if err != nil { if err != nil {
t.Fatalf("Failed to dry-run update: %v", err) t.Fatalf("Failed to dry-run update: %v", err)
} }
@ -212,7 +212,7 @@ func TestDryRunUpdateReturnsObject(t *testing.T) {
return u, nil, nil return u, nil, nil
} }
err = s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true) err = s.GuaranteedUpdate(context.Background(), "key", obj, false, nil, updateFunc, true, nil)
if err != nil { if err != nil {
t.Fatalf("Failed to dry-run update: %v", err) t.Fatalf("Failed to dry-run update: %v", err)
} }

View File

@ -568,7 +568,7 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj
return obj, &ttl, nil return obj, &ttl, nil
} }
return obj, nil, nil return obj, nil, nil
}, dryrun.IsDryRun(options.DryRun)) }, dryrun.IsDryRun(options.DryRun), nil)
if err != nil { if err != nil {
// delete the object // delete the object
@ -855,6 +855,7 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx context.Context, name
return existing, nil return existing, nil
}), }),
dryrun.IsDryRun(options.DryRun), dryrun.IsDryRun(options.DryRun),
nil,
) )
switch err { switch err {
case nil: case nil:

View File

@ -1926,7 +1926,7 @@ type staleGuaranteedUpdateStorage struct {
// GuaranteedUpdate overwrites the method with one that always suggests the cachedObj. // GuaranteedUpdate overwrites the method with one that always suggests the cachedObj.
func (s *staleGuaranteedUpdateStorage) GuaranteedUpdate( func (s *staleGuaranteedUpdateStorage) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ ...runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error {
return s.Interface.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, s.cachedObj) return s.Interface.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, s.cachedObj)
} }

View File

@ -730,7 +730,7 @@ func (c *Cacher) List(ctx context.Context, key string, opts storage.ListOptions,
// GuaranteedUpdate implements storage.Interface. // GuaranteedUpdate implements storage.Interface.
func (c *Cacher) GuaranteedUpdate( func (c *Cacher) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ ...runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error {
// Ignore the suggestion and try to pass down the current version of the object // Ignore the suggestion and try to pass down the current version of the object
// read from cache. // read from cache.
if elem, exists, err := c.watchCache.GetByKey(key); err != nil { if elem, exists, err := c.watchCache.GetByKey(key); err != nil {
@ -740,7 +740,7 @@ func (c *Cacher) GuaranteedUpdate(
return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj) return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj)
} }
// If we couldn't get the object, fallback to no-suggestion. // If we couldn't get the object, fallback to no-suggestion.
return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate) return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, nil)
} }
// Count implements storage.Interface. // Count implements storage.Interface.

View File

@ -319,7 +319,7 @@ func (d *dummyStorage) List(_ context.Context, _ string, _ storage.ListOptions,
podList.ListMeta = metav1.ListMeta{ResourceVersion: "100"} podList.ListMeta = metav1.ListMeta{ResourceVersion: "100"}
return d.err return d.err
} }
func (d *dummyStorage) GuaranteedUpdate(_ context.Context, _ string, _ runtime.Object, _ bool, _ *storage.Preconditions, _ storage.UpdateFunc, _ ...runtime.Object) error { func (d *dummyStorage) GuaranteedUpdate(_ context.Context, _ string, _ runtime.Object, _ bool, _ *storage.Preconditions, _ storage.UpdateFunc, _ runtime.Object) error {
return fmt.Errorf("unimplemented") return fmt.Errorf("unimplemented")
} }
func (d *dummyStorage) Count(_ string) (int64, error) { func (d *dummyStorage) Count(_ string) (int64, error) {

View File

@ -238,7 +238,7 @@ func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.O
// GuaranteedUpdate implements storage.Interface.GuaranteedUpdate. // GuaranteedUpdate implements storage.Interface.GuaranteedUpdate.
func (s *store) GuaranteedUpdate( func (s *store) GuaranteedUpdate(
ctx context.Context, key string, out runtime.Object, ignoreNotFound bool, ctx context.Context, key string, out runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, suggestion ...runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, suggestion runtime.Object) error {
trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)}) trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)})
defer trace.LogIfLong(500 * time.Millisecond) defer trace.LogIfLong(500 * time.Millisecond)
@ -260,8 +260,8 @@ func (s *store) GuaranteedUpdate(
var origState *objState var origState *objState
var mustCheckData bool var mustCheckData bool
if len(suggestion) == 1 && suggestion[0] != nil { if suggestion != nil {
origState, err = s.getStateFromObject(suggestion[0]) origState, err = s.getStateFromObject(suggestion)
if err != nil { if err != nil {
return err return err
} }

View File

@ -204,7 +204,7 @@ func TestGet(t *testing.T) {
func(_ runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) { func(_ runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) {
ttl := uint64(1) ttl := uint64(1)
return updateObj, &ttl, nil return updateObj, &ttl, nil
}) }, nil)
if err != nil { if err != nil {
t.Fatalf("Update failed: %v", err) t.Fatalf("Update failed: %v", err)
} }
@ -592,7 +592,7 @@ func TestGuaranteedUpdate(t *testing.T) {
} }
pod.Name = name pod.Name = name
return &pod, nil return &pod, nil
})) }), nil)
store.transformer = originalTransformer store.transformer = originalTransformer
if tt.expectNotFoundErr { if tt.expectNotFoundErr {
@ -645,7 +645,7 @@ func TestGuaranteedUpdateWithTTL(t *testing.T) {
func(_ runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) { func(_ runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) {
ttl := uint64(1) ttl := uint64(1)
return input, &ttl, nil return input, &ttl, nil
}) }, nil)
if err != nil { if err != nil {
t.Fatalf("Create failed: %v", err) t.Fatalf("Create failed: %v", err)
} }
@ -742,7 +742,7 @@ func TestGuaranteedUpdateWithConflict(t *testing.T) {
pod.Name = "foo-1" pod.Name = "foo-1"
secondToEnter.Wait() secondToEnter.Wait()
return pod, nil return pod, nil
})) }), nil)
firstToFinish.Done() firstToFinish.Done()
errChan <- err errChan <- err
}() }()
@ -758,7 +758,7 @@ func TestGuaranteedUpdateWithConflict(t *testing.T) {
pod := obj.(*example.Pod) pod := obj.(*example.Pod)
pod.Name = "foo-2" pod.Name = "foo-2"
return pod, nil return pod, nil
})) }), nil)
if err != nil { if err != nil {
t.Fatalf("Second GuaranteedUpdate error %#v", err) t.Fatalf("Second GuaranteedUpdate error %#v", err)
} }
@ -784,6 +784,7 @@ func TestGuaranteedUpdateWithSuggestionAndConflict(t *testing.T) {
pod.Name = "foo-2" pod.Name = "foo-2"
return pod, nil return pod, nil
}), }),
nil,
) )
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
@ -875,7 +876,7 @@ func TestTransformationFailure(t *testing.T) {
// GuaranteedUpdate without suggestion should return an error // GuaranteedUpdate without suggestion should return an error
if err := store.GuaranteedUpdate(ctx, preset[1].key, &example.Pod{}, false, nil, func(input runtime.Object, res storage.ResponseMeta) (output runtime.Object, ttl *uint64, err error) { if err := store.GuaranteedUpdate(ctx, preset[1].key, &example.Pod{}, false, nil, func(input runtime.Object, res storage.ResponseMeta) (output runtime.Object, ttl *uint64, err error) {
return input, nil, nil return input, nil, nil
}); !storage.IsInternalError(err) { }, nil); !storage.IsInternalError(err) {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
// GuaranteedUpdate with suggestion should return an error if we don't change the object // GuaranteedUpdate with suggestion should return an error if we don't change the object

View File

@ -108,7 +108,7 @@ func testWatch(t *testing.T, recursive bool) {
err := store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( err := store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate(
func(runtime.Object) (runtime.Object, error) { func(runtime.Object) (runtime.Object, error) {
return watchTest.obj, nil return watchTest.obj, nil
})) }), nil)
if err != nil { if err != nil {
t.Fatalf("GuaranteedUpdate failed: %v", err) t.Fatalf("GuaranteedUpdate failed: %v", err)
} }
@ -161,7 +161,7 @@ func TestWatchFromZero(t *testing.T) {
err = store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( err = store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate(
func(runtime.Object) (runtime.Object, error) { func(runtime.Object) (runtime.Object, error) {
return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "ns", Annotations: map[string]string{"a": "1"}}}, nil return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "ns", Annotations: map[string]string{"a": "1"}}}, nil
})) }), nil)
if err != nil { if err != nil {
t.Fatalf("GuaranteedUpdate failed: %v", err) t.Fatalf("GuaranteedUpdate failed: %v", err)
} }
@ -179,7 +179,7 @@ func TestWatchFromZero(t *testing.T) {
err = store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( err = store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate(
func(runtime.Object) (runtime.Object, error) { func(runtime.Object) (runtime.Object, error) {
return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "ns"}}, nil return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "ns"}}, nil
})) }), nil)
if err != nil { if err != nil {
t.Fatalf("GuaranteedUpdate failed: %v", err) t.Fatalf("GuaranteedUpdate failed: %v", err)
} }
@ -217,7 +217,7 @@ func TestWatchFromNoneZero(t *testing.T) {
store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate(
func(runtime.Object) (runtime.Object, error) { func(runtime.Object) (runtime.Object, error) {
return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}, err return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}, err
})) }), nil)
testCheckResult(t, 0, watch.Modified, w, out) testCheckResult(t, 0, watch.Modified, w, out)
} }
@ -235,7 +235,7 @@ func TestWatchError(t *testing.T) {
validStore.GuaranteedUpdate(ctx, "/abc", &example.Pod{}, true, nil, storage.SimpleUpdate( validStore.GuaranteedUpdate(ctx, "/abc", &example.Pod{}, true, nil, storage.SimpleUpdate(
func(runtime.Object) (runtime.Object, error) { func(runtime.Object) (runtime.Object, error) {
return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, nil return &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, nil
})) }), nil)
testCheckEventType(t, watch.Error, w) testCheckEventType(t, watch.Error, w)
} }

View File

@ -215,9 +215,9 @@ type Interface interface {
// or zero value in 'ptrToType' parameter otherwise. // or zero value in 'ptrToType' parameter otherwise.
// If the object to update has the same value as previous, it won't do any update // If the object to update has the same value as previous, it won't do any update
// but will return the object in 'ptrToType' parameter. // but will return the object in 'ptrToType' parameter.
// If 'suggestion' can contain zero or one element - in such case this can be used as // If 'suggestion' is non-nil, it can be used as a suggestion about the current version
// a suggestion about the current version of the object to avoid read operation from // of the object to avoid read operation from storage to get it. However, the
// storage to get it. // implementations have to retry in case suggestion is stale.
// //
// Example: // Example:
// //
@ -239,7 +239,7 @@ type Interface interface {
// ) // )
GuaranteedUpdate( GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
precondtions *Preconditions, tryUpdate UpdateFunc, suggestion ...runtime.Object) error precondtions *Preconditions, tryUpdate UpdateFunc, suggestion runtime.Object) error
// Count returns number of different entries under the key (generally being path prefix). // Count returns number of different entries under the key (generally being path prefix).
Count(key string) (int64, error) Count(key string) (int64, error)

View File

@ -149,7 +149,7 @@ func updatePod(t *testing.T, s storage.Interface, obj, old *example.Pod) *exampl
return obj.DeepCopyObject(), nil, nil return obj.DeepCopyObject(), nil, nil
} }
key := "pods/" + obj.Namespace + "/" + obj.Name key := "pods/" + obj.Namespace + "/" + obj.Name
if err := s.GuaranteedUpdate(context.TODO(), key, &example.Pod{}, old == nil, nil, updateFn); err != nil { if err := s.GuaranteedUpdate(context.TODO(), key, &example.Pod{}, old == nil, nil, updateFn, nil); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
obj.ResourceVersion = "" obj.ResourceVersion = ""