8311: Try some git_tree mounts in TestSetupMounts.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 13 Dec 2017 22:13:42 +0000 (17:13 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 14 Dec 2017 16:07:27 +0000 (11:07 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

services/crunch-run/crunchrun_test.go
services/crunch-run/git_mount.go
services/crunch-run/git_mount_test.go

index e1d9fed730ea5ace0393b07e8b1fd8f1eaff65e4..4d76e34f4c2b743a2637260c592213d7b3cd3ea6 100644 (file)
@@ -28,6 +28,7 @@ import (
 
        "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "git.curoverse.com/arvados.git/sdk/go/arvadostest"
        "git.curoverse.com/arvados.git/sdk/go/manifest"
 
        dockertypes "github.com/docker/docker/api/types"
@@ -1263,6 +1264,64 @@ func (s *TestSuite) TestSetupMounts(c *C) {
                cr.CleanupDirs()
                checkEmpty()
        }
+
+       // git_tree mounts
+       {
+               i = 0
+               cr.ArvMountPoint = ""
+               (*GitMountSuite)(nil).useTestGitServer(c)
+               cr.Container.Mounts = make(map[string]arvados.Mount)
+               cr.Container.Mounts = map[string]arvados.Mount{
+                       "/tip": {
+                               Kind:   "git_tree",
+                               UUID:   arvadostest.Repository2UUID,
+                               Commit: "fd3531f42995344f36c30b79f55f27b502f3d344",
+                               Path:   "/",
+                       },
+                       "/non-tip": {
+                               Kind:     "git_tree",
+                               UUID:     arvadostest.Repository2UUID,
+                               Commit:   "5ebfab0522851df01fec11ec55a6d0f4877b542e",
+                               Path:     "/",
+                               Writable: true,
+                       },
+               }
+               cr.OutputPath = "/tmp"
+
+               err := cr.SetupMounts()
+               c.Check(err, IsNil)
+
+               // dirMap[mountpoint] == tmpdir
+               dirMap := make(map[string]string)
+               for _, bind := range cr.Binds {
+                       tokens := strings.Split(bind, ":")
+                       dirMap[tokens[1]] = tokens[0]
+
+                       if cr.Container.Mounts[tokens[1]].Writable {
+                               c.Check(len(tokens), Equals, 2)
+                       } else {
+                               c.Check(len(tokens), Equals, 3)
+                               c.Check(tokens[2], Equals, "ro")
+                       }
+               }
+
+               data, err := ioutil.ReadFile(dirMap["/tip"] + "/dir1/dir2/file with mode 0644")
+               c.Check(err, IsNil)
+               c.Check(string(data), Equals, "\000\001\002\003")
+               _, err = ioutil.ReadFile(dirMap["/tip"] + "/file only on testbranch")
+               c.Check(err, FitsTypeOf, &os.PathError{})
+               c.Check(os.IsNotExist(err), Equals, true)
+
+               data, err = ioutil.ReadFile(dirMap["/non-tip"] + "/dir1/dir2/file with mode 0644")
+               c.Check(err, IsNil)
+               c.Check(string(data), Equals, "\000\001\002\003")
+               data, err = ioutil.ReadFile(dirMap["/non-tip"] + "/file only on testbranch")
+               c.Check(err, IsNil)
+               c.Check(string(data), Equals, "testfile\n")
+
+               cr.CleanupDirs()
+               checkEmpty()
+       }
 }
 
 func (s *TestSuite) TestStdout(c *C) {
index a792741ae43b64591a125660a8e774e15af421a8..110a81b853f7c62295146371f06cb0158fb748fb 100644 (file)
@@ -33,7 +33,10 @@ func (gm gitMount) extractTree(ac IArvadosClient, dir string) error {
        baseURL, err := ac.Discovery("gitUrl")
        if err != nil {
                return fmt.Errorf("discover gitUrl from API: %s", err)
+       } else if _, ok := baseURL.(string); !ok {
+               return fmt.Errorf("discover gitUrl from API: expected string, found %T", baseURL)
        }
+
        u, err := url.Parse(baseURL.(string))
        if err != nil {
                return fmt.Errorf("parse gitUrl %q: %s", baseURL, err)
index 4c6ce7f0750d5de1e02bc617ab504fe4acf9cb82..e984000fb8352bb6eb9c9bef74b482c70b4c120b 100644 (file)
@@ -22,15 +22,10 @@ type GitMountSuite struct {
 
 var _ = check.Suite(&GitMountSuite{})
 
-func (s *GitMountSuite) SetUpSuite(c *check.C) {
-       git_client.InstallProtocol("https", git_http.NewClient(arvados.InsecureHTTPClient))
-}
-
 func (s *GitMountSuite) SetUpTest(c *check.C) {
-       port, err := ioutil.ReadFile("../../tmp/arv-git-httpd-ssl.port")
-       c.Assert(err, check.IsNil)
-       discoveryMap["gitUrl"] = "https://localhost:" + string(port)
+       s.useTestGitServer(c)
 
+       var err error
        s.tmpdir, err = ioutil.TempDir("", "")
        c.Assert(err, check.IsNil)
 }
@@ -117,6 +112,17 @@ func (s *GitMountSuite) TestNonexistentCommit(c *check.C) {
        s.checkTmpdirContents(c, []string{})
 }
 
+func (s *GitMountSuite) TestGitUrlDiscoveryFails(c *check.C) {
+       delete(discoveryMap, "gitUrl")
+       gm := gitMount{
+               Path:   "/",
+               UUID:   arvadostest.Repository2UUID,
+               Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
+       }
+       err := gm.extractTree(&ArvTestClient{}, s.tmpdir)
+       c.Check(err, check.ErrorMatches, ".*gitUrl.*")
+}
+
 func (s *GitMountSuite) TestInvalid(c *check.C) {
        for _, trial := range []struct {
                gm      gitMount
@@ -150,7 +156,7 @@ func (s *GitMountSuite) TestInvalid(c *check.C) {
                c.Check(err, check.NotNil)
                s.checkTmpdirContents(c, []string{})
 
-               err := trial.gm.validate()
+               err = trial.gm.validate()
                c.Check(err, check.ErrorMatches, trial.matcher)
        }
 }
@@ -162,3 +168,11 @@ func (s *GitMountSuite) checkTmpdirContents(c *check.C, expect []string) {
        c.Check(err, check.IsNil)
        c.Check(names, check.DeepEquals, expect)
 }
+
+func (*GitMountSuite) useTestGitServer(c *check.C) {
+       git_client.InstallProtocol("https", git_http.NewClient(arvados.InsecureHTTPClient))
+
+       port, err := ioutil.ReadFile("../../tmp/arv-git-httpd-ssl.port")
+       c.Assert(err, check.IsNil)
+       discoveryMap["gitUrl"] = "https://localhost:" + string(port)
+}