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  }