diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait.go b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait.go index 2bb0db352b0..6cd4710ca1d 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait.go @@ -165,6 +165,7 @@ func (flags *WaitFlags) ToOptions(args []string) (*WaitOptions, error) { ResourceFinder: builder, DynamicClient: dynamicClient, Timeout: effectiveTimeout, + ForCondition: flags.ForCondition, Printer: printer, ConditionFn: conditionFn, @@ -215,6 +216,7 @@ type WaitOptions struct { UIDMap UIDMap DynamicClient dynamic.Interface Timeout time.Duration + ForCondition string Printer printers.ResourcePrinter ConditionFn ConditionFunc @@ -227,7 +229,7 @@ type ConditionFunc func(info *resource.Info, o *WaitOptions) (finalObject runtim // RunWait runs the waiting logic func (o *WaitOptions) RunWait() error { visitCount := 0 - err := o.ResourceFinder.Do().Visit(func(info *resource.Info, err error) error { + visitFunc := func(info *resource.Info, err error) error { if err != nil { return err } @@ -242,7 +244,13 @@ func (o *WaitOptions) RunWait() error { return fmt.Errorf("%v unsatisified for unknown reason", finalObject) } return err - }) + } + visitor := o.ResourceFinder.Do() + if visitor, ok := visitor.(*resource.Result); ok && strings.ToLower(o.ForCondition) == "delete" { + visitor.IgnoreErrors(apierrors.IsNotFound) + } + + err := visitor.Visit(visitFunc) if err != nil { return err } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go index 4e96eb0f7f7..c9312fae31b 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go @@ -787,3 +787,30 @@ func TestWaitForCondition(t *testing.T) { }) } } + +func TestWaitForDeletionIgnoreNotFound(t *testing.T) { + scheme := runtime.NewScheme() + infos := []*resource.Info{ + { + Mapping: &meta.RESTMapping{ + Resource: schema.GroupVersionResource{Group: "group", Version: "version", Resource: "theresource"}, + }, + Name: "name-foo", + Namespace: "ns-foo", + }, + } + fakeClient := dynamicfakeclient.NewSimpleDynamicClient(scheme) + + o := &WaitOptions{ + ResourceFinder: genericclioptions.NewSimpleFakeResourceFinder(infos...), + DynamicClient: fakeClient, + Printer: printers.NewDiscardingPrinter(), + ConditionFn: IsDeleted, + IOStreams: genericclioptions.NewTestIOStreamsDiscard(), + ForCondition: "delete", + } + err := o.RunWait() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } +}