func checkMasterVersion(c clientset.Interface, want string) error { framework.Logf("Checking master version") v, err := c.Discovery().ServerVersion() if err != nil { return fmt.Errorf("checkMasterVersion() couldn't get the master version: %v", err) } // We do prefix trimming and then matching because: // want looks like: 0.19.3-815-g50e67d4 // got looks like: v0.19.3-815-g50e67d4034e858-dirty got := strings.TrimPrefix(v.GitVersion, "v") if !strings.HasPrefix(got, want) { return fmt.Errorf("master had kube-apiserver version %s which does not start with %s", got, want) } framework.Logf("Master is at version %s", want) return nil }
func assertFilesContain(fileNames []string, fileDir string, pod *v1.Pod, client clientset.Interface, check bool, expected string) { var failed []string framework.ExpectNoError(wait.Poll(time.Second*2, time.Second*60, func() (bool, error) { failed = []string{} subResourceProxyAvailable, err := framework.ServerVersionGTE(framework.SubResourcePodProxyVersion, client.Discovery()) if err != nil { return false, err } ctx, cancel := context.WithTimeout(context.Background(), framework.SingleCallTimeout) defer cancel() var contents []byte for _, fileName := range fileNames { if subResourceProxyAvailable { contents, err = client.Core().RESTClient().Get(). Context(ctx). Namespace(pod.Namespace). Resource("pods"). SubResource("proxy"). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } else { contents, err = client.Core().RESTClient().Get(). Context(ctx). Prefix("proxy"). Resource("pods"). Namespace(pod.Namespace). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } if err != nil { if ctx.Err() != nil { framework.Failf("Unable to read %s from pod %s: %v", fileName, pod.Name, err) } else { framework.Logf("Unable to read %s from pod %s: %v", fileName, pod.Name, err) } failed = append(failed, fileName) } else if check && strings.TrimSpace(string(contents)) != expected { framework.Logf("File %s from pod %s contains '%s' instead of '%s'", fileName, pod.Name, string(contents), expected) failed = append(failed, fileName) } } if len(failed) == 0 { return true, nil } framework.Logf("Lookups using %s failed for: %v\n", pod.Name, failed) return false, nil })) Expect(len(failed)).To(Equal(0)) }
func getNodeStatsSummary(c clientset.Interface, nodeName string) (*stats.Summary, error) { subResourceProxyAvailable, err := ServerVersionGTE(subResourceServiceAndNodeProxyVersion, c.Discovery()) if err != nil { return nil, err } var data []byte if subResourceProxyAvailable { data, err = c.Core().RESTClient().Get(). Resource("nodes"). SubResource("proxy"). Name(fmt.Sprintf("%v:%v", nodeName, ports.KubeletPort)). Suffix("stats/summary"). SetHeader("Content-Type", "application/json"). Do().Raw() } else { data, err = c.Core().RESTClient().Get(). Prefix("proxy"). Resource("nodes"). Name(fmt.Sprintf("%v:%v", nodeName, ports.KubeletPort)). Suffix("stats/summary"). SetHeader("Content-Type", "application/json"). Do().Raw() } if err != nil { return nil, err } var summary *stats.Summary err = json.Unmarshal(data, &summary) if err != nil { return nil, err } return summary, nil }
// getContainerInfo contacts kubelet for the container information. The "Stats" // in the returned ContainerInfo is subject to the requirements in statsRequest. // TODO: This function uses the deprecated kubelet stats API; it should be // removed. func getContainerInfo(c clientset.Interface, nodeName string, req *kubeletstats.StatsRequest) (map[string]cadvisorapi.ContainerInfo, error) { reqBody, err := json.Marshal(req) if err != nil { return nil, err } subResourceProxyAvailable, err := ServerVersionGTE(subResourceServiceAndNodeProxyVersion, c.Discovery()) if err != nil { return nil, err } var data []byte if subResourceProxyAvailable { data, err = c.Core().RESTClient().Post(). Resource("nodes"). SubResource("proxy"). Name(fmt.Sprintf("%v:%v", nodeName, ports.KubeletPort)). Suffix("stats/container"). SetHeader("Content-Type", "application/json"). Body(reqBody). Do().Raw() } else { data, err = c.Core().RESTClient().Post(). Prefix("proxy"). Resource("nodes"). Name(fmt.Sprintf("%v:%v", nodeName, ports.KubeletPort)). Suffix("stats/container"). SetHeader("Content-Type", "application/json"). Body(reqBody). Do().Raw() } if err != nil { return nil, err } var containers map[string]cadvisorapi.ContainerInfo err = json.Unmarshal(data, &containers) if err != nil { return nil, err } return containers, nil }
func testPreStop(c clientset.Interface, ns string) { // This is the server that will receive the preStop notification podDescr := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "server", }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "server", Image: "gcr.io/google_containers/nettest:1.7", Ports: []v1.ContainerPort{{ContainerPort: 8080}}, }, }, }, } By(fmt.Sprintf("Creating server pod %s in namespace %s", podDescr.Name, ns)) podDescr, err := c.Core().Pods(ns).Create(podDescr) framework.ExpectNoError(err, fmt.Sprintf("creating pod %s", podDescr.Name)) // At the end of the test, clean up by removing the pod. defer func() { By("Deleting the server pod") c.Core().Pods(ns).Delete(podDescr.Name, nil) }() By("Waiting for pods to come up.") err = framework.WaitForPodRunningInNamespace(c, podDescr) framework.ExpectNoError(err, "waiting for server pod to start") val := "{\"Source\": \"prestop\"}" podOut, err := c.Core().Pods(ns).Get(podDescr.Name, metav1.GetOptions{}) framework.ExpectNoError(err, "getting pod info") preStopDescr := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "tester", }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "tester", Image: "gcr.io/google_containers/busybox:1.24", Command: []string{"sleep", "600"}, Lifecycle: &v1.Lifecycle{ PreStop: &v1.Handler{ Exec: &v1.ExecAction{ Command: []string{ "wget", "-O-", "--post-data=" + val, fmt.Sprintf("http://%s:8080/write", podOut.Status.PodIP), }, }, }, }, }, }, }, } By(fmt.Sprintf("Creating tester pod %s in namespace %s", preStopDescr.Name, ns)) preStopDescr, err = c.Core().Pods(ns).Create(preStopDescr) framework.ExpectNoError(err, fmt.Sprintf("creating pod %s", preStopDescr.Name)) deletePreStop := true // At the end of the test, clean up by removing the pod. defer func() { if deletePreStop { By("Deleting the tester pod") c.Core().Pods(ns).Delete(preStopDescr.Name, nil) } }() err = framework.WaitForPodRunningInNamespace(c, preStopDescr) framework.ExpectNoError(err, "waiting for tester pod to start") // Delete the pod with the preStop handler. By("Deleting pre-stop pod") if err := c.Core().Pods(ns).Delete(preStopDescr.Name, nil); err == nil { deletePreStop = false } framework.ExpectNoError(err, fmt.Sprintf("deleting pod: %s", preStopDescr.Name)) // Validate that the server received the web poke. err = wait.Poll(time.Second*5, time.Second*60, func() (bool, error) { subResourceProxyAvailable, err := framework.ServerVersionGTE(framework.SubResourcePodProxyVersion, c.Discovery()) if err != nil { return false, err } ctx, cancel := context.WithTimeout(context.Background(), framework.SingleCallTimeout) defer cancel() var body []byte if subResourceProxyAvailable { body, err = c.Core().RESTClient().Get(). Context(ctx). Namespace(ns). Resource("pods"). SubResource("proxy"). Name(podDescr.Name). Suffix("read"). DoRaw() } else { body, err = c.Core().RESTClient().Get(). Context(ctx). Prefix("proxy"). Namespace(ns). Resource("pods"). Name(podDescr.Name). Suffix("read"). DoRaw() } if err != nil { if ctx.Err() != nil { framework.Failf("Error validating prestop: %v", err) return true, err } By(fmt.Sprintf("Error validating prestop: %v", err)) } else { framework.Logf("Saw: %s", string(body)) state := State{} err := json.Unmarshal(body, &state) if err != nil { framework.Logf("Error parsing: %v", err) return false, nil } if state.Received["prestop"] != 0 { return true, nil } } return false, nil }) framework.ExpectNoError(err, "validating pre-stop.") }