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

  1. If the resources are indeed gone, treat this as success — verify with kubectl that nothing remains, then continue cleanup
  2. If resources should still exist, find out why the list was empty (check the release storage / rendered manifests) before retrying
  3. 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

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


AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15). Data as JSON: /api/errors/a6921f6916b45019. Report an issue: GitHub.