[ARVADOS] created: e03666a151bc6cd371d371ef36d787e462f4f51d

Git user git at public.curoverse.com
Thu Aug 4 02:27:57 EDT 2016


        at  e03666a151bc6cd371d371ef36d787e462f4f51d (commit)


commit e03666a151bc6cd371d371ef36d787e462f4f51d
Author: Tom Clegg <tom at curoverse.com>
Date:   Thu Aug 4 02:26:54 2016 -0400

    9595: Fix hardcoded temp dir in test. Add checks for CleanupDirs().

diff --git a/services/crunch-run/crunchrun_test.go b/services/crunch-run/crunchrun_test.go
index 36e83a4..644e9e9 100644
--- a/services/crunch-run/crunchrun_test.go
+++ b/services/crunch-run/crunchrun_test.go
@@ -16,6 +16,7 @@ import (
 	"io/ioutil"
 	"os"
 	"os/exec"
+	"path/filepath"
 	"sort"
 	"strings"
 	"sync"
@@ -753,59 +754,80 @@ func (s *TestSuite) TestSetupMounts(c *C) {
 	am := &ArvMountCmdLine{}
 	cr.RunArvMount = am.ArvMountTest
 
+	realTemp, err := ioutil.TempDir("", "crunchrun_test-")
+	c.Assert(err, IsNil)
+	defer os.RemoveAll(realTemp)
+
 	i := 0
-	cr.MkTempDir = func(string, string) (string, error) {
-		i += 1
-		d := fmt.Sprintf("/tmp/mktmpdir%d", i)
-		os.Mkdir(d, os.ModePerm)
-		return d, nil
+	cr.MkTempDir = func(_ string, prefix string) (string, error) {
+		i++
+		d := fmt.Sprintf("%s/%s%d", realTemp, prefix, i)
+		err := os.Mkdir(d, os.ModePerm)
+		if err != nil && strings.Contains(err.Error(), ": file exists") {
+			// Test case must have pre-populated the tempdir
+			err = nil
+		}
+		return d, err
+	}
+
+	checkEmpty := func() {
+		filepath.Walk(realTemp, func(path string, _ os.FileInfo, err error) error {
+			c.Check(path, Equals, realTemp)
+			c.Check(err, IsNil)
+			return nil
+		})
 	}
 
 	{
+		i = 0
 		cr.Container.Mounts = make(map[string]arvados.Mount)
 		cr.Container.Mounts["/tmp"] = arvados.Mount{Kind: "tmp"}
 		cr.OutputPath = "/tmp"
 
 		err := cr.SetupMounts()
 		c.Check(err, IsNil)
-		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-by-pdh", "by_id", "/tmp/mktmpdir1"})
-		c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir2:/tmp"})
+		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-by-pdh", "by_id", realTemp + "/keep1"})
+		c.Check(cr.Binds, DeepEquals, []string{realTemp + "/2:/tmp"})
 		cr.CleanupDirs()
+		checkEmpty()
 	}
 
 	{
 		i = 0
-		cr.Container.Mounts = make(map[string]arvados.Mount)
-		cr.Container.Mounts["/keeptmp"] = arvados.Mount{Kind: "collection", Writable: true}
+		cr.Container.Mounts = map[string]arvados.Mount{
+			"/keeptmp": {Kind: "collection", Writable: true},
+		}
 		cr.OutputPath = "/keeptmp"
 
-		os.MkdirAll("/tmp/mktmpdir1/tmp0", os.ModePerm)
+		os.MkdirAll(realTemp+"/keep1/tmp0", os.ModePerm)
 
 		err := cr.SetupMounts()
 		c.Check(err, IsNil)
-		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", "/tmp/mktmpdir1"})
-		c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir1/tmp0:/keeptmp"})
+		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", realTemp + "/keep1"})
+		c.Check(cr.Binds, DeepEquals, []string{realTemp + "/keep1/tmp0:/keeptmp"})
 		cr.CleanupDirs()
+		checkEmpty()
 	}
 
 	{
 		i = 0
-		cr.Container.Mounts = make(map[string]arvados.Mount)
-		cr.Container.Mounts["/keepinp"] = arvados.Mount{Kind: "collection", PortableDataHash: "59389a8f9ee9d399be35462a0f92541c+53"}
-		cr.Container.Mounts["/keepout"] = arvados.Mount{Kind: "collection", Writable: true}
+		cr.Container.Mounts = map[string]arvados.Mount{
+			"/keepinp": {Kind: "collection", PortableDataHash: "59389a8f9ee9d399be35462a0f92541c+53"},
+			"/keepout": {Kind: "collection", Writable: true},
+		}
 		cr.OutputPath = "/keepout"
 
-		os.MkdirAll("/tmp/mktmpdir1/by_id/59389a8f9ee9d399be35462a0f92541c+53", os.ModePerm)
-		os.MkdirAll("/tmp/mktmpdir1/tmp0", os.ModePerm)
+		os.MkdirAll(realTemp+"/keep1/by_id/59389a8f9ee9d399be35462a0f92541c+53", os.ModePerm)
+		os.MkdirAll(realTemp+"/keep1/tmp0", os.ModePerm)
 
 		err := cr.SetupMounts()
 		c.Check(err, IsNil)
-		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", "/tmp/mktmpdir1"})
-		var ss sort.StringSlice = cr.Binds
-		ss.Sort()
-		c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir1/by_id/59389a8f9ee9d399be35462a0f92541c+53:/keepinp:ro",
-			"/tmp/mktmpdir1/tmp0:/keepout"})
+		c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--allow-other", "--read-write", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", realTemp + "/keep1"})
+		sort.StringSlice(cr.Binds).Sort()
+		c.Check(cr.Binds, DeepEquals, []string{realTemp + "/keep1/by_id/59389a8f9ee9d399be35462a0f92541c+53:/keepinp:ro",
+			realTemp + "/keep1/tmp0:/keepout"})
 		cr.CleanupDirs()
