PodCondition

pod PodCondition 源码

IsPodReady() 方法

如果 pod ready 则返回 true

// IsPodReady returns true if a pod is ready; false otherwise.
func IsPodReady(pod *api.Pod) bool {
	return IsPodReadyConditionTrue(pod.Status)
}

IsPodReadyConditionTrue() 方法

IsPodReadyConditionTrue 检查 pod 的 PodStatus, 如果为 ConditionTrue 则返回 true:

// IsPodReadyConditionTrue returns true if a pod is ready; false otherwise.
func IsPodReadyConditionTrue(status api.PodStatus) bool {
	condition := GetPodReadyCondition(status)
	return condition != nil && condition.Status == api.ConditionTrue
}

GetPodReadyCondition() 方法

GetPodReadyCondition() 方法 从给定状态中提取 pod 就绪条件并返回。如果条件不存在,则返回 nil。

// GetPodReadyCondition extracts the pod ready condition from the given status and returns that.
// Returns nil if the condition is not present.
func GetPodReadyCondition(status api.PodStatus) *api.PodCondition {
	_, condition := GetPodCondition(&status, api.PodReady)
	return condition
}

GetPodCondition() 方法

GetPodCondition() 方法从给定的状态中提取所提供的 condition 并返回。

如果 condition 不存在,则返回 nil 和-1,

如果 condition 存在,则返回所定位 condition 的索引。

// GetPodCondition extracts the provided condition from the given status and returns that.
// Returns nil and -1 if the condition is not present, and the index of the located condition.
func GetPodCondition(status *api.PodStatus, conditionType api.PodConditionType) (int, *api.PodCondition) {
	if status == nil {
		// 如果 pod 的 status 为空
		return -1, nil
	}
	// 游历 status.Conditions
	for i := range status.Conditions {
		// 如果等于指定的 conditionType
		if status.Conditions[i].Type == conditionType {
			// 返回 index 和 对应 conditionType 的 condition
			// 这里只会找到的第一个符合 conditionType 要求的 condition
			return i, &status.Conditions[i]
		}
	}
	return -1, nil
}

UpdatePodCondition() 方法

UpdatePodCondition 更新现有 pod condition 或创建新的 pod condition。

如果状态已更改,则将 LastTransitionTime 设置为 now。

如果 pod condition 已更改或已添加,则返回 true。

// UpdatePodCondition updates existing pod condition or creates a new one. Sets LastTransitionTime to now if the
// status has changed.
// Returns true if pod condition has changed or has been added.
func UpdatePodCondition(status *api.PodStatus, condition *api.PodCondition) bool {
	// 设置 LastTransitionTime 为当前时间
	condition.LastTransitionTime = metav1.Now()
	// Try to find this pod condition.
	conditionIndex, oldCondition := GetPodCondition(status, condition.Type)

	//如果没有找到,说明之前没有设置这个类型的 condition
	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 的 status 和 oldCondition 的 status 相同,则将 LastTransitionTime 设置为 oldCondition 的 LastTransitionTime
		condition.LastTransitionTime = oldCondition.LastTransitionTime
	}

	// 检查传入的 condition 和现有的 conditon 是否完全等同
	isEqual := condition.Status == oldCondition.Status &&
		condition.Reason == oldCondition.Reason &&
		condition.Message == oldCondition.Message &&
		condition.LastProbeTime.Equal(&oldCondition.LastProbeTime) &&	
		condition.LastTransitionTime.Equal(&oldCondition.LastTransitionTime)

	// 更新 condition
	status.Conditions[conditionIndex] = *condition
	// Return true if one of the fields have changed.
	return !isEqual
}