helm/helm · warning
object not found, skipping delete: %w
Error message
object not found, skipping delete: %w
What it means
Client.Delete visits each resource and deletes it, treating NotFound as success. If perform reports ErrNoObjectsVisited ("no objects visited") — the resource list was empty or nothing was visitable — that sentinel is wrapped as "object not found, skipping delete" and returned among the errors. Deletion was skipped simply because there was nothing to delete.
Source
Thrown at pkg/kube/client.go:941
slog.String("namespace", target.Namespace),
slog.String("name", target.Name),
slog.String("kind", target.Mapping.GroupVersionKind.Kind),
slog.Any("error", err))
}
mtx.Lock()
defer mtx.Unlock()
res.Deleted = append(res.Deleted, target)
return nil
}
mtx.Lock()
defer mtx.Unlock()
// Collect the error and continue on
errs = append(errs, err)
return nil
})
if err != nil {
if errors.Is(err, ErrNoObjectsVisited) {
err = fmt.Errorf("object not found, skipping delete: %w", err)
}
errs = append(errs, err)
}
if errs != nil {
return nil, errs
}
return res, nil
}
// https://github.com/kubernetes/kubectl/blob/197123726db24c61aa0f78d1f0ba6e91a2ec2f35/pkg/cmd/apply/apply.go#L439
func isIncompatibleServerError(err error) bool {
// 415: Unsupported media type means we're talking to a server which doesn't
// support server-side apply.
var sErr *apierrors.StatusError
if !errors.As(err, &sErr) {
// Non-StatusError means the error isn't because the server is incompatible.
return false
}View on GitHub (pinned to 2a29f1770b)
Solutions
- If the resources are indeed gone, treat this as success — verify with kubectl that nothing remains, then continue cleanup
- If resources should still exist, find out why the list was empty (check the release storage / rendered manifests) before retrying
- Avoid double-deletion flows: guard uninstall automation against re-entry
Defensive patterns
Strategy: validation
Validate before calling
if len(resources) == 0 {
// nothing to delete: skip the call entirely
return &kube.Result{}, nil
}
res, errs := c.Delete(resources, metav1.DeletePropagationBackground) Try / catch
res, errs := c.Delete(resources, policy)
filtered := errs[:0]
for _, err := range errs {
if errors.Is(err, kube.ErrNoObjectsVisited) {
continue // nothing matched; treat as no-op success
}
filtered = append(filtered, err)
}
if len(filtered) > 0 {
return filtered
} Prevention
- Make uninstall flows idempotent: tolerate already-deleted resources and empty manifests
- Check release storage before constructing the delete list so double-uninstall cannot reach Delete
When it happens
Trigger: Uninstall/delete invoked with an empty or fully-filtered ResourceList: the release's resources were already deleted manually, the chart rendered to zero manifests, or the object list was constructed incorrectly upstream.
Common situations: Double uninstall (second run finds nothing); resources removed out-of-band before helm uninstall; SDK code passing a ResourceList built from an empty render.
Related errors
- failed to delete release: %s
- no objects visited
- unable to cleanup resources: %w
- the release named %q is already deleted
- unable to build kubernetes objects for delete: %w
AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15).
Data as JSON: /api/errors/a6921f6916b45019.
Report an issue: GitHub.