Skip to content

Commit 80a5be2

Browse files
author
Brendan Shephard
committed
Use generics for cleaning up all resources
Signed-off-by: Brendan Shephard <bshephar@fedora-g16.bne-home.net>
1 parent 7b22ba9 commit 80a5be2

File tree

1 file changed

+40
-61
lines changed

1 file changed

+40
-61
lines changed

internal/controller/operator/openstack_controller.go

Lines changed: 40 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"github.com/openstack-k8s-operators/openstack-operator/internal/operator"
4444
"github.com/openstack-k8s-operators/openstack-operator/internal/operator/bindata"
4545
"github.com/pkg/errors"
46+
admissionv1 "k8s.io/api/admissionregistration/v1"
4647
appsv1 "k8s.io/api/apps/v1"
4748
corev1 "k8s.io/api/core/v1"
4849
discoveryv1 "k8s.io/api/discovery/v1"
@@ -349,85 +350,63 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
349350

350351
}
351352

352-
func (r *OpenStackReconciler) deleteAllOwnedResources(ctx context.Context, instance *operatorv1beta1.OpenStack) error {
353-
Log := r.GetLogger(ctx)
354-
Log.Info("Deleting all owned resources for release version upgrade")
353+
func deleteOwnedResources[L any, T any](
354+
ctx context.Context,
355+
r *OpenStackReconciler,
356+
instance client.Object,
357+
list L,
358+
itemsGetter func(L) []T,
359+
) error {
360+
log := r.GetLogger(ctx)
355361

356-
// Delete all owned deployments
357-
deployments := &appsv1.DeploymentList{}
358-
err := r.List(ctx, deployments, &client.ListOptions{Namespace: instance.Namespace})
362+
err := r.List(ctx, any(list).(client.ObjectList), &client.ListOptions{Namespace: instance.GetNamespace()})
359363
if err != nil {
360-
return errors.Wrap(err, "failed to list deployments")
364+
return errors.Wrap(err, "failed to list resources")
361365
}
362-
for _, deployment := range deployments.Items {
363-
if metav1.IsControlledBy(&deployment, instance) {
364-
Log.Info("Deleting deployment", "name", deployment.Name)
365-
err := r.Delete(ctx, &deployment)
366+
367+
for _, item := range itemsGetter(list) {
368+
obj := any(&item).(client.Object)
369+
if metav1.IsControlledBy(obj, instance) {
370+
log.Info("Deleting owned resource", "kind", obj.GetObjectKind().GroupVersionKind().Kind, "name", obj.GetName())
371+
err := r.Delete(ctx, obj)
366372
if err != nil && !apierrors.IsNotFound(err) {
367-
return errors.Wrapf(err, "failed to delete deployment %s", deployment.Name)
373+
return errors.Wrapf(err, "failed to delete %s", obj.GetName())
368374
}
369375
}
370376
}
377+
return nil
378+
}
379+
380+
func (r *OpenStackReconciler) deleteAllOwnedResources(ctx context.Context, instance *operatorv1beta1.OpenStack) error {
381+
Log := r.GetLogger(ctx)
382+
Log.Info("Deleting all owned resources for release version upgrade")
371383

372-
// Delete all owned service accounts
373-
serviceAccounts := &corev1.ServiceAccountList{}
374-
err = r.List(ctx, serviceAccounts, &client.ListOptions{Namespace: instance.Namespace})
384+
err := deleteOwnedResources(ctx, r, instance, &appsv1.DeploymentList{}, func(l *appsv1.DeploymentList) []appsv1.Deployment { return l.Items })
375385
if err != nil {
376-
return errors.Wrap(err, "failed to list service accounts")
377-
}
378-
for _, sa := range serviceAccounts.Items {
379-
if metav1.IsControlledBy(&sa, instance) {
380-
Log.Info("Deleting service account", "name", sa.Name)
381-
err := r.Delete(ctx, &sa)
382-
if err != nil && !apierrors.IsNotFound(err) {
383-
return errors.Wrapf(err, "failed to delete service account %s", sa.Name)
384-
}
385-
}
386+
return err
386387
}
387388

388-
// Delete all owned services
389-
services := &corev1.ServiceList{}
390-
err = r.List(ctx, services, &client.ListOptions{Namespace: instance.Namespace})
389+
err = deleteOwnedResources(ctx, r, instance, &corev1.ServiceAccountList{}, func(l *corev1.ServiceAccountList) []corev1.ServiceAccount { return l.Items })
391390
if err != nil {
392-
return errors.Wrap(err, "failed to list services")
393-
}
394-
for _, svc := range services.Items {
395-
if metav1.IsControlledBy(&svc, instance) {
396-
Log.Info("Deleting service", "name", svc.Name)
397-
err := r.Delete(ctx, &svc)
398-
if err != nil && !apierrors.IsNotFound(err) {
399-
return errors.Wrapf(err, "failed to delete service %s", svc.Name)
400-
}
401-
}
391+
return err
402392
}
403393

404-
// Delete webhooks (these are cluster-scoped and not owned, but managed by label)
405-
valWebhooks, err := r.Kclient.AdmissionregistrationV1().ValidatingWebhookConfigurations().List(ctx, metav1.ListOptions{
406-
LabelSelector: "openstack.openstack.org/managed=true",
407-
})
394+
err = deleteOwnedResources(ctx, r, instance, &corev1.ServiceList{}, func(l *corev1.ServiceList) []corev1.Service { return l.Items })
408395
if err != nil {
409-
return errors.Wrap(err, "failed listing validating webhook configurations")
410-
}
411-
for _, webhook := range valWebhooks.Items {
412-
Log.Info("Deleting validating webhook", "name", webhook.Name)
413-
err := r.Kclient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Delete(ctx, webhook.Name, metav1.DeleteOptions{})
414-
if err != nil && !apierrors.IsNotFound(err) {
415-
return errors.Wrapf(err, "failed to delete validating webhook %s", webhook.Name)
416-
}
396+
return err
417397
}
418398

419-
mutWebhooks, err := r.Kclient.AdmissionregistrationV1().MutatingWebhookConfigurations().List(ctx, metav1.ListOptions{
420-
LabelSelector: "openstack.openstack.org/managed=true",
399+
labelSelector, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{
400+
MatchLabels: map[string]string{"openstack.openstack.org/managed": "true"},
421401
})
422-
if err != nil {
423-
return errors.Wrap(err, "failed listing mutating webhook configurations")
402+
403+
deleteOpts := client.DeleteAllOfOptions{
404+
ListOptions: client.ListOptions{LabelSelector: labelSelector},
424405
}
425-
for _, webhook := range mutWebhooks.Items {
426-
Log.Info("Deleting mutating webhook", "name", webhook.Name)
427-
err := r.Kclient.AdmissionregistrationV1().MutatingWebhookConfigurations().Delete(ctx, webhook.Name, metav1.DeleteOptions{})
428-
if err != nil && !apierrors.IsNotFound(err) {
429-
return errors.Wrapf(err, "failed to delete mutating webhook %s", webhook.Name)
430-
}
406+
407+
err = r.Client.DeleteAllOf(ctx, &admissionv1.ValidatingWebhookConfiguration{}, &deleteOpts)
408+
if err != nil && !apierrors.IsNotFound(err) {
409+
return errors.Wrap(err, "failed to delete validating webhooks")
431410
}
432411

433412
Log.Info("All owned resources deleted successfully")
@@ -1105,7 +1084,7 @@ func (r *OpenStackReconciler) postCleanupObsoleteResources(ctx context.Context,
11051084
// The horizon-operator.openstack-operators has references to old roles/bindings
11061085
// the code below will delete those references before continuing
11071086
for _, ref := range refs {
1108-
refData := ref.(map[string]interface{})
1087+
refData := ref.(map[string]any)
11091088
Log.Info("Deleting operator reference", "Reference", ref)
11101089
obj := uns.Unstructured{}
11111090
obj.SetName(refData["name"].(string))

0 commit comments

Comments
 (0)