github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/containerizer/system/rootfs_linux_test.go (about) 1 package system_test 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "path" 9 "path/filepath" 10 "syscall" 11 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 "github.com/onsi/gomega/gbytes" 15 ) 16 17 var _ = Describe("RootfsLinux", func() { 18 var rootfsDir string 19 BeforeEach(func() { 20 rootfsDir = path.Join(tempDirPath, fmt.Sprintf("rootfs-%d", GinkgoParallelNode())) 21 if _, err := os.Stat(rootfsDir); os.IsNotExist(err) { 22 Expect(os.MkdirAll(rootfsDir, 0700)).To(Succeed()) 23 } 24 }) 25 26 AfterEach(func() { 27 entries, err := ioutil.ReadDir(rootfsDir) 28 Expect(err).NotTo(HaveOccurred()) 29 for _, entry := range entries { 30 Expect(os.RemoveAll(entry.Name())) 31 } 32 33 // Cleaning up this directoy causes the VM to hang occasionally. 34 // Expect(os.RemoveAll(rootfsDir)).To(Succeed()) 35 }) 36 37 It("pivots in to a given rootfs in a privileged container", func() { 38 Expect(ioutil.WriteFile(path.Join(rootfsDir, "potato"), []byte{}, 0755)).To(Succeed()) 39 40 stdout := gbytes.NewBuffer() 41 Expect(runInContainer(io.MultiWriter(stdout, GinkgoWriter), GinkgoWriter, true, "fake_container", rootfsDir)).To(Succeed()) 42 Expect(stdout).ToNot(gbytes.Say("home")) 43 Expect(stdout).To(gbytes.Say("potato")) 44 }) 45 46 It("pivots in to a given rootfs in an unprivileged container", func() { 47 Expect(ioutil.WriteFile(path.Join(rootfsDir, "potato"), []byte{}, 0755)).To(Succeed()) 48 49 stdout := gbytes.NewBuffer() 50 Expect(runInContainer(io.MultiWriter(stdout, GinkgoWriter), GinkgoWriter, false, "fake_container", rootfsDir)).To(Succeed()) 51 Expect(stdout).ToNot(gbytes.Say("home")) 52 Expect(stdout).To(gbytes.Say("potato")) 53 }) 54 55 Context("when the rootfs contains bind mounts", func() { 56 var ( 57 targetBindMountDir string 58 sourceBindMountDir string 59 ) 60 61 BeforeEach(func() { 62 var err error 63 64 targetBindMountDir = filepath.Join(rootfsDir, "a-bind-mount") 65 Expect(os.Mkdir(targetBindMountDir, 0755)).To(Succeed()) 66 67 sourceBindMountDir, err = ioutil.TempDir("", "bnds") 68 Expect(err).ToNot(HaveOccurred()) 69 70 Expect(syscall.Mount(sourceBindMountDir, targetBindMountDir, "", uintptr(syscall.MS_BIND), "")).To(Succeed()) 71 }) 72 73 AfterEach(func() { 74 Expect(syscall.Unmount(targetBindMountDir, 0)).To(Succeed()) 75 76 // Cleaning up this directories causes the VM to hang occasionally. 77 // Expect(os.RemoveAll(sourceBindMountDir)).To(Succeed()) 78 // Expect(os.RemoveAll(targetBindMountDir)).To(Succeed()) 79 }) 80 81 It("pivots in to the given rootfs", func() { 82 stdout := gbytes.NewBuffer() 83 out := io.MultiWriter(stdout, GinkgoWriter) 84 Expect(runInContainer(out, out, false, "fake_container", rootfsDir)).To(Succeed()) 85 Expect(stdout).ToNot(gbytes.Say("home")) 86 Expect(stdout).To(gbytes.Say("a-bind-mount")) 87 }) 88 }) 89 90 It("unmounts the old rootfs", func() { 91 stdout := gbytes.NewBuffer() 92 Expect(runInContainer(io.MultiWriter(stdout, GinkgoWriter), GinkgoWriter, false, "fake_container", rootfsDir)).To(Succeed()) 93 Expect(stdout).ToNot(gbytes.Say("oldroot")) 94 }) 95 96 It("returns an error when the rootfs does not exist", func() { 97 stderr := gbytes.NewBuffer() 98 err := runInContainer(GinkgoWriter, io.MultiWriter(stderr, GinkgoWriter), false, "fake_container", "does-not-exist-blah-blah") 99 Expect(err).To(HaveOccurred()) 100 Expect(stderr).To(gbytes.Say("ERROR: Failed to enter root fs: system: validate root file system: stat does-not-exist-blah-blah: no such file or directory")) 101 }) 102 103 It("returns an error when the rootfs is not a directory", func() { 104 tmpFile, err := ioutil.TempFile(os.TempDir(), "rootfs") 105 Expect(err).ToNot(HaveOccurred()) 106 tmpFile.Close() 107 defer os.Remove(tmpFile.Name()) 108 109 stderr := gbytes.NewBuffer() 110 err = runInContainer(GinkgoWriter, io.MultiWriter(stderr, GinkgoWriter), false, "fake_container", tmpFile.Name()) 111 Expect(err).To(HaveOccurred()) 112 Expect(stderr).To(gbytes.Say(fmt.Sprintf("ERROR: Failed to enter root fs: system: validate root file system: %s is not a directory", tmpFile.Name()))) 113 }) 114 })