// testHostIP tests that a pod gets a host IP func testHostIP(podClient *framework.PodClient, pod *api.Pod) { By("creating pod") defer podClient.Delete(pod.Name, api.NewDeleteOptions(0)) podClient.CreateSync(pod) // Try to make sure we get a hostIP for each pod. hostIPTimeout := 2 * time.Minute t := time.Now() for { p, err := podClient.Get(pod.Name) Expect(err).NotTo(HaveOccurred()) if p.Status.HostIP != "" { framework.Logf("Pod %s has hostIP: %s", p.Name, p.Status.HostIP) break } if time.Since(t) >= hostIPTimeout { framework.Failf("Gave up waiting for hostIP of pod %s after %v seconds", p.Name, time.Since(t).Seconds()) } framework.Logf("Retrying to get the hostIP of pod %s", p.Name) time.Sleep(5 * time.Second) } }
framework.Failf("Failed to observe pod creation: %v", event) } case <-time.After(framework.PodStartTimeout): Fail("Timeout while waiting for pod creation") } // We need to wait for the pod to be running, otherwise the deletion // may be carried out immediately rather than gracefully. framework.ExpectNoError(f.WaitForPodRunning(pod.Name)) // save the running pod pod, err = podClient.Get(pod.Name, metav1.GetOptions{}) Expect(err).NotTo(HaveOccurred(), "failed to GET scheduled pod") framework.Logf("running pod: %#v", pod) By("deleting the pod gracefully") err = podClient.Delete(pod.Name, v1.NewDeleteOptions(30)) Expect(err).NotTo(HaveOccurred(), "failed to delete pod") By("verifying the kubelet observed the termination notice") Expect(wait.Poll(time.Second*5, time.Second*30, func() (bool, error) { podList, err := framework.GetKubeletPods(f.ClientSet, pod.Spec.NodeName) if err != nil { framework.Logf("Unable to retrieve kubelet pods for node %v: %v", pod.Spec.NodeName, err) return false, nil } for _, kubeletPod := range podList.Items { if pod.Name != kubeletPod.Name { continue } if kubeletPod.ObjectMeta.DeletionTimestamp == nil { framework.Logf("deletion has not yet been observed")
if len(podData.Status.ContainerStatuses) != 1 { return fmt.Errorf("expected only one container in the pod %q", podName) } contTerminatedState := podData.Status.ContainerStatuses[0].State.Terminated if contTerminatedState == nil { return fmt.Errorf("expected state to be terminated. Got pod status: %+v", podData.Status) } if contTerminatedState.Reason != "Error" { return fmt.Errorf("expected terminated state reason to be error. Got %+v", contTerminatedState) } return nil }, time.Minute, time.Second*4).Should(BeNil()) }) It("should be possible to delete", func() { err := podClient.Delete(podName, &v1.DeleteOptions{}) Expect(err).To(BeNil(), fmt.Sprintf("Error deleting Pod %v", err)) }) }) Context("when scheduling a read only busybox container", func() { podName := "busybox-readonly-fs" + string(uuid.NewUUID()) It("it should not write to root filesystem [Conformance]", func() { isReadOnly := true podClient.CreateSync(&v1.Pod{ ObjectMeta: v1.ObjectMeta{ Name: podName, }, Spec: v1.PodSpec{ // Don't restart the Pod since it is expected to exit RestartPolicy: v1.RestartPolicyNever, Containers: []v1.Container{
f := framework.NewDefaultFramework("kubelet-eviction-manager") var podClient *framework.PodClient var c *client.Client BeforeEach(func() { podClient = f.PodClient() c = f.Client }) Describe("hard eviction test", func() { Context("pod using the most disk space gets evicted when the node disk usage is above the eviction hard threshold", func() { var busyPodName, idlePodName, verifyPodName string var containersToCleanUp map[string]bool AfterEach(func() { podClient.Delete(busyPodName, &api.DeleteOptions{}) podClient.Delete(idlePodName, &api.DeleteOptions{}) podClient.Delete(verifyPodName, &api.DeleteOptions{}) for container := range containersToCleanUp { // TODO: to be container implementation agnostic cmd := exec.Command("docker", "rm", "-f", strings.Trim(container, dockertools.DockerPrefix)) cmd.Run() } }) BeforeEach(func() { if !isImageSupported() || !evictionOptionIsSet() { return } busyPodName = "to-evict" + string(uuid.NewUUID())
f.TestContainerOutput("downward API volume plugin", pod, 0, []string{ fmt.Sprintf("%s\n", podName), }) }) It("should update labels on modification [Conformance]", func() { labels := map[string]string{} labels["key1"] = "value1" labels["key2"] = "value2" podName := "labelsupdate" + string(uuid.NewUUID()) pod := downwardAPIVolumePodForUpdateTest(podName, labels, map[string]string{}, "/etc/labels") containerName := "client-container" defer func() { By("Deleting the pod") podClient.Delete(pod.Name, api.NewDeleteOptions(0)) }() By("Creating the pod") podClient.CreateSync(pod) Eventually(func() (string, error) { return framework.GetPodLogs(f.Client, f.Namespace.Name, podName, containerName) }, podLogTimeout, framework.Poll).Should(ContainSubstring("key1=\"value1\"\n")) //modify labels podClient.Update(podName, func(pod *api.Pod) { pod.Labels["key3"] = "value3" }) Eventually(func() (string, error) {
options := api.ListOptions{LabelSelector: selector} pods, err := podClient.List(options) Expect(err).NotTo(HaveOccurred(), "failed to query for pods") Expect(len(pods.Items)).To(Equal(0)) options = api.ListOptions{ LabelSelector: selector, ResourceVersion: pods.ListMeta.ResourceVersion, } w, err := podClient.Watch(options) Expect(err).NotTo(HaveOccurred(), "failed to set up watch") By("submitting the pod to kubernetes") // We call defer here in case there is a problem with // the test so we can ensure that we clean up after // ourselves defer podClient.Delete(pod.Name, api.NewDeleteOptions(0)) podClient.Create(pod) By("verifying the pod is in kubernetes") selector = labels.SelectorFromSet(labels.Set(map[string]string{"time": value})) options = api.ListOptions{LabelSelector: selector} pods, err = podClient.List(options) Expect(err).NotTo(HaveOccurred(), "failed to query for pods") Expect(len(pods.Items)).To(Equal(1)) By("verifying pod creation was observed") select { case event, _ := <-w.ResultChan(): if event.Type != watch.Added { framework.Failf("Failed to observe pod creation: %v", event) }
{ Name: "init2", Image: "gcr.io/google_containers/busybox:1.24", Command: []string{"/bin/true"}, }, }, Containers: []api.Container{ { Name: "run1", Image: "gcr.io/google_containers/busybox:1.24", Command: []string{"/bin/true"}, }, }, }, } defer podClient.Delete(pod.Name, nil) startedPod := podClient.Create(pod) w, err := podClient.Watch(api.SingleObject(startedPod.ObjectMeta)) Expect(err).NotTo(HaveOccurred(), "error watching a pod") wr := watch.NewRecorder(w) event, err := watch.Until(framework.PodStartTimeout, wr, client.PodCompleted) Expect(err).To(BeNil()) framework.CheckInvariants(wr.Events(), framework.ContainerInitInvariant) endPod := event.Object.(*api.Pod) Expect(endPod.Status.Phase).To(Equal(api.PodSucceeded)) _, init := api.GetPodCondition(&endPod.Status, api.PodInitialized) Expect(init).NotTo(BeNil()) Expect(init.Status).To(Equal(api.ConditionTrue)) Expect(len(endPod.Status.InitContainerStatuses)).To(Equal(2))