github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/integration/device/fuse_test.go (about) 1 package device_test 2 3 import ( 4 "path/filepath" 5 6 . "github.com/onsi/ginkgo" 7 . "github.com/onsi/gomega" 8 9 "github.com/cloudfoundry-incubator/garden" 10 "github.com/onsi/gomega/gbytes" 11 ) 12 13 var _ = Describe("Fuse", func() { 14 var container garden.Container 15 var privilegedContainer bool 16 var user string 17 18 BeforeEach(func() { 19 privilegedContainer = true 20 user = "root" 21 }) 22 23 JustBeforeEach(func() { 24 client = startGarden() 25 26 var err error 27 container, err = client.Create(garden.ContainerSpec{ 28 RootFSPath: fuseRootFSPath, 29 Privileged: privilegedContainer, 30 }) 31 Expect(err).ToNot(HaveOccurred()) 32 }) 33 34 Describe("/dev/fuse", func() { 35 It("is a character special device file", func() { 36 process, err := container.Run(garden.ProcessSpec{ 37 User: user, 38 Path: "/usr/bin/test", 39 Args: []string{"-c", "/dev/fuse"}, 40 }, garden.ProcessIO{Stdout: GinkgoWriter, Stderr: GinkgoWriter}) 41 Expect(err).ToNot(HaveOccurred()) 42 43 Expect(process.Wait()).To(Equal(0), "/dev/fuse cannot be found or is not a character special device.") 44 }) 45 46 Context("in a privileged Container", func() { 47 BeforeEach(func() { 48 privilegedContainer = true 49 }) 50 51 Context("a privileged process", func() { 52 BeforeEach(func() { 53 user = "root" 54 }) 55 56 It("can mount a fuse filesystem", func() { 57 canCreateAndUseFuseFileSystem(container, user) 58 }) 59 }) 60 61 Context("a non-privileged process", func() { 62 BeforeEach(func() { 63 user = "alice" 64 }) 65 66 It("can mount a fuse filesystem", func() { 67 canCreateAndUseFuseFileSystem(container, user) 68 }) 69 }) 70 }) 71 }) 72 }) 73 74 func canCreateAndUseFuseFileSystem(container garden.Container, user string) { 75 mountpoint := "/tmp/fuse-test" 76 77 process, err := container.Run(garden.ProcessSpec{ 78 User: user, 79 Path: "mkdir", 80 Args: []string{"-p", mountpoint}, 81 }, garden.ProcessIO{Stdout: GinkgoWriter, Stderr: GinkgoWriter}) 82 Expect(err).ToNot(HaveOccurred()) 83 Expect(process.Wait()).To(Equal(0), "Could not make temporary directory!") 84 85 process, err = container.Run(garden.ProcessSpec{ 86 User: user, 87 Path: "/usr/bin/hellofs", 88 Args: []string{mountpoint}, 89 }, garden.ProcessIO{Stdout: GinkgoWriter, Stderr: GinkgoWriter}) 90 Expect(err).ToNot(HaveOccurred()) 91 Expect(process.Wait()).To(Equal(0), "Failed to mount hello filesystem.") 92 93 stdout := gbytes.NewBuffer() 94 process, err = container.Run(garden.ProcessSpec{ 95 User: user, 96 Path: "cat", 97 Args: []string{filepath.Join(mountpoint, "hello")}, 98 }, garden.ProcessIO{Stdout: stdout, Stderr: GinkgoWriter}) 99 Expect(err).ToNot(HaveOccurred()) 100 Expect(process.Wait()).To(Equal(0), "Failed to find hello file.") 101 Expect(stdout).To(gbytes.Say("Hello World!")) 102 103 process, err = container.Run(garden.ProcessSpec{ 104 User: user, 105 Path: "fusermount", 106 Args: []string{"-u", mountpoint}, 107 }, garden.ProcessIO{Stdout: GinkgoWriter, Stderr: GinkgoWriter}) 108 Expect(err).ToNot(HaveOccurred()) 109 Expect(process.Wait()).To(Equal(0), "Failed to unmount user filesystem.") 110 111 stdout2 := gbytes.NewBuffer() 112 process, err = container.Run(garden.ProcessSpec{ 113 User: user, 114 Path: "ls", 115 Args: []string{mountpoint}, 116 }, garden.ProcessIO{Stdout: stdout2, Stderr: GinkgoWriter}) 117 Expect(err).ToNot(HaveOccurred()) 118 Expect(process.Wait()).To(Equal(0)) 119 Expect(stdout2).ToNot(gbytes.Say("hello"), "Fuse filesystem appears still to be visible after being unmounted.") 120 }