+		checkEmpty()
 	}
 
 	for _, test := range []struct {
@@ -823,11 +845,12 @@ func (s *TestSuite) TestSetupMounts(c *C) {
 		err := cr.SetupMounts()
 		c.Check(err, IsNil)
 		sort.StringSlice(cr.Binds).Sort()
-		c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir2/mountdata.json:/mnt/test.json:ro"})
-		content, err := ioutil.ReadFile("/tmp/mktmpdir2/mountdata.json")
+		c.Check(cr.Binds, DeepEquals, []string{realTemp + "/2/mountdata.json:/mnt/test.json:ro"})
+		content, err := ioutil.ReadFile(realTemp + "/2/mountdata.json")
 		c.Check(err, IsNil)
 		c.Check(content, DeepEquals, []byte(test.out))
 		cr.CleanupDirs()
+		checkEmpty()
 	}
 }
 

commit 2f27547b2ec374fddbaed63b2a72362d7bf81157
Author: Tom Clegg <tom at curoverse.com>
Date:   Thu Aug 4 01:48:33 2016 -0400

    9595: Support "json" mount type.

diff --git a/sdk/go/arvados/container.go b/sdk/go/arvados/container.go
index ac12952..bb36b17 100644
--- a/sdk/go/arvados/container.go
+++ b/sdk/go/arvados/container.go
@@ -18,12 +18,13 @@ type Container struct {
 
 // Mount is special behavior to attach to a filesystem path or device.
 type Mount struct {
-	Kind             string `json:"kind"`
-	Writable         bool   `json:"writable"`
-	PortableDataHash string `json:"portable_data_hash"`
-	UUID             string `json:"uuid"`
-	DeviceType       string `json:"device_type"`
-	Path             string `json:"path"`
+	Kind             string      `json:"kind"`
+	Writable         bool        `json:"writable"`
+	PortableDataHash string      `json:"portable_data_hash"`
+	UUID             string      `json:"uuid"`
+	DeviceType       string      `json:"device_type"`
+	Path             string      `json:"path"`
+	Content          interface{} `json:"content"`
 }
 
 // RuntimeConstraints specify a container's compute resources (RAM,
diff --git a/services/crunch-run/crunchrun.go b/services/crunch-run/crunchrun.go
index 32d524a..060a462 100644
--- a/services/crunch-run/crunchrun.go
+++ b/services/crunch-run/crunchrun.go
@@ -18,6 +18,7 @@ import (
 	"os/exec"
 	"os/signal"
 	"path"
+	"path/filepath"
 	"strings"
 	"sync"
 	"syscall"
@@ -255,7 +256,8 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
 			}
 		}
 
