mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 06:54:01 +00:00
Merge pull request #21598 from janetkuo/log-available-pods
Log pods of RS when deployment e2e test fails
This commit is contained in:
commit
9a12c0a5ea
@ -179,7 +179,7 @@ func GetReplicaCountForReplicaSets(replicaSets []*extensions.ReplicaSet) int {
|
||||
|
||||
// Returns the number of available pods corresponding to the given replica sets.
|
||||
func GetAvailablePodsForReplicaSets(c clientset.Interface, rss []*extensions.ReplicaSet, minReadySeconds int) (int, error) {
|
||||
allPods, err := getPodsForReplicaSets(c, rss)
|
||||
allPods, err := GetPodsForReplicaSets(c, rss)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@ -189,28 +189,32 @@ func GetAvailablePodsForReplicaSets(c clientset.Interface, rss []*extensions.Rep
|
||||
func getReadyPodsCount(pods []api.Pod, minReadySeconds int) int {
|
||||
readyPodCount := 0
|
||||
for _, pod := range pods {
|
||||
if api.IsPodReady(&pod) {
|
||||
// Check if we've passed minReadySeconds since LastTransitionTime
|
||||
// If so, this pod is ready
|
||||
for _, c := range pod.Status.Conditions {
|
||||
// we only care about pod ready conditions
|
||||
if c.Type == api.PodReady {
|
||||
// 2 cases that this ready condition is valid (passed minReadySeconds, i.e. the pod is ready):
|
||||
// 1. minReadySeconds <= 0
|
||||
// 2. LastTransitionTime (is set) + minReadySeconds (>0) < current time
|
||||
minReadySecondsDuration := time.Duration(minReadySeconds) * time.Second
|
||||
if minReadySeconds <= 0 || !c.LastTransitionTime.IsZero() && c.LastTransitionTime.Add(minReadySecondsDuration).Before(time.Now()) {
|
||||
readyPodCount++
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if IsPodAvailable(&pod, minReadySeconds) {
|
||||
readyPodCount++
|
||||
}
|
||||
}
|
||||
return readyPodCount
|
||||
}
|
||||
|
||||
func getPodsForReplicaSets(c clientset.Interface, replicaSets []*extensions.ReplicaSet) ([]api.Pod, error) {
|
||||
func IsPodAvailable(pod *api.Pod, minReadySeconds int) bool {
|
||||
// Check if we've passed minReadySeconds since LastTransitionTime
|
||||
// If so, this pod is ready
|
||||
for _, c := range pod.Status.Conditions {
|
||||
// we only care about pod ready conditions
|
||||
if c.Type == api.PodReady && c.Status == api.ConditionTrue {
|
||||
// 2 cases that this ready condition is valid (passed minReadySeconds, i.e. the pod is ready):
|
||||
// 1. minReadySeconds <= 0
|
||||
// 2. LastTransitionTime (is set) + minReadySeconds (>0) < current time
|
||||
minReadySecondsDuration := time.Duration(minReadySeconds) * time.Second
|
||||
if minReadySeconds <= 0 || !c.LastTransitionTime.IsZero() && c.LastTransitionTime.Add(minReadySecondsDuration).Before(time.Now()) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func GetPodsForReplicaSets(c clientset.Interface, replicaSets []*extensions.ReplicaSet) ([]api.Pod, error) {
|
||||
allPods := []api.Pod{}
|
||||
for _, rs := range replicaSets {
|
||||
selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector)
|
||||
|
@ -2124,10 +2124,12 @@ func waitForDeploymentStatus(c clientset.Interface, ns, deploymentName string, d
|
||||
}
|
||||
if totalCreated > maxCreated {
|
||||
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
|
||||
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
|
||||
return false, fmt.Errorf("total pods created: %d, more than the max allowed: %d", totalCreated, maxCreated)
|
||||
}
|
||||
if totalAvailable < minAvailable {
|
||||
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
|
||||
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
|
||||
return false, fmt.Errorf("total pods available: %d, less than the min required: %d", totalAvailable, minAvailable)
|
||||
}
|
||||
|
||||
@ -2136,10 +2138,12 @@ func waitForDeploymentStatus(c clientset.Interface, ns, deploymentName string, d
|
||||
// Verify replica sets.
|
||||
if deploymentutil.GetReplicaCountForReplicaSets(oldRSs) != 0 {
|
||||
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
|
||||
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
|
||||
return false, fmt.Errorf("old replica sets are not fully scaled down")
|
||||
}
|
||||
if deploymentutil.GetReplicaCountForReplicaSets([]*extensions.ReplicaSet{newRS}) != desiredUpdatedReplicas {
|
||||
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
|
||||
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
|
||||
return false, fmt.Errorf("new replica sets is not fully scaled up")
|
||||
}
|
||||
return true, nil
|
||||
@ -2170,6 +2174,19 @@ func logReplicaSetsOfDeployment(deploymentName string, oldRSs []*extensions.Repl
|
||||
Logf("New ReplicaSet of deployment %s: %+v", deploymentName, newRS)
|
||||
}
|
||||
|
||||
func logPodsOfReplicaSets(c clientset.Interface, rss []*extensions.ReplicaSet, minReadySeconds int) {
|
||||
allPods, err := deploymentutil.GetPodsForReplicaSets(c, rss)
|
||||
if err == nil {
|
||||
for _, pod := range allPods {
|
||||
availability := "not available"
|
||||
if deploymentutil.IsPodAvailable(&pod, minReadySeconds) {
|
||||
availability = "available"
|
||||
}
|
||||
Logf("Pod %s is %s: %+v", pod.Name, availability, pod)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Waits for the number of events on the given object to reach a desired count.
|
||||
func waitForEvents(c *client.Client, ns string, objOrRef runtime.Object, desiredEventsCount int) error {
|
||||
return wait.Poll(poll, 5*time.Minute, func() (bool, error) {
|
||||
|
Loading…
Reference in New Issue
Block a user