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  })