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
}