-		if mnt.Kind == "collection" {
+		switch {
+		case mnt.Kind == "collection":
 			var src string
 			if mnt.UUID != "" && mnt.PortableDataHash != "" {
 				return fmt.Errorf("Cannot specify both 'uuid' and 'portable_data_hash' for a collection mount")
@@ -286,25 +288,47 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
 				runner.Binds = append(runner.Binds, fmt.Sprintf("%s:%s:ro", src, bind))
 			}
 			collectionPaths = append(collectionPaths, src)
-		} else if mnt.Kind == "tmp" {
-			if bind == runner.Container.OutputPath {
-				runner.HostOutputDir, err = runner.MkTempDir("", "")
-				if err != nil {
-					return fmt.Errorf("While creating mount temp dir: %v", err)
-				}
-				st, staterr := os.Stat(runner.HostOutputDir)
-				if staterr != nil {
-					return fmt.Errorf("While Stat on temp dir: %v", staterr)
-				}
-				err = os.Chmod(runner.HostOutputDir, st.Mode()|os.ModeSetgid|0777)
-				if staterr != nil {
-					return fmt.Errorf("While Chmod temp dir: %v", err)
-				}
-				runner.CleanupTempDir = append(runner.CleanupTempDir, runner.HostOutputDir)
-				runner.Binds = append(runner.Binds, fmt.Sprintf("%s:%s", runner.HostOutputDir, bind))
-			} else {
-				runner.Binds = append(runner.Binds, bind)
+
+		case mnt.Kind == "tmp" && bind == runner.Container.OutputPath:
+			runner.HostOutputDir, err = runner.MkTempDir("", "")
+			if err != nil {
+				return fmt.Errorf("While creating mount temp dir: %v", err)
+			}
+			st, staterr := os.Stat(runner.HostOutputDir)
+			if staterr != nil {
+				return fmt.Errorf("While Stat on temp dir: %v", staterr)
+			}
+			err = os.Chmod(runner.HostOutputDir, st.Mode()|os.ModeSetgid|0777)
+			if staterr != nil {
+				return fmt.Errorf("While Chmod temp dir: %v", err)
+			}
+			runner.CleanupTempDir = append(runner.CleanupTempDir, runner.HostOutputDir)
+			runner.Binds = append(runner.Binds, fmt.Sprintf("%s:%s", runner.HostOutputDir, bind))
+
+		case mnt.Kind == "tmp":
+			runner.Binds = append(runner.Binds, bind)
+
+		case mnt.Kind == "json":
+			jsondata, err := json.Marshal(mnt.Content)
+			if err != nil {
+				return fmt.Errorf("encoding json data: %v", err)
+			}
+			// Create a tempdir with a single file
+			// (instead of just a tempfile): this way we
+			// can ensure the file is world-readable
+			// inside the container, without having to
+			// make it world-readable on the docker host.
+			tmpdir, err := runner.MkTempDir("", "")
+			if err != nil {
+				return fmt.Errorf("creating temp dir: %v", err)
+			}
+			runner.CleanupTempDir = append(runner.CleanupTempDir, tmpdir)
+			tmpfn := filepath.Join(tmpdir, "mountdata.json")
+			err = ioutil.WriteFile(tmpfn, jsondata, 0644)
+			if err != nil {
+				return fmt.Errorf("writing temp file: %v", err)
 			}
+			runner.Binds = append(runner.Binds, fmt.Sprintf("%s:%s:ro", tmpfn, bind))
 		}
 	}
 
diff --git a/services/crunch-run/crunchrun_test.go b/services/crunch-run/crunchrun_test.go
index d95ff08..36e83a4 100644
--- a/services/crunch-run/crunchrun_test.go
+++ b/services/crunch-run/crunchrun_test.go
@@ -807,6 +807,28 @@ func (s *TestSuite) TestSetupMounts(c *C) {
 			"/tmp/mktmpdir1/tmp0:/keepout"})
 		cr.CleanupDirs()
 	}
+
+	for _, test := range []struct {
+		in  interface{}
+		out string
+	}{
+		{in: "foo", out: `"foo"`},
+		{in: nil, out: `null`},
+		{in: map[string]int{"foo": 123}, out: `{"foo":123}`},
+	} {
+		i = 0
+		cr.Container.Mounts = map[string]arvados.Mount{
+			"/mnt/test.json": {Kind: "json", Content: test.in},
+		}
+		err := cr.SetupMounts()
+		c.Check(err, IsNil)
+		sort.StringSlice(cr.Binds).Sort()
+		c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir2/mountdata.json:/mnt/test.json:ro"})
+		content, err := ioutil.ReadFile("/tmp/mktmpdir2/mountdata.json")
+		c.Check(err, IsNil)
+		c.Check(content, DeepEquals, []byte(test.out))
+		cr.CleanupDirs()
+	}
 }
 
 func (s *TestSuite) TestStdout(c *C) {

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list