internal/podutil/podconditions.go (40 lines of code) (raw):

package podutil import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func UpdatePodCondition(status *v1.PodStatus, condition *v1.PodCondition) bool { condition.LastTransitionTime = metav1.Now() // Try to find this pod condition. conditionIndex, oldCondition := getPodCondition(status, condition.Type) if oldCondition == nil { // We are adding new pod condition. status.Conditions = append(status.Conditions, *condition) return true } // We are updating an existing condition, so we need to check if it has changed. if condition.Status == oldCondition.Status { condition.LastTransitionTime = oldCondition.LastTransitionTime } isEqual := condition.Status == oldCondition.Status && condition.Reason == oldCondition.Reason && condition.Message == oldCondition.Message && condition.LastProbeTime.Equal(&oldCondition.LastProbeTime) && condition.LastTransitionTime.Equal(&oldCondition.LastTransitionTime) status.Conditions[conditionIndex] = *condition // Return true if one of the fields have changed. return !isEqual } func getPodCondition(status *v1.PodStatus, conditionType v1.PodConditionType) (int, *v1.PodCondition) { if status == nil { return -1, nil } return getPodConditionFromList(status.Conditions, conditionType) } // GetPodConditionFromList extracts the provided condition from the given list of condition and // returns the index of the condition and the condition. Returns -1 and nil if the condition is not present. func getPodConditionFromList(conditions []v1.PodCondition, conditionType v1.PodConditionType) (int, *v1.PodCondition) { if conditions == nil { return -1, nil } for i := range conditions { if conditions[i].Type == conditionType { return i, &conditions[i] } } return -1, nil }