[ARVADOS] updated: 1.1.3-389-g61a5f1c

Git user git at public.curoverse.com
Tue Apr 10 13:35:20 EDT 2018


Summary of changes:
 .gitignore                                         |  1 +
 build/run-build-test-packages-one-target.sh        |  1 +
 build/run-library.sh                               | 48 +++++++++---
 doc/install/install-sso.html.textile.liquid        |  6 +-
 sdk/cwl/MANIFEST.in                                |  1 +
 sdk/cwl/arvados_cwl/__init__.py                    | 12 ++-
 sdk/cwl/arvados_cwl/_version.py                    |  7 --
 sdk/cwl/arvados_cwl/arvcontainer.py                |  6 +-
 sdk/cwl/arvados_cwl/arvworkflow.py                 | 76 ++++++++++++-------
 sdk/cwl/arvados_cwl/crunch_script.py               |  2 +
 sdk/cwl/arvados_version.py                         | 40 ++++++++++
 sdk/cwl/gittaggers.py                              |  6 +-
 sdk/cwl/setup.py                                   | 19 ++---
 sdk/cwl/tests/arvados-tests.yml                    | 25 +++++++
 sdk/cwl/tests/test_submit.py                       | 49 +++++++-----
 sdk/cwl/tests/wf/check_mem.py                      | 12 +++
 sdk/cwl/tests/wf/runin-reqs-wf.cwl                 | 58 +++++++++++++++
 sdk/cwl/tests/wf/runin-reqs-wf2.cwl                | 59 +++++++++++++++
 sdk/cwl/tests/wf/runin-reqs-wf3.cwl                | 59 +++++++++++++++
 sdk/cwl/tests/wf/runin-reqs-wf4.cwl                | 59 +++++++++++++++
 sdk/go/arvados/fs_base.go                          |  5 +-
 sdk/go/arvados/fs_collection_test.go               | 22 ++++--
 sdk/go/arvados/fs_project.go                       |  5 +-
 sdk/go/arvadostest/run_servers.go                  |  3 +
 sdk/go/keepclient/collectionreader_test.go         |  1 +
 sdk/go/keepclient/keepclient_test.go               |  1 +
 sdk/pam/MANIFEST.in                                |  1 +
 sdk/pam/arvados_version.py                         | 40 ++++++++++
 sdk/pam/setup.py                                   | 22 +++---
 sdk/python/MANIFEST.in                             |  1 +
 sdk/python/README.rst                              |  2 +-
 sdk/python/arvados/_version.py                     |  7 --
 sdk/python/arvados_version.py                      | 40 ++++++++++
 sdk/python/gittaggers.py                           |  7 +-
 sdk/python/setup.py                                | 17 ++---
 services/api/app/models/arvados_model.rb           |  6 +-
 services/api/app/models/collection.rb              |  4 +-
 services/api/app/models/container.rb               | 34 +++++----
 services/api/app/models/container_request.rb       |  5 +-
 services/api/lib/arvados_model_updates.rb          | 21 ++++++
 services/api/lib/current_api_client.rb             |  6 --
 services/api/lib/sweep_trashed_collections.rb      | 41 ----------
 services/api/lib/sweep_trashed_objects.rb          | 74 ++++++++++++++++++
 services/api/script/get_anonymous_user_token.rb    | 23 +++++-
 services/api/test/fixtures/groups.yml              | 12 ++-
 services/api/test/fixtures/jobs.yml                | 11 +++
 services/api/test/unit/collection_test.rb          | 14 ++--
 services/api/test/unit/container_request_test.rb   |  6 ++
 services/api/test/unit/group_test.rb               | 55 ++++++++++++--
 .../crunch-dispatch-slurm_test.go                  |  1 +
 services/crunch-run/crunchrun_test.go              |  2 +
 services/dockercleaner/MANIFEST.in                 |  1 +
 services/dockercleaner/arvados_version.py          | 40 ++++++++++
 services/dockercleaner/setup.py                    | 25 ++++---
 services/fuse/MANIFEST.in                          |  1 +
 services/fuse/arvados_fuse/_version.py             |  7 --
 services/fuse/arvados_version.py                   | 40 ++++++++++
 services/fuse/setup.py                             | 17 ++---
 services/keep-web/cadaver_test.go                  | 87 ++++++++++++++--------
 services/keep-web/handler.go                       | 22 +++---
 services/keep-web/handler_test.go                  | 50 ++++++++++---
 services/keep-web/server_test.go                   |  2 -
 services/keep-web/webdav.go                        |  2 +-
 services/keepproxy/keepproxy.go                    |  8 +-
 services/keepproxy/keepproxy_test.go               | 13 +++-
 services/keepstore/s3_volume_test.go               |  6 +-
 services/keepstore/volume_generic_test.go          |  2 +-
 services/keepstore/volume_unix.go                  |  5 ++
 services/nodemanager/MANIFEST.in                   |  1 +
 services/nodemanager/arvados_version.py            | 40 ++++++++++
 services/nodemanager/arvnodeman/_version.py        |  7 --
 services/nodemanager/arvnodeman/baseactor.py       |  3 +
 .../nodemanager/arvnodeman/computenode/__init__.py |  8 +-
 .../arvnodeman/computenode/dispatch/__init__.py    | 10 +++
 .../arvnodeman/computenode/driver/__init__.py      | 11 ++-
 services/nodemanager/arvnodeman/daemon.py          | 13 +++-
 services/nodemanager/arvnodeman/jobqueue.py        | 13 ++--
 services/nodemanager/arvnodeman/status.py          | 39 +++++++++-
 services/nodemanager/setup.py                      | 24 +++---
 services/nodemanager/tests/integration_test.py     | 84 ++++++++++++++++-----
 .../nodemanager/tests/test_computenode_dispatch.py | 26 ++++++-
 .../nodemanager/tests/test_computenode_driver.py   | 49 ++++++++++++
 services/nodemanager/tests/test_daemon.py          | 45 ++++++++++-
 services/nodemanager/tests/test_failure.py         |  3 +
 services/nodemanager/tests/test_jobqueue.py        | 12 +--
 services/nodemanager/tests/test_status.py          | 40 ++++++++++
 tools/crunchstat-summary/MANIFEST.in               |  1 +
 tools/crunchstat-summary/arvados_version.py        | 40 ++++++++++
 tools/crunchstat-summary/setup.py                  | 23 +++---
 89 files changed, 1481 insertions(+), 374 deletions(-)
 delete mode 100644 sdk/cwl/arvados_cwl/_version.py
 create mode 100644 sdk/cwl/arvados_version.py
 create mode 100644 sdk/cwl/tests/wf/check_mem.py
 create mode 100644 sdk/cwl/tests/wf/runin-reqs-wf.cwl
 create mode 100644 sdk/cwl/tests/wf/runin-reqs-wf2.cwl
 create mode 100644 sdk/cwl/tests/wf/runin-reqs-wf3.cwl
 create mode 100644 sdk/cwl/tests/wf/runin-reqs-wf4.cwl
 create mode 100644 sdk/pam/arvados_version.py
 delete mode 100644 sdk/python/arvados/_version.py
 create mode 100644 sdk/python/arvados_version.py
 create mode 100644 services/api/lib/arvados_model_updates.rb
 delete mode 100644 services/api/lib/sweep_trashed_collections.rb
 create mode 100644 services/api/lib/sweep_trashed_objects.rb
 create mode 100644 services/dockercleaner/arvados_version.py
 delete mode 100644 services/fuse/arvados_fuse/_version.py
 create mode 100644 services/fuse/arvados_version.py
 create mode 100644 services/nodemanager/arvados_version.py
 delete mode 100644 services/nodemanager/arvnodeman/_version.py
 create mode 100644 tools/crunchstat-summary/arvados_version.py

       via  61a5f1cab58f4652a9f9bdd4f6bc26c887eae75b (commit)
       via  c4d189853805f53b70e8422820a69fe77fdaa11f (commit)
       via  518f6844fe58425695dad9a27bedea506aa2d709 (commit)
       via  dab585f6a010428867c33887a2501f0b6f6a6273 (commit)
       via  9e95cfe059f31c0a7aa5dda415e144f1b317626b (commit)
       via  8dd1a09d1b8622f93ee0c46e032a9eec17dc7482 (commit)
       via  f0079947e70efe61e98f8b0e58c894f7b045c306 (commit)
       via  0f0e585847ab5dae34bc66f981e361096a70e15e (commit)
       via  c4bd314ff8fe1cab2283cca9e09de55706da9606 (commit)
       via  2fbdfebf757e5a9b53cf0a21facdf2bd3ea6c757 (commit)
       via  67a9e63d83a429eadddfa1424a37e010f7c2c365 (commit)
       via  842c85cde40da0aad5afd5be08821a3b831312f4 (commit)
       via  5fd2ed9e93670007226a1772040a966fb9dd4d22 (commit)
       via  1331558448115c6c7095d2922182e6c409763499 (commit)
       via  5c0a4eb517a5f0b81e11df1b610fafdf3fab1dcc (commit)
       via  b071ebdaecf1f8609c3b872e588c08068448c593 (commit)
       via  eaf140d67206316dc5e0e4c1f99969e7ecaac5b6 (commit)
       via  dd481ab3359f1b360a22d03c09d8035ef5db1f38 (commit)
       via  510bdb4e054a7406dbaece96fc46cc7bc14b2c69 (commit)
       via  9151ad624bef1ae076940298c6890deadd79e2dd (commit)
       via  c48ed6487b9148269f25f6733a1d4f1860b8ea72 (commit)
       via  2e12c325de2f875cca6f0564c3ac4048ff9aa436 (commit)
       via  ab241553f88f9806aa4fe13756c318c0d754e5cc (commit)
       via  c334c1a486114024ed22bfb88a1aa79dc1d99772 (commit)
       via  7278de803df2021ddc185dda0cef1d565ab677ff (commit)
       via  196cb2e84834de79f25414de09a8d00bbe1a5eae (commit)
       via  74b20ebe687946ba844db675b31865e5f055d59b (commit)
       via  9dc405e38ed0a977f5466ea909dd416cd192a20b (commit)
       via  396cb080346a46a94508b2938ef6d916f4d1778f (commit)
       via  4ad120ed9f8977dff6ab333b4223f323d04a33d7 (commit)
       via  85fd7987cf5bf579d79e68d1476a100dac982914 (commit)
       via  fa4b95589af65ba47bb4b4af62e809556506ce19 (commit)
       via  3d0c6eb03b4147bdda952aeca0cb933c1636242b (commit)
       via  001a60dff02545c2d2476a437b1846c9ae633941 (commit)
       via  d0dd4abf2e364ad94c3bb8ad227faee28edda153 (commit)
       via  5f463235cefa6a0c566ff3f0d71f09e0d3be2fce (commit)
       via  aebdddd8d1449ff7f8a6ba63054276e798dd79a0 (commit)
       via  a3da6f03cfb1bd6b36fdb1a51efeafcd7d64157e (commit)
       via  8680023bb3804d3bd1f2dcac7d1a86ff14053fca (commit)
       via  fea63ac8216b2a15101bc75cd02586d934897160 (commit)
       via  0381484cce9877c31231f92daa74ae971e43ba2f (commit)
       via  e9b4a6fc35b469794d0f6a080254006187501f66 (commit)
       via  595606c78208fe8a783299091108b48ebccfc1c7 (commit)
       via  2dbd8ea3bc22f8f0eecf4bbe752d0bec8bf88726 (commit)
       via  d506c0c47b3bee53d89fcbb9d3b933d4b3aee39a (commit)
       via  24f9bc348608393ec88d5632e3b4a627420dcba1 (commit)
       via  758a38ee0a652f2e8ca8bee94f0e182767bf499b (commit)
       via  dcb35293cb12d0fbcae5fd3f95026b3dc7713ab0 (commit)
       via  e64ab2bb55a6c547956c83907e72dda349cdc5e9 (commit)
       via  37cfe352d0522015759b66ab552a964d74a76914 (commit)
       via  3ada9e786796ae8861c375a1cc389e2a8873cd45 (commit)
       via  73d6064c3816d2d569ae47cd5609e5dfdfe235a1 (commit)
       via  e8a24e57d286b4db22903762ebd888dc63d32206 (commit)
       via  1a6777657c96a1a23678d9ec41e7d02ace55e5e8 (commit)
       via  7a38d6b19120b3284533196ff3c94c2043826aef (commit)
       via  ab052248e5637d7d0a3ad8636dfd1b674a2ccc45 (commit)
       via  0d5d9ba7fecfb5842930f27d9c450b33a8b4f153 (commit)
       via  c6ad0a2440f5e8f8361eeed07d0048c3d38c651b (commit)
       via  0cbae7c90cb9298d930e8a0f001764df729fec86 (commit)
       via  2f6a83dba97c5dbcbb3b077deafaa08797293edb (commit)
       via  56b434f7e4ca8ceae70b4b75ce4e01f254fcd550 (commit)
       via  acecc56abbd717bd05bf4a6544a677f4b5a8fc9b (commit)
       via  8e66062845cb567092de48edf9b2faaf1a4e2ae3 (commit)
       via  0f2d5848629c68d8f59f140d4879d7172536dcb8 (commit)
       via  5bac1f802ff40c4e82542a4fac49086fcc86e135 (commit)
       via  d73d6a3db684ad46eecd98fa8208594142ebdc2c (commit)
       via  1c2372c62c11f6de9d452483e79dc15aaecc0578 (commit)
       via  fd8c6aa9f8e8588fca348d8ae5b9422dfb0ab7fb (commit)
       via  c9283683ff2e2dc3c52b4bc48b1d13d8dd1c9674 (commit)
       via  9ca97ebf3f28fb88559a994daf222f629ad9d0aa (commit)
       via  fdaaf4f5b58406b10167714b57affe0905e3216b (commit)
       via  04319cbe8d3e8c858bb6d93037e09d3af4271c42 (commit)
       via  4998ea2c5a8b2bf9066de8c454d5fb990ff9cba6 (commit)
       via  d41ae3025fe6a06317aa8806bdc1913d994b4014 (commit)
       via  71d59d43760dcacb0e6f56ec77f693b93f9e875d (commit)
       via  0192a6a19302bbe469264319429c5f50322b1233 (commit)
       via  5667012a090b6c561cdf0f84554d4673b2020954 (commit)
       via  198a3409881f5b9f1fe77ae551efde1968bfb639 (commit)
       via  45d780e20c41181c33562f99262bcf1f507f5a6a (commit)
       via  368191c0f0f7c094a6ba7619dcf5e572a3f84f79 (commit)
       via  54ef4b36d1fa48960a87f527c5dd69101486d908 (commit)
       via  2b1a65816ab15bac35f260aa65f979d17e37323e (commit)
       via  a2e3be11c517402346702f8d4e3d2e851fec7b46 (commit)
       via  1ea42486b1badd6ebd1a0071f3dd7bc1ec41b920 (commit)
       via  ac74647ec063c81654f0d4ec368a3e6bd74484a6 (commit)
       via  2e1892bbd21d7ac8432c923fa84eb8526cfae558 (commit)
       via  48a362bb93d1e53e879a563da85aecd070987f30 (commit)
       via  af2ec135f1b634e67205db1752d5ad65aa9c87b9 (commit)
       via  9a92b8605be087ea76f2db614ea62173578948d9 (commit)
       via  2baac8a6702551064b065f752f75a9b40dbec0f5 (commit)
       via  378eeb13b1c4d188d07bde0abfe3955ad53d4beb (commit)
       via  98fb00994467e805f764d799e78420ecac9c0879 (commit)
       via  7a104e46ce7ebe905500824affa15c380fc5f2c5 (commit)
       via  f1ee0cb2f85c4ea988700da2e3957565b6861ad5 (commit)
       via  b17321254d9bdfb0939d3705b4b110d7df75afe2 (commit)
       via  66aaa7d715eedd38265ee0987ef2a5cf7b623fd9 (commit)
       via  93d9c63e1fd4d4c268aa9050406b9a212f3d4a22 (commit)
       via  9746d8b3d8c259836799656ff6e5f401d9d4d492 (commit)
       via  2dd214985e9727bf0b5fbf11b0e39c3e7d3cc5c4 (commit)
      from  ee4cf1187d0dd44608e501df939d81b35d37772e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 61a5f1cab58f4652a9f9bdd4f6bc26c887eae75b
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Fri Apr 6 16:41:11 2018 -0400

    13111: Note safe use of append().
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/arvados/fs_project.go b/sdk/go/arvados/fs_project.go
index 300c77a..071cc0a 100644
--- a/sdk/go/arvados/fs_project.go
+++ b/sdk/go/arvados/fs_project.go
@@ -44,6 +44,9 @@ func (pn *projectnode) load() {
 		}
 		pn.uuid = resp.UUID
 	}
