diff --git a/internal/controller/managedcluster_controller.go b/internal/controller/managedcluster_controller.go index c8d5840a5..dff885347 100644 --- a/internal/controller/managedcluster_controller.go +++ b/internal/controller/managedcluster_controller.go @@ -104,16 +104,13 @@ 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, -) (bool, error) { +func (r *ManagedClusterReconciler) setStatusFromChildObjects( + ctx context.Context, managedCluster *hmc.ManagedCluster, gvr schema.GroupVersionResource, condition string, +) (requeue bool, _ error) { l := ctrl.LoggerFrom(ctx) - resourceConditions, err := status.GetResourceConditions(ctx, managedCluster.Namespace, r.DynamicClient, schema.GroupVersionResource{ - Group: "cluster.x-k8s.io", - Version: "v1beta1", - Resource: "clusters", - }, labels.SelectorFromSet(map[string]string{hmc.FluxHelmChartNameKey: managedCluster.Name}).String()) + resourceConditions, err := status.GetResourceConditions(ctx, managedCluster.Namespace, r.DynamicClient, gvr, + labels.SelectorFromSet(map[string]string{hmc.FluxHelmChartNameKey: managedCluster.Name}).String()) if err != nil { notFoundErr := status.ResourceNotFoundError{} if errors.As(err, ¬FoundErr) { @@ -125,14 +122,18 @@ func (r *ManagedClusterReconciler) setStatusFromClusterStatus( allConditionsComplete := true for _, metaCondition := range resourceConditions.Conditions { - if metaCondition.Status != "True" { - allConditionsComplete = false - } + if condition == metaCondition.Type { + if metaCondition.Status != "True" { + metaCondition.Message = gvr.Resource + ": " + metaCondition.Message + allConditionsComplete = false + } - if metaCondition.Reason == "" && metaCondition.Status == "True" { - metaCondition.Reason = "Succeeded" + if metaCondition.Reason == "" && metaCondition.Status == "True" { + metaCondition.Message = gvr.Resource + " are Ready" + metaCondition.Reason = "Succeeded" + } + apimeta.SetStatusCondition(managedCluster.GetConditions(), metaCondition) } - apimeta.SetStatusCondition(managedCluster.GetConditions(), metaCondition) } return !allConditionsComplete, nil @@ -309,7 +310,7 @@ func (r *ManagedClusterReconciler) Update(ctx context.Context, managedCluster *h }) } - requeue, err := r.setStatusFromClusterStatus(ctx, managedCluster) + requeue, err := r.needToRequeue(ctx, managedCluster) if err != nil { if requeue { return ctrl.Result{RequeueAfter: DefaultRequeueInterval}, err @@ -337,6 +338,47 @@ func (r *ManagedClusterReconciler) Update(ctx context.Context, managedCluster *h return ctrl.Result{}, nil } +func (r *ManagedClusterReconciler) needToRequeue(ctx context.Context, managedCluster *hmc.ManagedCluster) (bool, error) { + type objectToCheck struct { + gvr schema.GroupVersionResource + condition string + } + + childObjects := []objectToCheck{ + { + gvr: schema.GroupVersionResource{ + Group: "cluster.x-k8s.io", + Version: "v1beta1", + Resource: "clusters", + }, + condition: "ControlPlaneInitialized", + }, + { + gvr: schema.GroupVersionResource{ + Group: "cluster.x-k8s.io", + Version: "v1beta1", + Resource: "machinedeployments", + }, + condition: "Available", + }, + } + + var requeue bool + var errs error + for _, obj := range childObjects { + r, err := r.setStatusFromChildObjects(ctx, managedCluster, obj.gvr, obj.condition) + if err != nil { + errs = errors.Join(errs, err) + } + + if r { + requeue = true + } + } + + return requeue, errs +} + // updateServices reconciles services provided in ManagedCluster.Spec.Services. // TODO(https://github.com/Mirantis/hmc/issues/361): Set status to ManagedCluster object at appropriate places. func (r *ManagedClusterReconciler) updateServices(ctx context.Context, mc *hmc.ManagedCluster) (ctrl.Result, error) { diff --git a/templates/provider/hmc/templates/rbac/controller/roles.yaml b/templates/provider/hmc/templates/rbac/controller/roles.yaml index 9334495ee..b4cfea475 100644 --- a/templates/provider/hmc/templates/rbac/controller/roles.yaml +++ b/templates/provider/hmc/templates/rbac/controller/roles.yaml @@ -20,6 +20,11 @@ rules: resources: - clusters verbs: {{ include "rbac.viewerVerbs" . | nindent 4 }} +- apiGroups: + - cluster.x-k8s.io + resources: + - machinedeployments + verbs: {{ include "rbac.viewerVerbs" . | nindent 4 }} - apiGroups: - helm.toolkit.fluxcd.io resources: