func waitForNodeReady() { const ( // nodeReadyTimeout is the time to wait for node to become ready. nodeReadyTimeout = 2 * time.Minute // nodeReadyPollInterval is the interval to check node ready. nodeReadyPollInterval = 1 * time.Second ) client, err := getAPIServerClient() Expect(err).NotTo(HaveOccurred(), "should be able to get apiserver client.") Eventually(func() error { node, err := getNode(client) if err != nil { return fmt.Errorf("failed to get node: %v", err) } if !v1.IsNodeReady(node) { return fmt.Errorf("node is not ready: %+v", node) } return nil }, nodeReadyTimeout, nodeReadyPollInterval).Should(Succeed()) }
func CreateClientAndWaitForAPI(adminConfig *clientcmdapi.Config) (*clientset.Clientset, error) { adminClientConfig, err := clientcmd.NewDefaultClientConfig( *adminConfig, &clientcmd.ConfigOverrides{}, ).ClientConfig() if err != nil { return nil, fmt.Errorf("failed to create API client configuration [%v]", err) } client, err := clientset.NewForConfig(adminClientConfig) if err != nil { return nil, fmt.Errorf("failed to create API client [%v]", err) } fmt.Println("[apiclient] Created API client, waiting for the control plane to become ready") start := time.Now() wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { cs, err := client.ComponentStatuses().List(v1.ListOptions{}) if err != nil { return false, nil } // TODO(phase2) must revisit this when we implement HA if len(cs.Items) < 3 { fmt.Println("[apiclient] Not all control plane components are ready yet") return false, nil } for _, item := range cs.Items { for _, condition := range item.Conditions { if condition.Type != v1.ComponentHealthy { fmt.Printf("[apiclient] Control plane component %q is still unhealthy: %#v\n", item.ObjectMeta.Name, item.Conditions) return false, nil } } } fmt.Printf("[apiclient] All control plane components are healthy after %f seconds\n", time.Since(start).Seconds()) return true, nil }) fmt.Println("[apiclient] Waiting for at least one node to register and become ready") start = time.Now() wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { nodeList, err := client.Nodes().List(v1.ListOptions{}) if err != nil { fmt.Println("[apiclient] Temporarily unable to list nodes (will retry)") return false, nil } if len(nodeList.Items) < 1 { return false, nil } n := &nodeList.Items[0] if !v1.IsNodeReady(n) { fmt.Println("[apiclient] First node has registered, but is not ready yet") return false, nil } fmt.Printf("[apiclient] First node is ready after %f seconds\n", time.Since(start).Seconds()) return true, nil }) createDummyDeployment(client) return client, nil }
func CreateClientAndWaitForAPI(file string) (*clientset.Clientset, error) { client, err := CreateClientFromFile(file) if err != nil { return nil, err } fmt.Println("[apiclient] Created API client, waiting for the control plane to become ready") start := time.Now() wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { // TODO: use /healthz API instead of this cs, err := client.ComponentStatuses().List(v1.ListOptions{}) if err != nil { if apierrs.IsForbidden(err) { fmt.Print("\r[apiclient] Waiting for the API server to create RBAC policies") } return false, nil } fmt.Println("\n[apiclient] RBAC policies created") // TODO(phase2) must revisit this when we implement HA if len(cs.Items) < 3 { fmt.Println("[apiclient] Not all control plane components are ready yet") return false, nil } for _, item := range cs.Items { for _, condition := range item.Conditions { if condition.Type != v1.ComponentHealthy { fmt.Printf("[apiclient] Control plane component %q is still unhealthy: %#v\n", item.ObjectMeta.Name, item.Conditions) return false, nil } } } fmt.Printf("[apiclient] All control plane components are healthy after %f seconds\n", time.Since(start).Seconds()) return true, nil }) fmt.Println("[apiclient] Waiting for at least one node to register and become ready") start = time.Now() wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { nodeList, err := client.Nodes().List(v1.ListOptions{}) if err != nil { fmt.Println("[apiclient] Temporarily unable to list nodes (will retry)") return false, nil } if len(nodeList.Items) < 1 { return false, nil } n := &nodeList.Items[0] if !v1.IsNodeReady(n) { fmt.Println("[apiclient] First node has registered, but is not ready yet") return false, nil } fmt.Printf("[apiclient] First node is ready after %f seconds\n", time.Since(start).Seconds()) return true, nil }) createDummyDeployment(client) return client, nil }