+	// Note: the "filters" slice's backing array might be reused
+	// by append(filters,...) below. This isn't goroutine safe,
+	// but all accesses are in the same goroutine, so it's OK.
 	filters := []Filter{{"owner_uuid", "=", pn.uuid}}
 	params := ResourceListParams{
 		Filters: filters,

commit c4d189853805f53b70e8422820a69fe77fdaa11f
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Fri Apr 6 16:41:00 2018 -0400

    13111: Update comment.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/arvados/fs_base.go b/sdk/go/arvados/fs_base.go
index fa43cca..45beff6 100644
--- a/sdk/go/arvados/fs_base.go
+++ b/sdk/go/arvados/fs_base.go
@@ -452,7 +452,7 @@ func (fs *fileSystem) Rename(oldname, newname string) error {
 	// call nca.FS().Rename() instead of proceeding. Until then
 	// it's awkward for filesystems to implement their own Rename
 	// methods effectively: the only one that runs is the one on
-	// the root filesystem exposed to the caller (webdav, fuse,
+	// the root FileSystem exposed to the caller (webdav, fuse,
 	// etc).
 
 	// When acquiring locks on multiple inodes, avoid deadlock by

commit 518f6844fe58425695dad9a27bedea506aa2d709
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Fri Apr 6 16:08:35 2018 -0400

    13111: Redirect /dir to /dir/ at siteFS paths.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go
index 446eeb4..5e14cb4 100644
--- a/services/keep-web/handler.go
+++ b/services/keep-web/handler.go
@@ -329,7 +329,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
 	}
 
 	if useSiteFS {
-		h.serveSiteFS(w, r, tokens)
+		h.serveSiteFS(w, r, tokens, credentialsOK)
 		return
 	}
 
@@ -499,7 +499,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
 	}
 }
 
