diff --git a/go.mod b/go.mod index c84630b02..16631e858 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( k8s.io/api v0.0.0-20260114012703-c51ea733cfc5 k8s.io/apimachinery v0.0.0-20260114012332-8931c298fc6d k8s.io/cli-runtime v0.0.0-20260114021257-dff199191c95 - k8s.io/client-go v0.0.0-20260114013155-d8ad3ab106f8 + k8s.io/client-go v0.0.0-20260115013208-14e71d285024 k8s.io/component-base v0.0.0-20260114014353-b07a9541dc84 k8s.io/component-helpers v0.0.0-20260114014538-c52e34b7fb41 k8s.io/klog/v2 v2.130.1 @@ -92,3 +92,5 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect sigs.k8s.io/kustomize/api v0.20.1 // indirect ) + +replace k8s.io/code-generator => k8s.io/code-generator v0.0.0-20260114213448-138c280a7fed diff --git a/go.sum b/go.sum index 947b31e31..9ae7bd21b 100644 --- a/go.sum +++ b/go.sum @@ -198,8 +198,8 @@ k8s.io/apimachinery v0.0.0-20260114012332-8931c298fc6d h1:lbzMtYUrm8byD8FkOTpBww k8s.io/apimachinery v0.0.0-20260114012332-8931c298fc6d/go.mod h1:zpNwej4sm5trmv4IunJBZUKUdbsrjs+lz/cgK1B8Dew= k8s.io/cli-runtime v0.0.0-20260114021257-dff199191c95 h1:z+8PwCtVn9Vy/K9ycDSubhg8EzzEeXoV293DoTpYJ0M= k8s.io/cli-runtime v0.0.0-20260114021257-dff199191c95/go.mod h1:StMv4CBSJ8C+aETOp8T5xAwhl8EfugDmhnxhKJRz3aM= -k8s.io/client-go v0.0.0-20260114013155-d8ad3ab106f8 h1:eRON2KmcEv2o100zcpO5LjsrF9kFhyuXUfOmQlb3ZGI= -k8s.io/client-go v0.0.0-20260114013155-d8ad3ab106f8/go.mod h1:WH/2COL4UX2ClV8Y0ExNDUL0yecAqB7x0M5NVROCRYw= +k8s.io/client-go v0.0.0-20260115013208-14e71d285024 h1:QXRqHoBnPI7otK+y4Pxqs8MK1sUMWIKqP7adHte3t9s= +k8s.io/client-go v0.0.0-20260115013208-14e71d285024/go.mod h1:WH/2COL4UX2ClV8Y0ExNDUL0yecAqB7x0M5NVROCRYw= k8s.io/component-base v0.0.0-20260114014353-b07a9541dc84 h1:WLmvlHlKw1hiKNw1v2iILCWEPvtn8NClDxFr/+eMuig= k8s.io/component-base v0.0.0-20260114014353-b07a9541dc84/go.mod h1:Di8MCxUlKVRBDtxfcS5WXJHIYBWhB2D/3ojxiaxI1So= k8s.io/component-helpers v0.0.0-20260114014538-c52e34b7fb41 h1:U8bKHIMsJ2+KVsY9pAYaI7Ue00lMKnUbi9u1P4rIQzM= diff --git a/pkg/cmd/wait/delete.go b/pkg/cmd/wait/delete.go index a8ccd2fca..aeb8aa4d7 100644 --- a/pkg/cmd/wait/delete.go +++ b/pkg/cmd/wait/delete.go @@ -24,6 +24,7 @@ import ( "time" apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/fields" @@ -90,7 +91,7 @@ func IsDeleted(ctx context.Context, info *resource.Info, o *WaitOptions) (runtim // this function is used to refresh the cache to prevent timeout waits on resources that have disappeared preconditionFunc := func(store cache.Store) (bool, error) { - _, exists, err := store.Get(&metav1.ObjectMeta{Namespace: info.Namespace, Name: info.Name}) + obj, exists, err := store.Get(&metav1.ObjectMeta{Namespace: info.Namespace, Name: info.Name}) if err != nil { return true, err } @@ -98,7 +99,15 @@ func IsDeleted(ctx context.Context, info *resource.Info, o *WaitOptions) (runtim // since we're looking for it to disappear we just return here if it no longer exists return true, nil } - + acc, err := meta.Accessor(obj) + if err != nil { + return true, err + } + if uid, ok := o.UIDMap[resourceLocation]; ok { + if acc.GetUID() != uid { + return true, nil + } + } return false, nil } diff --git a/pkg/cmd/wait/wait_test.go b/pkg/cmd/wait/wait_test.go index 0f90129cc..0d0087359 100644 --- a/pkg/cmd/wait/wait_test.go +++ b/pkg/cmd/wait/wait_test.go @@ -180,6 +180,20 @@ func newUnstructured(apiVersion, kind, namespace, name string) *unstructured.Uns } } +func newUnstructuredWithNewID(apiVersion, kind, namespace, name string) *unstructured.Unstructured { + return &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": apiVersion, + "kind": kind, + "metadata": map[string]interface{}{ + "namespace": namespace, + "name": name, + "uid": "some-UID-value-new", + }, + }, + } +} + func newUnstructuredWithGeneration(apiVersion, kind, namespace, name string, generation int64) *unstructured.Unstructured { return &unstructured.Unstructured{ Object: map[string]interface{}{ @@ -544,6 +558,32 @@ func TestWaitForDeletion(t *testing.T) { }, timeout: 10 * time.Second, }, + { + name: "when list watch, receives a new pod", + infos: []*resource.Info{ + { + Mapping: &meta.RESTMapping{ + Resource: schema.GroupVersionResource{Group: "group", Version: "version", Resource: "theresource"}, + }, + Name: "name-foo", + Namespace: "ns-foo", + }, + }, + fakeClient: func() *dynamicfakeclient.FakeDynamicClient { + fakeClient := dynamicfakeclient.NewSimpleDynamicClientWithCustomListKinds(scheme, listMapping) + fakeClient.PrependReactor("get", "theresource", func(action clienttesting.Action) (handled bool, ret runtime.Object, err error) { + return true, newUnstructured("group/version", "TheKind", "ns-foo", "name-foo"), nil + }) + fakeClient.PrependReactor("list", "theresource", func(action clienttesting.Action) (handled bool, ret runtime.Object, err error) { + return true, newUnstructuredList(newUnstructuredWithNewID("group/version", "TheKind", "ns-foo", "name-foo")), nil + }) + return fakeClient + }, + timeout: 10 * time.Second, + uidMap: UIDMap{ + ResourceLocation{GroupResource: schema.GroupResource{Group: "group", Resource: "theresource"}, Namespace: "ns-foo", Name: "name-foo"}: types.UID("some-UID-value"), + }, + }, } for _, test := range tests {