X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/826bc4316d3afb0013b9951c37137323d0e00b08..0bb53c1cbcbcb8b3be50e6ecf3fdf0bb7cbd96b5:/services/crunch-run/copier_test.go diff --git a/services/crunch-run/copier_test.go b/services/crunch-run/copier_test.go index 7b13ef905d..c0fe38008d 100644 --- a/services/crunch-run/copier_test.go +++ b/services/crunch-run/copier_test.go @@ -108,16 +108,35 @@ func (s *copierSuite) TestSecretInOutputDir(c *check.C) { } func (s *copierSuite) TestSymlinkToMountedCollection(c *check.C) { + // simulate mounted read-only collection s.cp.mounts["/mnt"] = arvados.Mount{ Kind: "collection", - PortableDataHash: arvadostest.FooPdh, + PortableDataHash: arvadostest.FooCollectionPDH, } + + // simulate mounted writable collection + bindtmp, err := ioutil.TempDir("", "crunch-run.test.") + c.Assert(err, check.IsNil) + defer os.RemoveAll(bindtmp) + f, err := os.OpenFile(bindtmp+"/.arvados#collection", os.O_CREATE|os.O_WRONLY, 0644) + c.Assert(err, check.IsNil) + _, err = io.WriteString(f, `{"manifest_text":". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n"}`) + c.Assert(err, check.IsNil) + c.Assert(f.Close(), check.IsNil) + s.cp.mounts["/mnt-w"] = arvados.Mount{ + Kind: "collection", + PortableDataHash: arvadostest.FooCollectionPDH, + Writable: true, + } + s.cp.binds = append(s.cp.binds, bindtmp+":/mnt-w") + c.Assert(os.Symlink("../../mnt", s.cp.hostOutputDir+"/l_dir"), check.IsNil) c.Assert(os.Symlink("/mnt/foo", s.cp.hostOutputDir+"/l_file"), check.IsNil) + c.Assert(os.Symlink("/mnt-w/bar", s.cp.hostOutputDir+"/l_file_w"), check.IsNil) - err := s.cp.walkMount("", s.cp.ctrOutputDir, 10, true) + err = s.cp.walkMount("", s.cp.ctrOutputDir, 10, true) c.Check(err, check.IsNil) - c.Check(s.cp.manifest, check.Matches, `(?ms)\./l_dir acbd\S+ 0:3:foo\n\. acbd\S+ 0:3:l_file\n`) + c.Check(s.cp.manifest, check.Matches, `(?ms)\./l_dir acbd\S+ 0:3:foo\n\. acbd\S+ 0:3:l_file\n\. 37b5\S+ 0:3:l_file_w\n`) } func (s *copierSuite) TestSymlink(c *check.C) { @@ -134,6 +153,8 @@ func (s *copierSuite) TestSymlink(c *check.C) { os.MkdirAll(s.cp.hostOutputDir+"/morelinks", 0755), os.Symlink("../dir1/dir2", s.cp.hostOutputDir+"/morelinks/l_rel_dir2"), os.Symlink("dir1/dir2/dir3", s.cp.hostOutputDir+"/l_rel_dir3"), + // rel. symlink -> rel. symlink -> regular file + os.Symlink("../dir1/dir2/l_rel_file", s.cp.hostOutputDir+"/morelinks/l_rel_l_rel_file"), } { c.Assert(err, check.IsNil) } @@ -157,6 +178,7 @@ func (s *copierSuite) TestSymlink(c *check.C) { {dst: "/l_rel_file", src: hostfile, size: 4}, {dst: "/morelinks/l_rel_dir2/dir3/.keep", src: os.DevNull}, {dst: "/morelinks/l_rel_dir2/l_rel_file", src: hostfile, size: 4}, + {dst: "/morelinks/l_rel_l_rel_file", src: hostfile, size: 4}, }) } @@ -172,14 +194,23 @@ func (s *copierSuite) TestUnsupportedMountKindBelow(c *check.C) { c.Check(err, check.NotNil) } -func (s *copierSuite) TestUnsupportedWritableMountBelow(c *check.C) { - s.cp.mounts["/ctr/outdir/dirk"] = arvados.Mount{ +func (s *copierSuite) TestWritableMountBelow(c *check.C) { + s.cp.mounts["/ctr/outdir/mount"] = arvados.Mount{ Kind: "collection", - PortableDataHash: arvadostest.FooPdh, + PortableDataHash: arvadostest.FooCollectionPDH, Writable: true, } + c.Assert(os.MkdirAll(s.cp.hostOutputDir+"/mount", 0755), check.IsNil) + s.writeFileInOutputDir(c, "file", "file") + s.writeFileInOutputDir(c, "mount/foo", "foo") + err := s.cp.walkMount("", s.cp.ctrOutputDir, 10, true) - c.Check(err, check.NotNil) + c.Check(err, check.IsNil) + c.Check(s.cp.dirs, check.DeepEquals, []string{"/mount"}) + c.Check(s.cp.files, check.DeepEquals, []filetodo{ + {src: s.cp.hostOutputDir + "/file", dst: "/file", size: 4}, + {src: s.cp.hostOutputDir + "/mount/foo", dst: "/mount/foo", size: 3}, + }) } func (s *copierSuite) writeFileInOutputDir(c *check.C, path, data string) {