func()

in pkg/controller/common/cleaner.go [125:181]


func (c *cleaner) CleanType(ctx context.Context, t cleanType) error {
	l := labels.Set(t.labels)
	selector, err := l.AsValidatedSelector()
	if err != nil {
		return fmt.Errorf("validating label selector: %w", err)
	}

	listOpt := metav1.ListOptions{
		LabelSelector: selector.String(),
	}

	c.logger.Info("cleaning type", "type", t.gvr.String(), "selector", selector.String())

	dclient := c.dynamic.Resource(t.gvr)
	err = dclient.DeleteCollection(ctx, metav1.DeleteOptions{}, listOpt)
	if err == nil {
		return nil
	}
	if !k8serrors.IsMethodNotSupported(err) {
		return fmt.Errorf("deleting collection %s", t.gvr.String())
	}

	// delete collection is not supported for some types.
	// instead we list then delete one by one
	list, err := dclient.List(ctx, listOpt)
	if err != nil {
		return fmt.Errorf("listing %s", t.gvr.String())
	}

	if err := list.EachListItem(func(obj runtime.Object) error {
		isNamespaced, err := isNamespaced(c.clientset, t.gvr)
		if err != nil {
			return fmt.Errorf("checking if namespaced: %w", err)
		}

		o, err := meta.Accessor(obj)
		if err != nil {
			return fmt.Errorf("accessing object metadata: %w", err)
		}

		var nsClient dynamic.ResourceInterface = dclient
		if isNamespaced {
			nsClient = dclient.Namespace(o.GetNamespace())
		}

		err = nsClient.Delete(ctx, o.GetName(), metav1.DeleteOptions{})
		if err != nil && !k8serrors.IsNotFound(err) {
			return fmt.Errorf("deleting object %s in %s: %w", o.GetName(), o.GetNamespace(), err)
		}

		return nil
	}); err != nil {
		return fmt.Errorf("deleting each object: %w", err)
	}

	return nil
}