in pkg/controllers/workgenerator/controller.go [1305:1383]
func extractFailedResourcePlacementsFromWork(work *fleetv1beta1.Work) []fleetv1beta1.FailedResourcePlacement {
appliedCond := meta.FindStatusCondition(work.Status.Conditions, fleetv1beta1.WorkConditionTypeApplied)
availableCond := meta.FindStatusCondition(work.Status.Conditions, fleetv1beta1.WorkConditionTypeAvailable)
// The applied condition and available condition are always updated in one call.
// It means the observedGeneration of these two are always the same.
// If IsConditionStatusFalse is true, means both are observing the latest work.
if !condition.IsConditionStatusFalse(appliedCond, work.Generation) &&
!condition.IsConditionStatusFalse(availableCond, work.Generation) {
return nil
}
// check if the work is generated by an enveloped object
envelopeType, isEnveloped := work.GetLabels()[fleetv1beta1.EnvelopeTypeLabel]
var envelopObjName, envelopObjNamespace string
if isEnveloped {
// If the work generated by an enveloped object, it must contain those labels.
envelopObjName = work.GetLabels()[fleetv1beta1.EnvelopeNameLabel]
envelopObjNamespace = work.GetLabels()[fleetv1beta1.EnvelopeNamespaceLabel]
}
res := make([]fleetv1beta1.FailedResourcePlacement, 0, len(work.Status.ManifestConditions))
for _, manifestCondition := range work.Status.ManifestConditions {
failedManifest := fleetv1beta1.FailedResourcePlacement{
ResourceIdentifier: fleetv1beta1.ResourceIdentifier{
Group: manifestCondition.Identifier.Group,
Version: manifestCondition.Identifier.Version,
Kind: manifestCondition.Identifier.Kind,
Name: manifestCondition.Identifier.Name,
Namespace: manifestCondition.Identifier.Namespace,
},
}
if isEnveloped {
failedManifest.ResourceIdentifier.Envelope = &fleetv1beta1.EnvelopeIdentifier{
Name: envelopObjName,
Namespace: envelopObjNamespace,
Type: fleetv1beta1.EnvelopeType(envelopeType),
}
}
appliedCond = meta.FindStatusCondition(manifestCondition.Conditions, fleetv1beta1.WorkConditionTypeApplied)
// collect if there is an explicit fail
// The observedGeneration of the manifest condition is the generation of the applied manifest.
// The overall applied and available conditions are observing the latest work generation.
// So that the manifest condition should be latest, assuming they're populated by the work agent in one update call.
if appliedCond != nil && appliedCond.Status == metav1.ConditionFalse {
if isEnveloped {
klog.V(2).InfoS("Find a failed to apply enveloped manifest",
"manifestName", manifestCondition.Identifier.Name,
"group", manifestCondition.Identifier.Group,
"version", manifestCondition.Identifier.Version, "kind", manifestCondition.Identifier.Kind,
"envelopeType", envelopeType, "envelopObjName", envelopObjName, "envelopObjNamespace", envelopObjNamespace)
} else {
klog.V(2).InfoS("Find a failed to apply manifest",
"manifestName", manifestCondition.Identifier.Name, "group", manifestCondition.Identifier.Group,
"version", manifestCondition.Identifier.Version, "kind", manifestCondition.Identifier.Kind)
}
failedManifest.Condition = *appliedCond
res = append(res, failedManifest)
continue //jump to the next manifest
}
availableCond = meta.FindStatusCondition(manifestCondition.Conditions, fleetv1beta1.WorkConditionTypeAvailable)
if availableCond != nil && availableCond.Status == metav1.ConditionFalse {
if isEnveloped {
klog.V(2).InfoS("Find an unavailable enveloped manifest",
"manifestName", manifestCondition.Identifier.Name,
"group", manifestCondition.Identifier.Group,
"version", manifestCondition.Identifier.Version, "kind", manifestCondition.Identifier.Kind,
"envelopeType", envelopeType, "envelopObjName", envelopObjName, "envelopObjNamespace", envelopObjNamespace)
} else {
klog.V(2).InfoS("Find an unavailable manifest",
"manifestName", manifestCondition.Identifier.Name, "group", manifestCondition.Identifier.Group,
"version", manifestCondition.Identifier.Version, "kind", manifestCondition.Identifier.Kind)
}
failedManifest.Condition = *availableCond
res = append(res, failedManifest)
}
}
return res
}