// waitForNPods tries to list pods using c until it finds expect of them, // returning their names if it can do so before timeout. func waitForNPods(ps *testutils.PodStore, expect int, timeout time.Duration) ([]string, error) { // Loop until we find expect pods or timeout is passed. var pods []*api.Pod var errLast error found := wait.Poll(framework.Poll, timeout, func() (bool, error) { allPods := ps.List() pods := filterIrrelevantPods(allPods) if len(pods) != expect { errLast = fmt.Errorf("expected to find %d pods but found only %d", expect, len(pods)) framework.Logf("Error getting pods: %v", errLast) return false, nil } return true, nil }) == nil // Extract the names of all found pods. podNames := make([]string, len(pods)) for i, p := range pods { podNames[i] = p.ObjectMeta.Name } if !found { return podNames, fmt.Errorf("couldn't find %d pods within %v; last error: %v", expect, timeout, errLast) } return podNames, nil }
AfterEach(func() { if ps != nil { ps.Stop() } }) It("should restart all nodes and ensure all nodes and pods recover", func() { nn := framework.TestContext.CloudConfig.NumNodes By("ensuring all nodes are ready") nodeNamesBefore, err := framework.CheckNodesReady(f.Client, framework.NodeReadyInitialTimeout, nn) Expect(err).NotTo(HaveOccurred()) framework.Logf("Got the following nodes before restart: %v", nodeNamesBefore) By("ensuring all pods are running and ready") allPods := ps.List() pods := filterIrrelevantPods(allPods) podNamesBefore := make([]string, len(pods)) for i, p := range pods { podNamesBefore[i] = p.ObjectMeta.Name } ns := api.NamespaceSystem if !framework.CheckPodsRunningReadyOrSucceeded(f.Client, ns, podNamesBefore, framework.PodReadyBeforeTimeout) { framework.Failf("At least one pod wasn't running and ready or succeeded at test start.") } By("restarting all of the nodes") err = restartNodes(f, nodeNamesBefore) Expect(err).NotTo(HaveOccurred())