func validateDNSResults(f *framework.Framework, pod *api.Pod, fileNames []string) { By("submitting the pod to kubernetes") podClient := f.Client.Pods(f.Namespace.Name) defer func() { By("deleting the pod") defer GinkgoRecover() podClient.Delete(pod.Name, api.NewDeleteOptions(0)) }() if _, err := podClient.Create(pod); err != nil { framework.Failf("Failed to create %s pod: %v", pod.Name, err) } framework.ExpectNoError(f.WaitForPodRunning(pod.Name)) By("retrieving the pod") pod, err := podClient.Get(pod.Name) if err != nil { framework.Failf("Failed to get pod %s: %v", pod.Name, err) } // Try to find results for each expected name. By("looking for the results for each expected name from probiers") assertFilesExist(fileNames, "results", pod, f.Client) // TODO: probe from the host, too. framework.Logf("DNS probes using %s succeeded\n", pod.Name) }
func validateTargetedProbeOutput(f *framework.Framework, pod *v1.Pod, fileNames []string, value string) { By("submitting the pod to kubernetes") podClient := f.ClientSet.Core().Pods(f.Namespace.Name) defer func() { By("deleting the pod") defer GinkgoRecover() podClient.Delete(pod.Name, v1.NewDeleteOptions(0)) }() if _, err := podClient.Create(pod); err != nil { framework.Failf("Failed to create %s pod: %v", pod.Name, err) } framework.ExpectNoError(f.WaitForPodRunning(pod.Name)) By("retrieving the pod") pod, err := podClient.Get(pod.Name) if err != nil { framework.Failf("Failed to get pod %s: %v", pod.Name, err) } // Try to find the expected value for each expected name. By("looking for the results for each expected name from probers") assertFilesContain(fileNames, "results", pod, f.ClientSet, true, value) framework.Logf("DNS probes using %s succeeded\n", pod.Name) }
func validateDNSResults(f *e2e.Framework, pod *api.Pod, fileNames sets.String, expect int) { By("submitting the pod to kubernetes") podClient := f.Client.Pods(f.Namespace.Name) defer func() { By("deleting the pod") defer GinkgoRecover() podClient.Delete(pod.Name, api.NewDeleteOptions(0)) }() if _, err := podClient.Create(pod); err != nil { e2e.Failf("Failed to create %s pod: %v", pod.Name, err) } Expect(f.WaitForPodRunning(pod.Name)).To(BeNil()) Expect(wait.Poll(2*time.Second, 5*time.Minute, func() (bool, error) { pod, err := podClient.Get(pod.Name) if err != nil { return false, err } switch pod.Status.Phase { case api.PodSucceeded: return true, nil case api.PodFailed: return false, fmt.Errorf("pod failed") default: return false, nil } })).To(BeNil()) By("retrieving the pod logs") r, err := podClient.GetLogs(pod.Name, &api.PodLogOptions{Container: "querier"}).Stream() if err != nil { e2e.Failf("Failed to get pod logs %s: %v", pod.Name, err) } out, err := ioutil.ReadAll(r) if err != nil { e2e.Failf("Failed to read pod logs %s: %v", pod.Name, err) } // Try to find results for each expected name. By("looking for the results for each expected name from probiers") if err := assertLinesExist(fileNames, expect, bytes.NewBuffer(out)); err != nil { e2e.Logf("Got results from pod:\n%s", out) e2e.Failf("Unexpected results: %v", err) } e2e.Logf("DNS probes using %s succeeded\n", pod.Name) }
func runPodFromStruct(f *framework.Framework, pod *api.Pod) { By("submitting the pod to kubernetes") podClient := f.Client.Pods(f.Namespace.Name) pod, err := podClient.Create(pod) if err != nil { framework.Failf("Failed to create pod: %v", err) } framework.ExpectNoError(f.WaitForPodRunning(pod.Name)) By("verifying the pod is in kubernetes") pod, err = podClient.Get(pod.Name) if err != nil { framework.Failf("failed to get pod: %v", err) } }
func createPod(f *framework.Framework, podName string, containers []api.Container, volumes []api.Volume) { podClient := f.Client.Pods(f.Namespace.Name) pod := &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: podName, }, Spec: api.PodSpec{ // Force the Pod to schedule to the node without a scheduler running NodeName: *nodeName, // Don't restart the Pod since it is expected to exit RestartPolicy: api.RestartPolicyNever, Containers: containers, Volumes: volumes, }, } _, err := podClient.Create(pod) Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err)) framework.ExpectNoError(f.WaitForPodRunning(pod.Name)) }
func testPodSELinuxLabeling(f *framework.Framework, hostIPC bool, hostPID bool) { // Write and read a file with an empty_dir volume // with a pod with the MCS label s0:c0,c1 pod := scTestPod(hostIPC, hostPID) volumeName := "test-volume" mountPath := "/mounted_volume" pod.Spec.Containers[0].VolumeMounts = []api.VolumeMount{ { Name: volumeName, MountPath: mountPath, }, } pod.Spec.Volumes = []api.Volume{ { Name: volumeName, VolumeSource: api.VolumeSource{ EmptyDir: &api.EmptyDirVolumeSource{ Medium: api.StorageMediumDefault, }, }, }, } pod.Spec.SecurityContext.SELinuxOptions = &api.SELinuxOptions{ Level: "s0:c0,c1", } pod.Spec.Containers[0].Command = []string{"sleep", "6000"} client := f.ClientSet.Core().Pods(f.Namespace.Name) pod, err := client.Create(pod) framework.ExpectNoError(err, "Error creating pod %v", pod) framework.ExpectNoError(framework.WaitForPodRunningInNamespace(f.ClientSet, pod)) testContent := "hello" testFilePath := mountPath + "/TEST" err = f.WriteFileViaContainer(pod.Name, pod.Spec.Containers[0].Name, testFilePath, testContent) Expect(err).To(BeNil()) content, err := f.ReadFileViaContainer(pod.Name, pod.Spec.Containers[0].Name, testFilePath) Expect(err).To(BeNil()) Expect(content).To(ContainSubstring(testContent)) foundPod, err := f.ClientSet.Core().Pods(f.Namespace.Name).Get(pod.Name) Expect(err).NotTo(HaveOccurred()) // Confirm that the file can be accessed from a second // pod using host_path with the same MCS label volumeHostPath := fmt.Sprintf("%s/pods/%s/volumes/kubernetes.io~empty-dir/%s", framework.TestContext.KubeVolumeDir, foundPod.UID, volumeName) By(fmt.Sprintf("confirming a container with the same label can read the file under --volume-dir=%s", framework.TestContext.KubeVolumeDir)) pod = scTestPod(hostIPC, hostPID) pod.Spec.NodeName = foundPod.Spec.NodeName volumeMounts := []api.VolumeMount{ { Name: volumeName, MountPath: mountPath, }, } volumes := []api.Volume{ { Name: volumeName, VolumeSource: api.VolumeSource{ HostPath: &api.HostPathVolumeSource{ Path: volumeHostPath, }, }, }, } pod.Spec.Containers[0].VolumeMounts = volumeMounts pod.Spec.Volumes = volumes pod.Spec.Containers[0].Command = []string{"cat", testFilePath} pod.Spec.SecurityContext.SELinuxOptions = &api.SELinuxOptions{ Level: "s0:c0,c1", } f.TestContainerOutput("Pod with same MCS label reading test file", pod, 0, []string{testContent}) // Confirm that the same pod with a different MCS // label cannot access the volume pod = scTestPod(hostIPC, hostPID) pod.Spec.Volumes = volumes pod.Spec.Containers[0].VolumeMounts = volumeMounts pod.Spec.Containers[0].Command = []string{"sleep", "6000"} pod.Spec.SecurityContext.SELinuxOptions = &api.SELinuxOptions{ Level: "s0:c2,c3", } _, err = client.Create(pod) framework.ExpectNoError(err, "Error creating pod %v", pod) err = f.WaitForPodRunning(pod.Name) framework.ExpectNoError(err, "Error waiting for pod to run %v", pod) content, err = f.ReadFileViaContainer(pod.Name, "test-container", testFilePath) Expect(content).NotTo(ContainSubstring(testContent)) }
// A basic test to check the deployment of an image using // a replication controller. The image serves its hostname // which is checked for each replica. func ServeImageOrFail(f *framework.Framework, test string, image string) { name := "my-hostname-" + test + "-" + string(uuid.NewUUID()) replicas := int32(2) // Create a replication controller for a service // that serves its hostname. // The source for the Docker containter kubernetes/serve_hostname is // in contrib/for-demos/serve_hostname By(fmt.Sprintf("Creating replication controller %s", name)) controller, err := f.ClientSet.Core().ReplicationControllers(f.Namespace.Name).Create(&v1.ReplicationController{ ObjectMeta: v1.ObjectMeta{ Name: name, }, Spec: v1.ReplicationControllerSpec{ Replicas: func(i int32) *int32 { return &i }(replicas), Selector: map[string]string{ "name": name, }, Template: &v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"name": name}, }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: name, Image: image, Ports: []v1.ContainerPort{{ContainerPort: 9376}}, }, }, }, }, }, }) Expect(err).NotTo(HaveOccurred()) // Cleanup the replication controller when we are done. defer func() { // Resize the replication controller to zero to get rid of pods. if err := framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, controller.Name); err != nil { framework.Logf("Failed to cleanup replication controller %v: %v.", controller.Name, err) } }() // List the pods, making sure we observe all the replicas. label := labels.SelectorFromSet(labels.Set(map[string]string{"name": name})) pods, err := framework.PodsCreated(f.ClientSet, f.Namespace.Name, name, replicas) By("Ensuring each pod is running") // Wait for the pods to enter the running state. Waiting loops until the pods // are running so non-running pods cause a timeout for this test. for _, pod := range pods.Items { if pod.DeletionTimestamp != nil { continue } err = f.WaitForPodRunning(pod.Name) Expect(err).NotTo(HaveOccurred()) } // Verify that something is listening. By("Trying to dial each unique pod") retryTimeout := 2 * time.Minute retryInterval := 5 * time.Second err = wait.Poll(retryInterval, retryTimeout, framework.PodProxyResponseChecker(f.ClientSet, f.Namespace.Name, label, name, true, pods).CheckAllResponses) if err != nil { framework.Failf("Did not get expected responses within the timeout period of %.2f seconds.", retryTimeout.Seconds()) } }
func testNoWrappedVolumeRace(f *framework.Framework, volumes []v1.Volume, volumeMounts []v1.VolumeMount, podCount int32) { rcName := wrappedVolumeRaceRCNamePrefix + string(uuid.NewUUID()) nodeList := framework.GetReadySchedulableNodesOrDie(f.ClientSet) Expect(len(nodeList.Items)).To(BeNumerically(">", 0)) targetNode := nodeList.Items[0] By("Creating RC which spawns configmap-volume pods") affinity := &v1.Affinity{ NodeAffinity: &v1.NodeAffinity{ RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ NodeSelectorTerms: []v1.NodeSelectorTerm{ { MatchExpressions: []v1.NodeSelectorRequirement{ { Key: "kubernetes.io/hostname", Operator: v1.NodeSelectorOpIn, Values: []string{targetNode.Name}, }, }, }, }, }, }, } rc := &v1.ReplicationController{ ObjectMeta: v1.ObjectMeta{ Name: rcName, }, Spec: v1.ReplicationControllerSpec{ Replicas: &podCount, Selector: map[string]string{ "name": rcName, }, Template: &v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"name": rcName}, }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "test-container", Image: "gcr.io/google_containers/busybox:1.24", Command: []string{"sleep", "10000"}, Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ v1.ResourceCPU: resource.MustParse("10m"), }, }, VolumeMounts: volumeMounts, }, }, Affinity: affinity, DNSPolicy: v1.DNSDefault, Volumes: volumes, }, }, }, } _, err := f.ClientSet.Core().ReplicationControllers(f.Namespace.Name).Create(rc) Expect(err).NotTo(HaveOccurred(), "error creating replication controller") defer func() { err := framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, rcName) framework.ExpectNoError(err) }() pods, err := framework.PodsCreated(f.ClientSet, f.Namespace.Name, rcName, podCount) By("Ensuring each pod is running") // Wait for the pods to enter the running state. Waiting loops until the pods // are running so non-running pods cause a timeout for this test. for _, pod := range pods.Items { if pod.DeletionTimestamp != nil { continue } err = f.WaitForPodRunning(pod.Name) Expect(err).NotTo(HaveOccurred(), "Failed waiting for pod %s to enter running state", pod.Name) } }