From 0a8577fced28499f319acd4df7e18d550468c49a Mon Sep 17 00:00:00 2001 From: jayunit100 Date: Thu, 14 May 2015 15:06:29 +0000 Subject: [PATCH] Test for hostPath which can eventually be refactored to also test emptyDir. Add namespace support and remove requirement that host mount has to be type tmpfs --- test/e2e/host_path.go | 141 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 test/e2e/host_path.go diff --git a/test/e2e/host_path.go b/test/e2e/host_path.go new file mode 100644 index 00000000000..898761dfa89 --- /dev/null +++ b/test/e2e/host_path.go @@ -0,0 +1,141 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e + +import ( + "fmt" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" + "github.com/GoogleCloudPlatform/kubernetes/pkg/client" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" + "os" + "path" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +//TODO : Consolodate this code with the code for emptyDir. +//This will require some smart. +var _ = Describe("hostDir", func() { + var ( + c *client.Client + namespace *api.Namespace + ) + + BeforeEach(func() { + var err error + c, err = loadClient() + Expect(err).NotTo(HaveOccurred()) + + By("Building a namespace api object") + namespace, err = createTestingNS("hostdir", c) + Expect(err).NotTo(HaveOccurred()) + + //cleanup before running the test. + _ = os.Remove("/tmp/test-file") + }) + + AfterEach(func() { + By(fmt.Sprintf("Destroying namespace for this suite %v", namespace.Name)) + if err := c.Namespaces().Delete(namespace.Name); err != nil { + Failf("Couldn't delete ns %s", err) + } + }) + + It("MOD volume on tmpfs should have the correct mode", func() { + volumePath := "/test-volume" + source := &api.HostPathVolumeSource{ + Path: "/tmp", + } + pod := testPodWithHostVol(volumePath, source) + + pod.Spec.Containers[0].Args = []string{ + fmt.Sprintf("--fs_type=%v", volumePath), + fmt.Sprintf("--file_mode=%v", volumePath), + } + testContainerOutputInNamespace("emptydir r/w on tmpfs", c, pod, []string{ + "mode of file \"/test-volume\": dtrwxrwxrwx", // we expect the sticky bit (mode flag t) to be set for the dir + }, + namespace.Name) + }) + + It("should support r/w on tmpfs", func() { + volumePath := "/test-volume" + filePath := path.Join(volumePath, "test-file") + source := &api.HostPathVolumeSource{ + Path: "/tmp", + } + pod := testPodWithHostVol(volumePath, source) + + pod.Spec.Containers[0].Args = []string{ + fmt.Sprintf("--fs_type=%v", volumePath), + fmt.Sprintf("--rw_new_file=%v", filePath), + fmt.Sprintf("--file_mode=%v", filePath), + } + testContainerOutputInNamespace("emptydir r/w on tmpfs", c, pod, []string{ + "mode of file \"/test-volume/test-file\": -rw-r--r--", + "content of file \"/test-volume/test-file\": mount-tester new file", + }, namespace.Name, + ) + }) +}) + +//These constants are borrowed from the other test. +//const containerName = "test-container" +//const volumeName = "test-volume" + +func mount(source *api.HostPathVolumeSource) []api.Volume { + return []api.Volume{ + { + Name: volumeName, + VolumeSource: api.VolumeSource{ + HostPath: source, + }, + }, + } +} + +//TODO: To merge this with the emptyDir tests, we can make source a lambda. +func testPodWithHostVol(path string, source *api.HostPathVolumeSource) *api.Pod { + podName := "pod-" + string(util.NewUUID()) + + return &api.Pod{ + TypeMeta: api.TypeMeta{ + Kind: "Pod", + APIVersion: latest.Version, + }, + ObjectMeta: api.ObjectMeta{ + Name: podName, + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: containerName, + Image: "kubernetes/mounttest:0.1", + VolumeMounts: []api.VolumeMount{ + { + Name: volumeName, + MountPath: path, + }, + }, + }, + }, + Volumes: mount(source), + }, + } +}