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 assertFilesContain(fileNames []string, fileDir string, pod *api.Pod, client *client.Client, 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) if err != nil { return false, err } var contents []byte for _, fileName := range fileNames { if subResourceProxyAvailable { contents, err = client.Get(). Namespace(pod.Namespace). Resource("pods"). SubResource("proxy"). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } else { contents, err = client.Get(). Prefix("proxy"). Resource("pods"). Namespace(pod.Namespace). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } if err != nil { 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 assertFilesExist(fileNames []string, fileDir string, pod *api.Pod, client *client.Client) { 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) if err != nil { return false, err } for _, fileName := range fileNames { if subResourceProxyAvailable { _, err = client.Get(). Namespace(pod.Namespace). Resource("pods"). SubResource("proxy"). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } else { _, err = client.Get(). Prefix("proxy"). Resource("pods"). Namespace(pod.Namespace). Name(pod.Name). Suffix(fileDir, fileName). Do().Raw() } if err != nil { framework.Logf("Unable to read %s from pod %s: %v", fileName, pod.Name, err) 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)) }
fmt.Sprintf("--file_content=%s/%s", serviceaccount.DefaultAPITokenMountPath, api.ServiceAccountTokenKey), }, }, { Name: "root-ca-test", Image: "gcr.io/google_containers/mounttest:0.7", Args: []string{ fmt.Sprintf("--file_content=%s/%s", serviceaccount.DefaultAPITokenMountPath, api.ServiceAccountRootCAKey), }, }, }, RestartPolicy: api.RestartPolicyNever, }, } supportsTokenNamespace, _ := framework.ServerVersionGTE(serviceAccountTokenNamespaceVersion, f.Client) if supportsTokenNamespace { pod.Spec.Containers = append(pod.Spec.Containers, api.Container{ Name: "namespace-test", Image: "gcr.io/google_containers/mounttest:0.7", Args: []string{ fmt.Sprintf("--file_content=%s/%s", serviceaccount.DefaultAPITokenMountPath, api.ServiceAccountNamespaceKey), }, }) } f.TestContainerOutput("consume service account token", pod, 0, []string{ fmt.Sprintf(`content of file "%s/%s": %s`, serviceaccount.DefaultAPITokenMountPath, api.ServiceAccountTokenKey, tokenContent), }) f.TestContainerOutput("consume service account root CA", pod, 1, []string{ fmt.Sprintf(`content of file "%s/%s": %s`, serviceaccount.DefaultAPITokenMountPath, api.ServiceAccountRootCAKey, rootCAContent),
func testPreStop(c clientset.Interface, ns string) { // This is the server that will receive the preStop notification podDescr := &v1.Pod{ ObjectMeta: v1.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: v1.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 } var body []byte if subResourceProxyAvailable { body, err = c.Core().RESTClient().Get(). Namespace(ns). Resource("pods"). SubResource("proxy"). Name(podDescr.Name). Suffix("read"). DoRaw() } else { body, err = c.Core().RESTClient().Get(). Prefix("proxy"). Namespace(ns). Resource("pods"). Name(podDescr.Name). Suffix("read"). DoRaw() } if err != nil { 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.") }