Files
2026-05-07 14:39:58 +00:00

74 lines
2.9 KiB
Go

package addonconfiguration
import (
"context"
"fmt"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
addonv1beta1 "open-cluster-management.io/api/addon/v1beta1"
"open-cluster-management.io/sdk-go/pkg/patcher"
)
type cmaProgressingReconciler struct {
patcher patcher.Patcher[
*addonv1beta1.ClusterManagementAddOn, addonv1beta1.ClusterManagementAddOnSpec, addonv1beta1.ClusterManagementAddOnStatus]
}
func (d *cmaProgressingReconciler) reconcile(
ctx context.Context, cma *addonv1beta1.ClusterManagementAddOn, graph *configurationGraph) (*addonv1beta1.ClusterManagementAddOn, reconcileState, error) {
var errs []error
cmaCopy := cma.DeepCopy()
placementNodes := graph.getPlacementNodes()
// go through addons and update condition per install progression
for i, installProgression := range cmaCopy.Status.InstallProgressions {
placementNode, exist := placementNodes[installProgression.PlacementRef]
if !exist {
continue
}
setAddOnInstallProgressionsAndLastApplied(&cmaCopy.Status.InstallProgressions[i],
placementNode.countAddonUpgrading(),
placementNode.countAddonUpgradeSucceed(),
placementNode.countAddonUpgradeFailed(),
placementNode.countAddonTimeOut(),
len(placementNode.clusters),
len(placementNode.configuredClusters),
)
}
_, err := d.patcher.PatchStatus(ctx, cmaCopy, cmaCopy.Status, cma.Status)
if err != nil {
errs = append(errs, err)
}
return cmaCopy, reconcileContinue, utilerrors.NewAggregate(errs)
}
func setAddOnInstallProgressionsAndLastApplied(
installProgression *addonv1beta1.InstallProgression,
progressing, done, failed, timeout, total, configuredTotal int) {
condition := metav1.Condition{
Type: addonv1beta1.ManagedClusterAddOnConditionProgressing,
}
// If we treat 0/0 as completed, it could trigger a rollout to the next group
// before the configurations are actually applied.
if (configuredTotal == 0 && done == 0) || (done != configuredTotal) {
condition.Status = metav1.ConditionTrue
condition.Reason = addonv1beta1.ProgressingReasonProgressing
condition.Message = fmt.Sprintf("selected clusters %d. configured addons %d/%d progressing..., %d failed %d timeout.", total, progressing+done, configuredTotal, failed, timeout)
} else {
for i, configRef := range installProgression.ConfigReferences {
installProgression.ConfigReferences[i].LastAppliedConfig = configRef.DesiredConfig.DeepCopy()
installProgression.ConfigReferences[i].LastKnownGoodConfig = configRef.DesiredConfig.DeepCopy()
}
condition.Status = metav1.ConditionFalse
condition.Reason = addonv1beta1.ProgressingReasonCompleted
condition.Message = fmt.Sprintf("selected clusters %d. configured addons %d/%d completed with no errors, %d failed %d timeout.", total, done, configuredTotal, failed, timeout)
}
meta.SetStatusCondition(&installProgression.Conditions, condition)
}