Merge pull request #21598 from janetkuo/log-available-pods

Log pods of RS when deployment e2e test fails
This commit is contained in:
Brian Grant 2016-02-19 19:18:48 -08:00
commit 9a12c0a5ea
2 changed files with 39 additions and 18 deletions

View File

@ -179,7 +179,7 @@ func GetReplicaCountForReplicaSets(replicaSets []*extensions.ReplicaSet) int {
// Returns the number of available pods corresponding to the given replica sets. // Returns the number of available pods corresponding to the given replica sets.
func GetAvailablePodsForReplicaSets(c clientset.Interface, rss []*extensions.ReplicaSet, minReadySeconds int) (int, error) { 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 { if err != nil {
return 0, err return 0, err
} }
@ -189,28 +189,32 @@ func GetAvailablePodsForReplicaSets(c clientset.Interface, rss []*extensions.Rep
func getReadyPodsCount(pods []api.Pod, minReadySeconds int) int { func getReadyPodsCount(pods []api.Pod, minReadySeconds int) int {
readyPodCount := 0 readyPodCount := 0
for _, pod := range pods { for _, pod := range pods {
if api.IsPodReady(&pod) { if IsPodAvailable(&pod, minReadySeconds) {
// 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++ readyPodCount++
break
}
}
}
} }
} }
return 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{} allPods := []api.Pod{}
for _, rs := range replicaSets { for _, rs := range replicaSets {
selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector)

View File

@ -2124,10 +2124,12 @@ func waitForDeploymentStatus(c clientset.Interface, ns, deploymentName string, d
} }
if totalCreated > maxCreated { if totalCreated > maxCreated {
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS) logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
return false, fmt.Errorf("total pods created: %d, more than the max allowed: %d", totalCreated, maxCreated) return false, fmt.Errorf("total pods created: %d, more than the max allowed: %d", totalCreated, maxCreated)
} }
if totalAvailable < minAvailable { if totalAvailable < minAvailable {
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS) logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
return false, fmt.Errorf("total pods available: %d, less than the min required: %d", totalAvailable, minAvailable) 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. // Verify replica sets.
if deploymentutil.GetReplicaCountForReplicaSets(oldRSs) != 0 { if deploymentutil.GetReplicaCountForReplicaSets(oldRSs) != 0 {
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS) logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
return false, fmt.Errorf("old replica sets are not fully scaled down") return false, fmt.Errorf("old replica sets are not fully scaled down")
} }
if deploymentutil.GetReplicaCountForReplicaSets([]*extensions.ReplicaSet{newRS}) != desiredUpdatedReplicas { if deploymentutil.GetReplicaCountForReplicaSets([]*extensions.ReplicaSet{newRS}) != desiredUpdatedReplicas {
logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS) logReplicaSetsOfDeployment(deploymentName, oldRSs, newRS)
logPodsOfReplicaSets(c, allRSs, minReadySeconds)
return false, fmt.Errorf("new replica sets is not fully scaled up") return false, fmt.Errorf("new replica sets is not fully scaled up")
} }
return true, nil return true, nil
@ -2170,6 +2174,19 @@ func logReplicaSetsOfDeployment(deploymentName string, oldRSs []*extensions.Repl
Logf("New ReplicaSet of deployment %s: %+v", deploymentName, newRS) 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. // 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 { func waitForEvents(c *client.Client, ns string, objOrRef runtime.Object, desiredEventsCount int) error {
return wait.Poll(poll, 5*time.Minute, func() (bool, error) { return wait.Poll(poll, 5*time.Minute, func() (bool, error) {