github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/client/allocdir/task_dir_test.go (about) 1 package allocdir 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 9 cstructs "github.com/hashicorp/nomad/client/structs" 10 "github.com/hashicorp/nomad/helper/testlog" 11 ) 12 13 // Test that building a chroot will skip nonexistent directories. 14 func TestTaskDir_EmbedNonexistent(t *testing.T) { 15 tmp, err := ioutil.TempDir("", "AllocDir") 16 if err != nil { 17 t.Fatalf("Couldn't create temp dir: %v", err) 18 } 19 defer os.RemoveAll(tmp) 20 21 d := NewAllocDir(testlog.Logger(t), tmp) 22 defer d.Destroy() 23 td := d.NewTaskDir(t1.Name) 24 if err := d.Build(); err != nil { 25 t.Fatalf("Build() failed: %v", err) 26 } 27 28 fakeDir := "/foobarbaz" 29 mapping := map[string]string{fakeDir: fakeDir} 30 if err := td.embedDirs(mapping); err != nil { 31 t.Fatalf("embedDirs(%v) should should skip %v since it does not exist", mapping, fakeDir) 32 } 33 } 34 35 // Test that building a chroot copies files from the host into the task dir. 36 func TestTaskDir_EmbedDirs(t *testing.T) { 37 tmp, err := ioutil.TempDir("", "AllocDir") 38 if err != nil { 39 t.Fatalf("Couldn't create temp dir: %v", err) 40 } 41 defer os.RemoveAll(tmp) 42 43 d := NewAllocDir(testlog.Logger(t), tmp) 44 defer d.Destroy() 45 td := d.NewTaskDir(t1.Name) 46 if err := d.Build(); err != nil { 47 t.Fatalf("Build() failed: %v", err) 48 } 49 50 // Create a fake host directory, with a file, and a subfolder that contains 51 // a file. 52 host, err := ioutil.TempDir("", "AllocDirHost") 53 if err != nil { 54 t.Fatalf("Couldn't create temp dir: %v", err) 55 } 56 defer os.RemoveAll(host) 57 58 subDirName := "subdir" 59 subDir := filepath.Join(host, subDirName) 60 if err := os.MkdirAll(subDir, 0777); err != nil { 61 t.Fatalf("Failed to make subdir %v: %v", subDir, err) 62 } 63 64 file := "foo" 65 subFile := "bar" 66 if err := ioutil.WriteFile(filepath.Join(host, file), []byte{'a'}, 0777); err != nil { 67 t.Fatalf("Couldn't create file in host dir %v: %v", host, err) 68 } 69 70 if err := ioutil.WriteFile(filepath.Join(subDir, subFile), []byte{'a'}, 0777); err != nil { 71 t.Fatalf("Couldn't create file in host subdir %v: %v", subDir, err) 72 } 73 74 // Create mapping from host dir to task dir. 75 taskDest := "bin/test/" 76 mapping := map[string]string{host: taskDest} 77 if err := td.embedDirs(mapping); err != nil { 78 t.Fatalf("embedDirs(%v) failed: %v", mapping, err) 79 } 80 81 exp := []string{filepath.Join(td.Dir, taskDest, file), filepath.Join(td.Dir, taskDest, subDirName, subFile)} 82 for _, f := range exp { 83 if _, err := os.Stat(f); os.IsNotExist(err) { 84 t.Fatalf("File %v not embedded: %v", f, err) 85 } 86 } 87 } 88 89 // Test that task dirs for image based isolation don't require root. 90 func TestTaskDir_NonRoot_Image(t *testing.T) { 91 if os.Geteuid() == 0 { 92 t.Skip("test should be run as non-root user") 93 } 94 tmp, err := ioutil.TempDir("", "AllocDir") 95 if err != nil { 96 t.Fatalf("Couldn't create temp dir: %v", err) 97 } 98 defer os.RemoveAll(tmp) 99 100 d := NewAllocDir(testlog.Logger(t), tmp) 101 defer d.Destroy() 102 td := d.NewTaskDir(t1.Name) 103 if err := d.Build(); err != nil { 104 t.Fatalf("Build() failed: %v", err) 105 } 106 107 if err := td.Build(false, nil, cstructs.FSIsolationImage); err != nil { 108 t.Fatalf("TaskDir.Build failed: %v", err) 109 } 110 } 111 112 // Test that task dirs with no isolation don't require root. 113 func TestTaskDir_NonRoot(t *testing.T) { 114 if os.Geteuid() == 0 { 115 t.Skip("test should be run as non-root user") 116 } 117 tmp, err := ioutil.TempDir("", "AllocDir") 118 if err != nil { 119 t.Fatalf("Couldn't create temp dir: %v", err) 120 } 121 defer os.RemoveAll(tmp) 122 123 d := NewAllocDir(testlog.Logger(t), tmp) 124 defer d.Destroy() 125 td := d.NewTaskDir(t1.Name) 126 if err := d.Build(); err != nil { 127 t.Fatalf("Build() failed: %v", err) 128 } 129 130 if err := td.Build(false, nil, cstructs.FSIsolationNone); err != nil { 131 t.Fatalf("TaskDir.Build failed: %v", err) 132 } 133 134 // ${TASK_DIR}/alloc should not exist! 135 if _, err = os.Stat(td.SharedTaskDir); !os.IsNotExist(err) { 136 t.Fatalf("Expected a NotExist error for shared alloc dir in task dir: %q", td.SharedTaskDir) 137 } 138 139 }