diff --git a/capi-lab/mini-lab b/capi-lab/mini-lab index 72acbfb..d5509d1 160000 --- a/capi-lab/mini-lab +++ b/capi-lab/mini-lab @@ -1 +1 @@ -Subproject commit 72acbfbffce1866ea6ac8352f38506c5e2f95291 +Subproject commit d5509d17a84459e62ac3f4a0188671a212687a41 diff --git a/internal/controller/metalstackcluster_controller.go b/internal/controller/metalstackcluster_controller.go index c885902..90214d2 100644 --- a/internal/controller/metalstackcluster_controller.go +++ b/internal/controller/metalstackcluster_controller.go @@ -28,6 +28,7 @@ import ( ctrllog "sigs.k8s.io/controller-runtime/pkg/log" apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" @@ -179,6 +180,11 @@ func (r *clusterReconciler) delete() error { r.log.Info("reconciling resource deletion flow") + err = r.ensureAllMetalStackMachinesAreGone() + if err != nil { + return err + } + err = r.deleteControlPlaneIP() if err != nil { return fmt.Errorf("unable to delete control plane ip: %w", err) @@ -231,6 +237,25 @@ func (r *clusterReconciler) ensureControlPlaneIP() (string, error) { return *resp.Payload.Ipaddress, nil } +func (r *clusterReconciler) ensureAllMetalStackMachinesAreGone() error { + infraMachines := &v1alpha1.MetalStackMachineList{} + err := r.client.List(r.ctx, infraMachines, &client.ListOptions{ + Limit: 1, + Namespace: r.cluster.Namespace, + LabelSelector: labels.SelectorFromSet(labels.Set{ + clusterv1.ClusterNameLabel: r.cluster.Name, + }), + }) + if err != nil { + return fmt.Errorf("failed to fetch machines: %w", err) + } + + if len(infraMachines.Items) > 0 { + return errors.New("waiting for all infra machines to be gone") + } + return nil +} + func (r *clusterReconciler) deleteControlPlaneIP() error { if r.infraCluster.Spec.ControlPlaneIP == nil { return nil