in pkg/controllers/clusterresourceplacement/placement_status.go [311:397]
func (r *Reconciler) setResourcePlacementStatusPerCluster(
crp *fleetv1beta1.ClusterResourcePlacement,
latestResourceSnapshot *fleetv1beta1.ClusterResourceSnapshot,
binding *fleetv1beta1.ClusterResourceBinding,
status *fleetv1beta1.ResourcePlacementStatus,
expectedCondTypes []condition.ResourceCondition,
) map[condition.ResourceCondition]metav1.ConditionStatus {
res := make(map[condition.ResourceCondition]metav1.ConditionStatus)
if binding == nil {
// The binding cannot be found; Fleet might be observing an in-between state where
// the cluster has been picked but the binding has not been created yet.
meta.SetStatusCondition(&status.Conditions, condition.RolloutStartedCondition.UnknownResourceConditionPerCluster(crp.Generation))
res[condition.RolloutStartedCondition] = metav1.ConditionUnknown
return res
}
rolloutStartedCond := binding.GetCondition(string(condition.RolloutStartedCondition.ResourceBindingConditionType()))
switch {
case binding.Spec.ResourceSnapshotName != latestResourceSnapshot.Name && condition.IsConditionStatusFalse(rolloutStartedCond, binding.Generation):
// The binding uses an out of date resource snapshot and rollout controller has reported
// that the rollout is being blocked (the RolloutStarted condition is of the False status).
cond := metav1.Condition{
Type: string(condition.RolloutStartedCondition.ResourcePlacementConditionType()),
Status: metav1.ConditionFalse,
ObservedGeneration: crp.Generation,
Reason: condition.RolloutNotStartedYetReason,
Message: "The rollout is being blocked by the rollout strategy",
}
meta.SetStatusCondition(&status.Conditions, cond)
res[condition.RolloutStartedCondition] = metav1.ConditionFalse
return res
case binding.Spec.ResourceSnapshotName != latestResourceSnapshot.Name:
// The binding uses an out of date resource snapshot, and the RolloutStarted condition is
// set to True, Unknown, or has become stale. Fleet might be observing an in-between state.
meta.SetStatusCondition(&status.Conditions, condition.RolloutStartedCondition.UnknownResourceConditionPerCluster(crp.Generation))
klog.V(5).InfoS("The cluster resource binding has a stale RolloutStarted condition, or it links to an out of date resource snapshot yet has the RolloutStarted condition set to True or Unknown status", "clusterResourceBinding", klog.KObj(binding), "clusterResourcePlacement", klog.KObj(crp))
res[condition.RolloutStartedCondition] = metav1.ConditionUnknown
return res
default:
// The binding uses the latest resource snapshot.
for _, i := range expectedCondTypes {
bindingCond := binding.GetCondition(string(i.ResourceBindingConditionType()))
if !condition.IsConditionStatusTrue(bindingCond, binding.Generation) &&
!condition.IsConditionStatusFalse(bindingCond, binding.Generation) {
meta.SetStatusCondition(&status.Conditions, i.UnknownResourceConditionPerCluster(crp.Generation))
klog.V(5).InfoS("Find an unknown condition", "bindingCond", bindingCond, "clusterResourceBinding", klog.KObj(binding), "clusterResourcePlacement", klog.KObj(crp))
res[i] = metav1.ConditionUnknown
break
}
switch i {
case condition.RolloutStartedCondition:
if bindingCond.Status == metav1.ConditionTrue {
status.ApplicableResourceOverrides = binding.Spec.ResourceOverrideSnapshots
status.ApplicableClusterResourceOverrides = binding.Spec.ClusterResourceOverrideSnapshots
}
case condition.AppliedCondition, condition.AvailableCondition:
if bindingCond.Status == metav1.ConditionFalse {
status.FailedPlacements = binding.Status.FailedPlacements
status.DiffedPlacements = binding.Status.DiffedPlacements
}
// Note that configuration drifts can occur whether the manifests are applied
// successfully or not.
status.DriftedPlacements = binding.Status.DriftedPlacements
case condition.DiffReportedCondition:
if bindingCond.Status == metav1.ConditionTrue {
status.DiffedPlacements = binding.Status.DiffedPlacements
}
}
cond := metav1.Condition{
Type: string(i.ResourcePlacementConditionType()),
Status: bindingCond.Status,
ObservedGeneration: crp.Generation,
Reason: bindingCond.Reason,
Message: bindingCond.Message,
}
meta.SetStatusCondition(&status.Conditions, cond)
res[i] = bindingCond.Status
if bindingCond.Status == metav1.ConditionFalse {
break // if the current condition is false, no need to populate the rest conditions
}
}
return res
}
}