@@ -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