Skip to content

Commit

Permalink
Added checking for Machines availability to update ManagedCluster status
Browse files Browse the repository at this point in the history
  • Loading branch information
Slava Lysunkin committed Oct 24, 2024
1 parent 59a0e13 commit 25ee1a3
Showing 1 changed file with 42 additions and 22 deletions.
64 changes: 42 additions & 22 deletions internal/controller/managedcluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ type ManagedClusterReconciler struct {
SystemNamespace string
}

type checkedObject struct {
gvr schema.GroupVersionResource
labelName string
}

// Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state.
func (r *ManagedClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
Expand Down Expand Up @@ -107,36 +112,30 @@ func (r *ManagedClusterReconciler) Reconcile(ctx context.Context, req ctrl.Reque
return r.Update(ctx, managedCluster)
}

func (r *ManagedClusterReconciler) setStatusFromClusterStatus(ctx context.Context, managedCluster *hmc.ManagedCluster) (requeue bool, _ error) {
func (r *ManagedClusterReconciler) setStatusFromChildObjects(ctx context.Context, managedCluster *hmc.ManagedCluster, resourceID schema.GroupVersionResource, labelName string) (requeue bool, _ error) {
l := ctrl.LoggerFrom(ctx)

resourceID := schema.GroupVersionResource{
Group: "cluster.x-k8s.io",
Version: "v1beta1",
Resource: "clusters",
}

list, err := r.DynamicClient.Resource(resourceID).Namespace(managedCluster.Namespace).List(ctx, metav1.ListOptions{
LabelSelector: labels.SelectorFromSet(map[string]string{hmc.FluxHelmChartNameKey: managedCluster.Name}).String(),
LabelSelector: labels.SelectorFromSet(map[string]string{labelName: managedCluster.Name}).String(),
})

if apierrors.IsNotFound(err) || len(list.Items) == 0 {
l.Info("Clusters not found, ignoring since object must be deleted or not yet created")
l.Info(fmt.Sprintf("%s not found, ignoring since object must be deleted or not yet created", resourceID.Resource))
return true, nil
}

if err != nil {
return true, fmt.Errorf("failed to get cluster information for managedCluster %s in namespace: %s: %w",
managedCluster.Namespace, managedCluster.Name, err)
return true, fmt.Errorf("failed to get %s information for managedCluster %s in namespace: %s: %w",
resourceID.Resource, managedCluster.Namespace, managedCluster.Name, err)
}
conditions, found, err := unstructured.NestedSlice(list.Items[0].Object, "status", "conditions")
if err != nil {
return true, fmt.Errorf("failed to get cluster information for managedCluster %s in namespace: %s: %w",
managedCluster.Namespace, managedCluster.Name, err)
return true, fmt.Errorf("failed to get %s information for managedCluster %s in namespace: %s: %w",
resourceID.Resource, managedCluster.Namespace, managedCluster.Name, err)
}
if !found {
return true, fmt.Errorf("failed to get cluster information for managedCluster %s in namespace: %s: status.conditions not found",
managedCluster.Namespace, managedCluster.Name)
return true, fmt.Errorf("failed to get %s information for managedCluster %s in namespace: %s: status.conditions not found",
resourceID.Resource, managedCluster.Namespace, managedCluster.Name)
}

allConditionsComplete := true
Expand Down Expand Up @@ -337,17 +336,38 @@ func (r *ManagedClusterReconciler) Update(ctx context.Context, managedCluster *h
})
}

requeue, err := r.setStatusFromClusterStatus(ctx, managedCluster)
if err != nil {
if requeue {
return ctrl.Result{RequeueAfter: DefaultRequeueInterval}, err
var (
gvrMachines = schema.GroupVersionResource{
Group: "cluster.x-k8s.io",
Version: "v1beta1",
Resource: "machines",
}

return ctrl.Result{}, err
gvrClusters = schema.GroupVersionResource{
Group: "cluster.x-k8s.io",
Version: "v1beta1",
Resource: "clusters",
}
)

childObjects := []checkedObject{
{gvr: gvrClusters, labelName: hmc.FluxHelmChartNameKey},
{gvr: gvrMachines, labelName: hmc.ClusterNameLabelKey},
}

if requeue {
return ctrl.Result{RequeueAfter: DefaultRequeueInterval}, nil
for _, obj := range childObjects {
requeue, err := r.setStatusFromChildObjects(ctx, managedCluster, obj.gvr, obj.labelName)
if err != nil {
if requeue {
return ctrl.Result{RequeueAfter: DefaultRequeueInterval}, err
}

return ctrl.Result{}, err
}

if requeue {
return ctrl.Result{RequeueAfter: DefaultRequeueInterval}, nil
}
}

if !fluxconditions.IsReady(hr) {
Expand Down

0 comments on commit 25ee1a3

Please sign in to comment.