-func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []string) {
+func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []string, credentialsOK bool) {
 	if len(tokens) == 0 {
 		w.Header().Add("WWW-Authenticate", "Basic realm=\"collections\"")
 		http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
@@ -528,18 +528,22 @@ func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []s
 		Insecure:  arv.ApiInsecure,
 	}
 	fs := client.SiteFileSystem(kc)
-	if f, err := fs.Open(r.URL.Path); os.IsNotExist(err) {
+	f, err := fs.Open(r.URL.Path)
+	if os.IsNotExist(err) {
 		http.Error(w, err.Error(), http.StatusNotFound)
 		return
 	} else if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
-	} else if fi, err := f.Stat(); err == nil && fi.IsDir() && r.Method == "GET" {
-
-		h.serveDirectory(w, r, fi.Name(), fs, r.URL.Path, false)
+	}
+	defer f.Close()
+	if fi, err := f.Stat(); err == nil && fi.IsDir() && r.Method == "GET" {
+		if !strings.HasSuffix(r.URL.Path, "/") {
+			h.seeOtherWithCookie(w, r, r.URL.Path+"/", credentialsOK)
+		} else {
+			h.serveDirectory(w, r, fi.Name(), fs, r.URL.Path, false)
+		}
 		return
-	} else {
-		f.Close()
 	}
 	wh := webdav.Handler{
 		Prefix: "/",
diff --git a/services/keep-web/handler_test.go b/services/keep-web/handler_test.go
index 7fed6fb..15f32f1 100644
--- a/services/keep-web/handler_test.go
+++ b/services/keep-web/handler_test.go
@@ -493,10 +493,11 @@ func (s *IntegrationSuite) TestDirectoryListing(c *check.C) {
 		"Authorization": {"OAuth2 " + arvadostest.ActiveToken},
 	}
 	for _, trial := range []struct {
-		uri     string
-		header  http.Header
-		expect  []string
-		cutDirs int
+		uri      string
+		header   http.Header
+		expect   []string
+		redirect string
+		cutDirs  int
 	}{
 		{
 			uri:     strings.Replace(arvadostest.FooAndBarFilesInDirPDH, "+", "-", -1) + ".example.com/",
@@ -529,12 +530,32 @@ func (s *IntegrationSuite) TestDirectoryListing(c *check.C) {
 			cutDirs: 4,
 		},
 		{
+			uri:     "download.example.com/",
+			header:  authHeader,
+			expect:  []string{"users/"},
+			cutDirs: 0,
+		},
+		{
+			uri:      "download.example.com/users",
+			header:   authHeader,
+			redirect: "/users/",
+			expect:   []string{"active/"},
+			cutDirs:  1,
+		},
+		{
 			uri:     "download.example.com/users/",
 			header:  authHeader,
 			expect:  []string{"active/"},
 			cutDirs: 1,
 		},
 		{
+			uri:      "download.example.com/users/active",
+			header:   authHeader,
+			redirect: "/users/active/",
+			expect:   []string{"foo_file_in_dir/"},
+			cutDirs:  2,
+		},
+		{
 			uri:     "download.example.com/users/active/",
 			header:  authHeader,
 			expect:  []string{"foo_file_in_dir/"},
@@ -565,10 +586,11 @@ func (s *IntegrationSuite) TestDirectoryListing(c *check.C) {
 			cutDirs: 1,
 		},
 		{
-			uri:     "download.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/dir1/",
-			header:  authHeader,
-			expect:  []string{"foo", "bar"},
-			cutDirs: 2,
+			uri:      "download.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/dir1",
+			header:   authHeader,
+			redirect: "/c=" + arvadostest.FooAndBarFilesInDirUUID + "/dir1/",
+			expect:   []string{"foo", "bar"},
+			cutDirs:  2,
 		},
 		{
 			uri:     "download.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/_/dir1/",
@@ -577,10 +599,11 @@ func (s *IntegrationSuite) TestDirectoryListing(c *check.C) {
 			cutDirs: 3,
 		},
 		{
-			uri:     arvadostest.FooAndBarFilesInDirUUID + ".example.com/dir1?api_token=" + arvadostest.ActiveToken,
-			header:  authHeader,
-			expect:  []string{"foo", "bar"},
-			cutDirs: 1,
+			uri:      arvadostest.FooAndBarFilesInDirUUID + ".example.com/dir1?api_token=" + arvadostest.ActiveToken,
+			header:   authHeader,
+			redirect: "/dir1/",
+			expect:   []string{"foo", "bar"},
+			cutDirs:  1,
 		},
 		{
 			uri:    "collections.example.com/c=" + arvadostest.FooAndBarFilesInDirUUID + "/theperthcountyconspiracydoesnotexist/",
@@ -616,6 +639,9 @@ func (s *IntegrationSuite) TestDirectoryListing(c *check.C) {
 			resp = httptest.NewRecorder()
 			s.testServer.Handler.ServeHTTP(resp, req)
 		}
+		if trial.redirect != "" {
+			c.Check(req.URL.Path, check.Equals, trial.redirect)
+		}
 		if trial.expect == nil {
 			c.Check(resp.Code, check.Equals, http.StatusNotFound)
 		} else {

commit dab585f6a010428867c33887a2501f0b6f6a6273
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Apr 5 17:54:40 2018 -0400

    13111: Serve "site filesystem" at keep-web root URL.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/keep-web/cadaver_test.go b/services/keep-web/cadaver_test.go
index 0fc6e47..22ddd84 100644
--- a/services/keep-web/cadaver_test.go
+++ b/services/keep-web/cadaver_test.go
@@ -266,6 +266,11 @@ func (s *IntegrationSuite) testCadaver(c *check.C, password string, pathFunc fun
 }
 
 func (s *IntegrationSuite) TestCadaverUsersDir(c *check.C) {
+	for _, path := range []string{"/"} {
+		stdout := s.runCadaver(c, arvadostest.ActiveToken, path, "ls")
+		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+by_id\s+0 .*`)
+		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+users\s+0 .*`)
+	}
 	for _, path := range []string{"/users", "/users/"} {
 		stdout := s.runCadaver(c, arvadostest.ActiveToken, path, "ls")
 		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+active.*`)
diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go
index 00af0f4..446eeb4 100644
--- a/services/keep-web/handler.go
+++ b/services/keep-web/handler.go
@@ -250,7 +250,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
 	} else if r.URL.Path == "/status.json" {
 		h.serveStatus(w, r)
 		return
-	} else if len(pathParts) >= 1 && pathParts[0] == "users" {
+	} else if r.URL.Path == "/" || (len(pathParts) >= 1 && pathParts[0] == "users") {
 		useSiteFS = true
 	} else if len(pathParts) >= 1 && strings.HasPrefix(pathParts[0], "c=") {
 		// /c=ID[/PATH...]
diff --git a/services/keep-web/server_test.go b/services/keep-web/server_test.go
index 02f03d0..ee585ad 100644
--- a/services/keep-web/server_test.go
+++ b/services/keep-web/server_test.go
@@ -59,7 +59,6 @@ func (s *IntegrationSuite) TestNoToken(c *check.C) {
 func (s *IntegrationSuite) Test404(c *check.C) {
 	for _, uri := range []string{
 		// Routing errors (always 404 regardless of what's stored in Keep)
-		"/",
 		"/foo",
 		"/download",
 		"/collections",

commit 9e95cfe059f31c0a7aa5dda415e144f1b317626b
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Apr 5 17:22:08 2018 -0400

    13111: Skip collections named "." or "..".
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/arvados/fs_project.go b/sdk/go/arvados/fs_project.go
index 7f34a42..300c77a 100644
--- a/sdk/go/arvados/fs_project.go
+++ b/sdk/go/arvados/fs_project.go
@@ -60,7 +60,7 @@ func (pn *projectnode) load() {
 		}
 		for _, i := range resp.Items {
 			coll := i
-			if coll.Name == "" {
+			if coll.Name == "" || coll.Name == "." || coll.Name == ".." {
 				continue
 			}
 			pn.inode.Child(coll.Name, func(inode) (inode, error) {

commit 8dd1a09d1b8622f93ee0c46e032a9eec17dc7482
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Apr 5 17:21:53 2018 -0400

    13111: Clarify Child() comment.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/arvados/fs_base.go b/sdk/go/arvados/fs_base.go
index 369b4bb..fa43cca 100644
--- a/sdk/go/arvados/fs_base.go
+++ b/sdk/go/arvados/fs_base.go
@@ -103,6 +103,9 @@ type inode interface {
 
 	// Child() performs lookups and updates of named child nodes.
 	//
+	// (The term "child" here is used strictly. This means name is
+	// not "." or "..", and name does not contain "/".)
+	//
 	// If replace is non-nil, Child calls replace(x) where x is
 	// the current child inode with the given name. If possible,
 	// the child inode is replaced with the one returned by

commit f0079947e70efe61e98f8b0e58c894f7b045c306
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Apr 5 17:20:49 2018 -0400

    13111: Test /users/name and /users paths with cadaver.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/keep-web/cadaver_test.go b/services/keep-web/cadaver_test.go
index 843a8e8..0fc6e47 100644
--- a/services/keep-web/cadaver_test.go
+++ b/services/keep-web/cadaver_test.go
@@ -250,35 +250,8 @@ func (s *IntegrationSuite) testCadaver(c *check.C, password string, pathFunc fun
 
 		os.Remove(checkfile.Name())
 
-		cmd := exec.Command("cadaver", "http://"+s.testServer.Addr+trial.path)
-		if password != "" {
-			// cadaver won't try username/password
-			// authentication unless the server responds
-			// 401 to an unauthenticated request, which it
-			// only does in AttachmentOnlyHost,
-			// TrustAllContent, and per-collection vhost
-			// cases.
-			s.testServer.Config.AttachmentOnlyHost = s.testServer.Addr
-
-			cmd.Env = append(os.Environ(), "HOME="+tempdir)
-			f, err := os.OpenFile(filepath.Join(tempdir, ".netrc"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600)
-			c.Assert(err, check.IsNil)
-			_, err = fmt.Fprintf(f, "default login none password %s\n", password)
-			c.Assert(err, check.IsNil)
-			c.Assert(f.Close(), check.IsNil)
-		}
-		cmd.Stdin = bytes.NewBufferString(trial.cmd)
-		stdout, err := cmd.StdoutPipe()
-		c.Assert(err, check.Equals, nil)
-		cmd.Stderr = cmd.Stdout
-		go cmd.Start()
-
-		var buf bytes.Buffer
-		_, err = io.Copy(&buf, stdout)
-		c.Check(err, check.Equals, nil)
-		err = cmd.Wait()
-		c.Check(err, check.Equals, nil)
-		c.Check(buf.String(), check.Matches, trial.match)
+		stdout := s.runCadaver(c, password, trial.path, trial.cmd)
+		c.Check(stdout, check.Matches, trial.match)
 
 		if trial.data == nil {
 			continue
@@ -291,3 +264,54 @@ func (s *IntegrationSuite) testCadaver(c *check.C, password string, pathFunc fun
 		c.Check(err, check.IsNil)
 	}
 }
+
+func (s *IntegrationSuite) TestCadaverUsersDir(c *check.C) {
+	for _, path := range []string{"/users", "/users/"} {
+		stdout := s.runCadaver(c, arvadostest.ActiveToken, path, "ls")
+		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+active.*`)
+	}
+	for _, path := range []string{"/users/active", "/users/active/"} {
+		stdout := s.runCadaver(c, arvadostest.ActiveToken, path, "ls")
+		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+A Project\s+0 .*`)
+		c.Check(stdout, check.Matches, `(?ms).*Coll:\s+bar_file\s+0 .*`)
+	}
+	for _, path := range []string{"/users/admin", "/users/doesnotexist", "/users/doesnotexist/"} {
+		stdout := s.runCadaver(c, arvadostest.ActiveToken, path, "ls")
+		c.Check(stdout, check.Matches, `(?ms).*404 Not Found.*`)
+	}
+}
+
+func (s *IntegrationSuite) runCadaver(c *check.C, password, path, stdin string) string {
+	tempdir, err := ioutil.TempDir("", "keep-web-test-")
+	c.Assert(err, check.IsNil)
+	defer os.RemoveAll(tempdir)
+
+	cmd := exec.Command("cadaver", "http://"+s.testServer.Addr+path)
+	if password != "" {
+		// cadaver won't try username/password authentication
+		// unless the server responds 401 to an
+		// unauthenticated request, which it only does in
+		// AttachmentOnlyHost, TrustAllContent, and
+		// per-collection vhost cases.
+		s.testServer.Config.AttachmentOnlyHost = s.testServer.Addr
+
+		cmd.Env = append(os.Environ(), "HOME="+tempdir)
+		f, err := os.OpenFile(filepath.Join(tempdir, ".netrc"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600)
+		c.Assert(err, check.IsNil)
+		_, err = fmt.Fprintf(f, "default login none password %s\n", password)
+		c.Assert(err, check.IsNil)
+		c.Assert(f.Close(), check.IsNil)
+	}
+	cmd.Stdin = bytes.NewBufferString(stdin)
+	stdout, err := cmd.StdoutPipe()
+	c.Assert(err, check.Equals, nil)
+	cmd.Stderr = cmd.Stdout
+	go cmd.Start()
+
+	var buf bytes.Buffer
+	_, err = io.Copy(&buf, stdout)
+	c.Check(err, check.Equals, nil)
+	err = cmd.Wait()
+	c.Check(err, check.Equals, nil)
+	return buf.String()
+}

commit 0f0e585847ab5dae34bc66f981e361096a70e15e
Merge: ee4cf11 c4bd314
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Apr 5 16:14:35 2018 -0400

    13111: Merge branch 'master' into 13111-webdav-projects
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --cc services/keep-web/webdav.go
index 3e62b19,432c6af..5b23c9c
--- a/services/keep-web/webdav.go
+++ b/services/keep-web/webdav.go
@@@ -47,10 -47,7 +47,10 @@@ type webdavFS struct 
  }
  
  func (fs *webdavFS) makeparents(name string) {
 +	if !fs.writing {
 +		return
 +	}
- 	dir, name := path.Split(name)
+ 	dir, _ := path.Split(name)
  	if dir == "" || dir == "/" {
  		return
  	}

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list