mirror of
https://github.com/open-cluster-management-io/ocm.git
synced 2026-08-23 22:26:49 +00:00
74 lines
2.9 KiB
Go
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)
|
|
}
|