in clusterloader2/pkg/measurement/util/pods.go [96:145]
func ComputePodsStartupStatus(pods []*corev1.Pod, expected int, isPodUpdated func(*corev1.Pod) error) PodsStartupStatus {
startupStatus := PodsStartupStatus{
Expected: expected,
}
for _, p := range pods {
if p.DeletionTimestamp != nil {
startupStatus.Terminating++
continue
}
startupStatus.Created++
if p.Status.Phase == corev1.PodRunning {
ready := false
for _, c := range p.Status.Conditions {
if c.Type == corev1.PodReady && c.Status == corev1.ConditionTrue {
ready = true
break
}
}
if ready {
// Only count a pod is running when it is also ready.
startupStatus.Running++
if isPodUpdated == nil {
startupStatus.RunningUpdated++
} else {
if err := isPodUpdated(p); err != nil {
startupStatus.LastIsPodUpdatedError = err
} else {
startupStatus.RunningUpdated++
}
}
} else {
startupStatus.RunningButNotReady++
}
} else if p.Status.Phase == corev1.PodPending {
if p.Spec.NodeName == "" {
startupStatus.Waiting++
} else {
startupStatus.Pending++
}
} else if p.Status.Phase == corev1.PodSucceeded || p.Status.Phase == corev1.PodFailed {
startupStatus.Inactive++
} else if p.Status.Phase == corev1.PodUnknown {
startupStatus.Unknown++
}
if p.Spec.NodeName != "" {
startupStatus.Scheduled++
}
}
return startupStatus
}