13493: Merge branch 'master' into 13493-federation-proxy
authorTom Clegg <tclegg@veritasgenetics.com>
Fri, 20 Jul 2018 14:25:45 +0000 (10:25 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Fri, 20 Jul 2018 14:25:45 +0000 (10:25 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

78 files changed:
README.md
apps/workbench/Gemfile.lock
build/run-library.sh
doc/_config.yml
doc/_includes/_install_compute_docker.liquid
doc/_includes/_skip_sso_server_install.liquid [deleted file]
doc/install/copy_pipeline_from_curoverse.html.textile.liquid
doc/install/create-standard-objects.html.textile.liquid [deleted file]
doc/install/crunch2-slurm/install-slurm.html.textile.liquid
doc/install/index.html.textile.liquid
doc/install/install-arv-git-httpd.html.textile.liquid
doc/install/install-components.html.textile.liquid [new file with mode: 0644]
doc/install/install-keep-balance.html.textile.liquid
doc/install/install-keepproxy.html.textile.liquid
doc/install/install-keepstore.html.textile.liquid
doc/install/install-manual-prerequisites.html.textile.liquid
doc/install/install-nodemanager.html.textile.liquid
doc/start/getting_started/firstpipeline.html.textile.liquid
doc/user/cwl/cwl-runner.html.textile.liquid
doc/user/topics/arv-copy.html.textile.liquid
doc/user/tutorials/running-external-program.html.textile.liquid
sdk/R/R/Arvados.R
sdk/R/R/ArvadosFile.R
sdk/R/R/Collection.R
sdk/R/R/CollectionTree.R
sdk/R/R/HttpParser.R
sdk/R/R/HttpRequest.R
sdk/R/R/RESTService.R
sdk/R/R/Subcollection.R
sdk/R/R/autoGenAPI.R
sdk/R/tests/testthat/fakes/FakeHttpParser.R
sdk/R/tests/testthat/fakes/FakeHttpRequest.R
sdk/R/tests/testthat/fakes/FakeRESTService.R
sdk/R/tests/testthat/test-ArvadosFile.R
sdk/R/tests/testthat/test-Collection.R
sdk/R/tests/testthat/test-CollectionTree.R
sdk/R/tests/testthat/test-HttpParser.R
sdk/R/tests/testthat/test-HttpRequest.R
sdk/R/tests/testthat/test-RESTService.R
sdk/R/tests/testthat/test-Subcollection.R
sdk/R/tests/testthat/test-util.R
sdk/cli/arvados-cli.gemspec
sdk/go/dispatch/dispatch.go
sdk/go/httpserver/metrics.go [new file with mode: 0644]
services/api/Gemfile
services/api/Gemfile.lock
services/api/config/initializers/oj_mimic_json.rb [new file with mode: 0644]
services/api/config/initializers/time_format.rb
services/api/lib/safe_json.rb
services/api/test/test_helper.rb
services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
services/crunch-dispatch-slurm/squeue.go
services/crunch-dispatch-slurm/squeue_test.go
services/keep-web/doc.go
services/keep-web/handler.go
services/keep-web/handler_test.go
services/keep-web/server.go
services/keep-web/server_test.go
services/keepproxy/keepproxy_test.go
services/keepstore/config.go
services/keepstore/handlers.go
services/nodemanager/arvnodeman/computenode/dispatch/__init__.py
services/nodemanager/arvnodeman/computenode/driver/__init__.py
services/nodemanager/arvnodeman/computenode/driver/azure.py
services/nodemanager/arvnodeman/computenode/driver/dummy.py
services/nodemanager/arvnodeman/computenode/driver/ec2.py
services/nodemanager/arvnodeman/computenode/driver/gce.py
services/nodemanager/arvnodeman/config.py
services/nodemanager/arvnodeman/daemon.py
services/nodemanager/arvnodeman/jobqueue.py
services/nodemanager/arvnodeman/launcher.py
services/nodemanager/doc/azure.example.cfg
services/nodemanager/doc/ec2.example.cfg
services/nodemanager/doc/gce.example.cfg
services/nodemanager/tests/integration_test.py
services/nodemanager/tests/test_computenode_dispatch.py
services/nodemanager/tests/test_daemon.py
vendor/vendor.json

index c480ffda4cca9c5141e954c75bbc41c35fd67b67..12fdd219fc698226033e0283baec5a7ad087e920 100644 (file)
--- a/README.md
+++ b/README.md
@@ -19,9 +19,7 @@ Arvados consists of:
 
 ## Quick start
 
-Curoverse maintains an Arvados public cloud demo at
-[https://cloud.curoverse.com](https://cloud.curoverse.com).  A Google account
-is required to log in.
+Veritas Genetics maintains a public installation of Arvados for evaluation and trial use, the [Arvados Playground](https://playground.arvados.org). A Google account is required to log in.
 
 To try out Arvados on your local workstation, you can use Arvbox, which
 provides Arvados components pre-installed in a Docker container (requires
index 9c4cd678b0cf9aa38a110a32e1223586dceb0afb..06460ad06c1487d1d0c2e08978f36c644de95624 100644 (file)
@@ -186,7 +186,7 @@ GEM
       mini_portile2 (~> 2.3.0)
     npm-rails (0.2.1)
       rails (>= 3.2)
-    oj (3.5.0)
+    oj (3.6.4)
     os (0.9.6)
     passenger (5.2.1)
       rack
@@ -358,4 +358,4 @@ DEPENDENCIES
   wiselinks
 
 BUNDLED WITH
-   1.16.1
+   1.16.2
index 4b18d037b6b30655714ed174fad84b665ebe7f9f..c5a73cbe35a6116fdbed0b8f364f2af4f0e83df5 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/bash -xe
 # Copyright (C) The Arvados Authors. All rights reserved.
 #
 # SPDX-License-Identifier: AGPL-3.0
@@ -310,6 +310,7 @@ handle_rails_package() {
     cd "$srcdir"
     local license_path="$1"; shift
     local version="$(version_from_git)"
+    echo "$version" >package-build.version
     local scripts_dir="$(mktemp --tmpdir -d "$pkgname-XXXXXXXX.scripts")" && \
     (
         set -e
index e5e4719a682140cf22219fb143d3e3e9da56d93c..075111d921602bb1a959a2fedaa3bbc747ebb863 100644 (file)
@@ -165,15 +165,11 @@ navbar:
       - install/arvados-on-kubernetes.html.textile.liquid
     - Manual installation:
       - install/install-manual-prerequisites.html.textile.liquid
+      - install/install-components.html.textile.liquid
+    - Core:
       - install/install-postgresql.html.textile.liquid
-      - install/install-sso.html.textile.liquid
       - install/install-api-server.html.textile.liquid
-      - install/install-ws.html.textile.liquid
-      - install/install-arv-git-httpd.html.textile.liquid
-      - install/install-workbench-app.html.textile.liquid
-      - install/install-composer.html.textile.liquid
-      - install/install-shell-server.html.textile.liquid
-      - install/create-standard-objects.html.textile.liquid
+    - Keep:
       - install/install-keepstore.html.textile.liquid
       - install/configure-fs-storage.html.textile.liquid
       - install/configure-s3-object-storage.html.textile.liquid
@@ -181,6 +177,14 @@ navbar:
       - install/install-keepproxy.html.textile.liquid
       - install/install-keep-web.html.textile.liquid
       - install/install-keep-balance.html.textile.liquid
+    - User interface:
+      - install/install-sso.html.textile.liquid
+      - install/install-workbench-app.html.textile.liquid
+      - install/install-composer.html.textile.liquid
+    - Additional services:
+      - install/install-ws.html.textile.liquid
+      - install/install-shell-server.html.textile.liquid
+      - install/install-arv-git-httpd.html.textile.liquid
     - Containers API support on SLURM:
       - install/crunch2-slurm/install-prerequisites.html.textile.liquid
       - install/crunch2-slurm/install-slurm.html.textile.liquid
index 18347785cd07d018b66247af7a90807a6630e2ec..6a1a7318650ceeb0cfd83436b23c55120e759267 100644 (file)
@@ -49,3 +49,30 @@ On Red Hat-based systems, run:
 </notextile>
 
 Finally, reboot the system to make these changes effective.
+
+h2. Create a project for Docker images
+
+Here we create a default project for the standard Arvados Docker images, and give all users read access to it. The project is owned by the system user.
+
+<notextile>
+<pre><code>~$ <span class="userinput">project_uuid=`arv --format=uuid group create --group "{\"owner_uuid\":\"$prefix-tpzed-000000000000000\", \"name\":\"Arvados Standard Docker Images\"}"`</span>
+~$ <span class="userinput">echo "Arvados project uuid is '$project_uuid'"</span>
+~$ <span class="userinput">read -rd $'\000' newlink &lt;&lt;EOF; arv link create --link "$newlink"</span>
+<span class="userinput">{
+ "tail_uuid":"$all_users_group_uuid",
+ "head_uuid":"$project_uuid",
+ "link_class":"permission",
+ "name":"can_read"
+}
+EOF</span>
+</code></pre></notextile>
+
+h2. Download and tag the latest arvados/jobs docker image
+
+In order to start workflows from workbench, there needs to be Docker image tagged @arvados/jobs:latest@. The following command downloads the latest arvados/jobs image from Docker Hub, loads it into Keep, and tags it as 'latest'.  In this example @$project_uuid@ should be the the UUID of the "Arvados Standard Docker Images" project.
+
+<notextile>
+<pre><code>~$ <span class="userinput">arv-keepdocker --project-uuid $project_uuid --pull arvados/jobs latest</span>
+</code></pre></notextile>
+
+If the image needs to be downloaded from Docker Hub, the command can take a few minutes to complete, depending on available network bandwidth.
diff --git a/doc/_includes/_skip_sso_server_install.liquid b/doc/_includes/_skip_sso_server_install.liquid
deleted file mode 100644 (file)
index eafa4cc..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{% comment %}
-Copyright (C) The Arvados Authors. All rights reserved.
-
-SPDX-License-Identifier: CC-BY-SA-3.0
-{% endcomment %}
-
-<div class="alert alert-block alert-info">
-  <button type="button" class="close" data-dismiss="alert">&times;</button>
-  <h4>Note!</h4>
-  <p>The SSO server codebase currently uses OpenID 2.0 to talk to Google's authentication service. Google <a href="https://developers.google.com/accounts/docs/OpenID2">has deprecated that protocol</a>. This means that new clients will not be allowed to talk to Google's authentication services anymore over OpenID 2.0, and they will phase out the use of OpenID 2.0 completely in the coming monts. We are working on upgrading the SSO server codebase to a newer protocol. That work should be complete by the end of November 2014. In the mean time, anyone is free to use the existing Curoverse SSO server for any local Arvados installation. Instructions to do so are provided on the "API server":install-api-server.html page.</p>
-  <p><strong>Recommendation: skip this step</strong></p>
-</div>
index 4961a05b56f025fc18d58f3b8ce95ee977285d58..fa497c93de484e1a5ab094d2914cf802ffb6c6bd 100644 (file)
@@ -1,7 +1,7 @@
 ---
 layout: default
 navsection: installguide
-title: Copy pipeline from Curoverse cloud
+title: Copy pipeline from the Arvados Playground
 ...
 {% comment %}
 Copyright (C) The Arvados Authors. All rights reserved.
@@ -9,27 +9,27 @@ Copyright (C) The Arvados Authors. All rights reserved.
 SPDX-License-Identifier: CC-BY-SA-3.0
 {% endcomment %}
 
-This tutorial describes how to find and copy a publicly shared pipeline from Curoverse cloud. Please note that you can use similar steps to copy any template you can access from Curoverse cloud to your cluster.
+This tutorial describes how to find and copy a publicly shared pipeline from the Arvados Playground. Please note that you can use similar steps to copy any template you can access from the Arvados Playground to your cluster.
 
-h3. Access a public pipeline in Curoverse cloud using Workbench
+h3. Access a public pipeline in the Arvados Playground using Workbench
 
-Curoverse cloud provides access to some public data, which can be used to experience Arvados in action. Let's access a public pipeline and copy it to your cluster, so that you can run it in your environment.
+the Arvados Playground provides access to some public data, which can be used to experience Arvados in action. Let's access a public pipeline and copy it to your cluster, so that you can run it in your environment.
 
-Start by visiting the "*Curoverse public projects page*":https://cloud.curoverse.com/projects/public. This page lists all the publicly accessible projects in this arvados installation. Click on one of these projects to open it. We will use "*lobSTR v.3 (Public)*":https://cloud.curoverse.com/projects/qr1hi-j7d0g-up6qgpqz5ie2vfq as the example in this tutorial.
+Start by visiting the "*Arvados Playground public projects page*":https://playground.arvados.org/projects/public. This page lists all the publicly accessible projects in this arvados installation. Click on one of these projects to open it. We will use "*lobSTR v.3 (Public)*":https://playground.arvados.org/projects/qr1hi-j7d0g-up6qgpqz5ie2vfq as the example in this tutorial.
 
-Once in the "*lobSTR v.3 (Public)*":https://cloud.curoverse.com/projects/qr1hi-j7d0g-up6qgpqz5ie2vfq project, click on the *Pipeline templates* tab. In the pipeline templates tab, you will see a template named *lobSTR v.3*. Click on the <span class="fa fa-lg fa-gears"></span> *Show* button to the left of this name. This will take to you to the "*lobSTR v.3*":https://cloud.curoverse.com/pipeline_templates/qr1hi-p5p6p-9pkaxt6qjnkxhhu template page.
+Once in the "*lobSTR v.3 (Public)*":https://playground.arvados.org/projects/qr1hi-j7d0g-up6qgpqz5ie2vfq project, click on the *Pipeline templates* tab. In the pipeline templates tab, you will see a template named *lobSTR v.3*. Click on the <span class="fa fa-lg fa-gears"></span> *Show* button to the left of this name. This will take to you to the "*lobSTR v.3*":https://playground.arvados.org/pipeline_templates/qr1hi-p5p6p-9pkaxt6qjnkxhhu template page.
 
 Once in this page, you can take the *uuid* of this template from the address bar, which is *qr1hi-p5p6p-9pkaxt6qjnkxhhu*. Next, we will copy this template to your Arvados instance.
 
-h3. Copying a pipeline template from Curoverse cloud to your cluster
+h3. Copying a pipeline template from the Arvados Playground to your cluster
 
-As described above, navigate to the publicly shared pipeline template "*lobSTR v.3*":https://cloud.curoverse.com/pipeline_templates/qr1hi-p5p6p-9pkaxt6qjnkxhhu using Curoverse Workbench.  We will now copy this template with uuid *qr1hi-p5p6p-9pkaxt6qjnkxhhu* to your cluster.
+As described above, navigate to the publicly shared pipeline template "*lobSTR v.3*":https://playground.arvados.org/pipeline_templates/qr1hi-p5p6p-9pkaxt6qjnkxhhu on the Arvados Playground.  We will now copy this template with uuid *qr1hi-p5p6p-9pkaxt6qjnkxhhu* to your cluster.
 
 {% include 'tutorial_expectations' %}
 
 We will use the Arvados *arv-copy* command to copy this template to your cluster. In order to use arv-copy, first you need to setup the source and destination cluster configuration files. Here, *qr1hi* would be the source cluster and your Arvados instance would be the *dst_cluster*.
 
-During this setup, if you have an account in Curoverse cloud, you can use "your access token":#using-your-token to create the source configuration file. If you do not have an account in Curoverse cloud, you can use the "anonymous access token":#using-anonymous-token for the source cluster configuration.
+During this setup, if you have an account in the Arvados Playground, you can use "your access token":#using-your-token to create the source configuration file. If you do not have an account in the Arvados Playground, you can use the "anonymous access token":#using-anonymous-token for the source cluster configuration.
 
 h4(#using-anonymous-token). *Configuring source and destination setup files using anonymous access token*
 
@@ -53,7 +53,7 @@ You can now copy the pipeline template from *qr1hi* to *your cluster*. Replace *
 
 h4(#using-your-token). *Configuring source and destination setup files using personal access token*
 
-If you already have an account in Curoverse cloud, you can follow the instructions in the "*Using arv-copy*":http://doc.arvados.org/user/topics/arv-copy.html user guide to get your *Current token* for source and destination clusters, and use them to create the source *qr1hi.conf* and dst_cluster.conf configuration files.
+If you already have an account in the Arvados Playground, you can follow the instructions in the "*Using arv-copy*":http://doc.arvados.org/user/topics/arv-copy.html user guide to get your *Current token* for source and destination clusters, and use them to create the source *qr1hi.conf* and dst_cluster.conf configuration files.
 
 You can now copy the pipeline template from *qr1hi* to *your cluster* with or without recursion. Replace *dst_cluster* with the *uuid_prefix* of your cluster.
 
diff --git a/doc/install/create-standard-objects.html.textile.liquid b/doc/install/create-standard-objects.html.textile.liquid
deleted file mode 100644 (file)
index 8ac3fb0..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
----
-layout: default
-navsection: installguide
-title: Create standard objects
-
-...
-{% comment %}
-Copyright (C) The Arvados Authors. All rights reserved.
-
-SPDX-License-Identifier: CC-BY-SA-3.0
-{% endcomment %}
-
-In these steps we use the Arvados CLI tools on the <strong>shell server</strong> to create a few Arvados objects. The CLI tools require an ARVADOS_API_TOKEN environment variable with a valid admin token. If you haven't already done so, set that up as shown in the "API token guide":../user/reference/api-tokens.html.
-
-h3. Arvados repository
-
-Here we create a repository object which will be used to set up a hosted clone of the arvados repository on this cluster.
-
-<notextile>
-<pre><code>~$ <span class="userinput">prefix=`arv --format=uuid user current | cut -d- -f1`</span>
-~$ <span class="userinput">echo "Site prefix is '$prefix'"</span>
-~$ <span class="userinput">all_users_group_uuid="$prefix-j7d0g-fffffffffffffff"</span>
-~$ <span class="userinput">repo_uuid=`arv --format=uuid repository create --repository "{\"owner_uuid\":\"$prefix-tpzed-000000000000000\", \"name\":\"arvados\"}"`</span>
-~$ <span class="userinput">echo "Arvados repository uuid is '$repo_uuid'"</span>
-</code></pre></notextile>
-
-Create a link object to make the repository object readable by the "All users" group, and therefore by every active user. This makes it possible for users to run the bundled Crunch scripts by specifying @"script_version":"master","repository":"arvados"@ rather than pulling the Arvados source tree into their own repositories.
-
-<notextile>
-<pre><code>~$ <span class="userinput">read -rd $'\000' newlink &lt;&lt;EOF; arv link create --link "$newlink"</span>
-<span class="userinput">{
- "tail_uuid":"$all_users_group_uuid",
- "head_uuid":"$repo_uuid",
- "link_class":"permission",
- "name":"can_read"
-}
-EOF</span>
-</code></pre></notextile>
-
-In a couple of minutes, your arvados-git-sync cron job will create an empty repository on your git server. Seed it with the real arvados repository. If your git credential helpers were configured correctly when you "set up your shell server":install-shell-server.html, the "git push" command will use your API token instead of prompting you for a username and password.
-
-<notextile>
-<pre><code>~$ <span class="userinput">cd /tmp</span>
-/tmp$ <span class="userinput">git clone --bare https://github.com/curoverse/arvados.git</span>
-/tmp <span class="userinput">git --git-dir arvados.git push https://git.<b>uuid_prefix.your.domain</b>/arvados.git '*:*'</span>
-</code></pre>
-</notextile>
-
-If you did not set up a HTTPS service, you can push to <code>git@git.uuid_prefix.your.domain:arvados.git</code> using your SSH key, or by logging in to your git server and using sudo.
-
-<notextile>
-<pre><code>gitserver:~$ <span class="userinput">sudo -u git -i bash</span>
-git@gitserver:~$ <span class="userinput">git clone --bare https://github.com/curoverse/arvados.git /tmp/arvados.git</span>
-git@gitserver:~$ <span class="userinput">cd /tmp/arvados.git</span>
-git@gitserver:/tmp/arvados.git$ <span class="userinput">gitolite push /var/lib/arvados/git/repositories/<b>your_arvados_repo_uuid</b>.git '*:*'</span>
-</code></pre>
-</notextile>
-
-h3. Default project for docker images
-
-Here we create a default project for the standard Arvados Docker images, and give all users read access to it. The project is owned by the system user.
-
-<notextile>
-<pre><code>~$ <span class="userinput">project_uuid=`arv --format=uuid group create --group "{\"owner_uuid\":\"$prefix-tpzed-000000000000000\", \"name\":\"Arvados Standard Docker Images\"}"`</span>
-~$ <span class="userinput">echo "Arvados project uuid is '$project_uuid'"</span>
-~$ <span class="userinput">read -rd $'\000' newlink &lt;&lt;EOF; arv link create --link "$newlink"</span>
-<span class="userinput">{
- "tail_uuid":"$all_users_group_uuid",
- "head_uuid":"$project_uuid",
- "link_class":"permission",
- "name":"can_read"
-}
-EOF</span>
-</code></pre></notextile>
-
-h3. Download and tag the latest arvados/jobs docker image
-
-The @arvados-cwl-runner@ needs access to an arvados/jobs image that is tagged as 'latest'. The following command downloads the latest arvados/jobs image from Docker Hub, loads it into Keep, and tags it as 'latest'.
-
-<notextile>
-<pre><code>~$ <span class="userinput">arv-keepdocker --pull arvados/jobs latest</span>
-</code></pre></notextile>
-
-If the image needs to be downloaded from Docker Hub, the command can take a few minutes to complete, depending on available network bandwidth.
index c69d18b8e4bd2b0b8e3a19802982fdc284eb0e42..e1593a430a9f89b369e1c67e73f41a6705aa6ce4 100644 (file)
@@ -9,8 +9,6 @@ Copyright (C) The Arvados Authors. All rights reserved.
 SPDX-License-Identifier: CC-BY-SA-3.0
 {% endcomment %}
 
-h2(#slurm). Set up SLURM
-
 On the API server, install SLURM and munge, and generate a munge key.
 
 On Debian-based systems:
index a47d30ac153c1924af59f916dbb3fc2afbf2d7b0..c31b2ed43c89b92b5ef8c5c15c8abdd4dd185cbe 100644 (file)
@@ -9,19 +9,19 @@ Copyright (C) The Arvados Authors. All rights reserved.
 SPDX-License-Identifier: CC-BY-SA-3.0
 {% endcomment %}
 
-Arvados components run on GNU/Linux systems, and do not depend on any particular cloud operating stack.  Arvados supports Debian and derivatives such as Ubuntu, as well as Red Hat and derivatives such as CentOS.
+Arvados components run on GNU/Linux systems, and supports multiple cloud operating stacks.  Arvados supports Debian and derivatives such as Ubuntu, as well as Red Hat and derivatives such as CentOS.
 
 Arvados components can be installed and configured in a number of different ways.
 
 <div class="offset1">
 table(table table-bordered table-condensed).
-||||\6=. _Appropriate for_|
-||_Ease of installation_|_Multiuser/Networked_|_Workflow Development_|_Workflow Testing_|_Large Scale Production_|_Developing Arvados_|_Arvados Software Development Testing_|
-|"Arvados-in-a-box":arvbox.html (arvbox)|Easy|no|no|no|no|yes|yes|
-|"Arvados on Kubernetes":arvados-on-kubernetes.html|Easy ^1^|yes|no ^2^|no ^2^|no ^2^|no|yes|
-|"Manual installation":install-manual-prerequisites.html|Complex|yes|yes|yes|yes|no|no|
-|"Cloud demo":https://cloud.curoverse.com by Veritas Genetics|N/A ^3^|yes|no|no|no|no|no|
-|"Cluster Operation Subscription":https://curoverse.com/products by Veritas Genetics|N/A ^3^|yes|yes|yes|yes|yes|yes|
+|||\5=. Appropriate for|
+||_. Ease of setup|_. Multiuser/networked access|_. Workflow Development and Testing|_. Large Scale Production|_. Development of Arvados|_. Arvados System Testing|
+|"Arvados-in-a-box":arvbox.html (arvbox)|Easy|no|yes|no|yes|yes|
+|"Arvados on Kubernetes":arvados-on-kubernetes.html|Easy ^1^|yes|yes ^2^|no ^2^|no|yes|
+|"Manual installation":install-manual-prerequisites.html|Complicated|yes|yes|yes|no|no|
+|"Arvados Playground":https://playground.arvados.org hosted by Veritas Genetics|N/A ^3^|yes|yes|no|no|no|
+|"Cluster Operation Subscription":https://curoverse.com/products supported by Veritas Genetics|N/A ^3^|yes|yes|yes|yes|yes|
 </div>
 
 * ^1^ Assumes a Kubernetes cluster is available
index 2a4d103c7bfd84ea9ecead8515715edd664fcd4d..7f39bf51d2ebafcde977f03890a56d75c49943ee 100644 (file)
@@ -19,6 +19,7 @@ The git hosting setup involves three components.
 It is not strictly necessary to deploy _both_ SSH and HTTPS access, but we recommend deploying both:
 * SSH is a more appropriate way to authenticate from a user's workstation because it does not require managing tokens on the client side;
 * HTTPS is a more appropriate way to authenticate from a shell VM because it does not depend on SSH agent forwarding (SSH clients' agent forwarding features tend to behave as if the remote machine is fully trusted).
+* HTTPS is also used by Arvados Composer to access git repositories from the browser.
 
 The HTTPS instructions given below will not work if you skip the SSH setup steps.
 
@@ -338,3 +339,47 @@ Restart Nginx to make the Nginx and API server configuration changes take effect
 <pre><code>gitserver:~$ <span class="userinput">sudo nginx -s reload</span>
 </code></pre>
 </notextile>
+
+h2. Clone Arvados repository
+
+Here we create a repository object which will be used to set up a hosted clone of the arvados repository on this cluster.
+
+<notextile>
+<pre><code>~$ <span class="userinput">prefix=`arv --format=uuid user current | cut -d- -f1`</span>
+~$ <span class="userinput">echo "Site prefix is '$prefix'"</span>
+~$ <span class="userinput">all_users_group_uuid="$prefix-j7d0g-fffffffffffffff"</span>
+~$ <span class="userinput">repo_uuid=`arv --format=uuid repository create --repository "{\"owner_uuid\":\"$prefix-tpzed-000000000000000\", \"name\":\"arvados\"}"`</span>
+~$ <span class="userinput">echo "Arvados repository uuid is '$repo_uuid'"</span>
+</code></pre></notextile>
+
+Create a link object to make the repository object readable by the "All users" group, and therefore by every active user. This makes it possible for users to run the bundled Crunch scripts by specifying @"script_version":"master","repository":"arvados"@ rather than pulling the Arvados source tree into their own repositories.
+
+<notextile>
+<pre><code>~$ <span class="userinput">read -rd $'\000' newlink &lt;&lt;EOF; arv link create --link "$newlink"</span>
+<span class="userinput">{
+ "tail_uuid":"$all_users_group_uuid",
+ "head_uuid":"$repo_uuid",
+ "link_class":"permission",
+ "name":"can_read"
+}
+EOF</span>
+</code></pre></notextile>
+
+In a couple of minutes, your arvados-git-sync cron job will create an empty repository on your git server. Seed it with the real arvados repository. If your git credential helpers were configured correctly when you "set up your shell server":install-shell-server.html, the "git push" command will use your API token instead of prompting you for a username and password.
+
+<notextile>
+<pre><code>~$ <span class="userinput">cd /tmp</span>
+/tmp$ <span class="userinput">git clone --bare https://github.com/curoverse/arvados.git</span>
+/tmp <span class="userinput">git --git-dir arvados.git push https://git.<b>uuid_prefix.your.domain</b>/arvados.git '*:*'</span>
+</code></pre>
+</notextile>
+
+If you did not set up a HTTPS service, you can push to <code>git@git.uuid_prefix.your.domain:arvados.git</code> using your SSH key, or by logging in to your git server and using sudo.
+
+<notextile>
+<pre><code>gitserver:~$ <span class="userinput">sudo -u git -i bash</span>
+git@gitserver:~$ <span class="userinput">git clone --bare https://github.com/curoverse/arvados.git /tmp/arvados.git</span>
+git@gitserver:~$ <span class="userinput">cd /tmp/arvados.git</span>
+git@gitserver:/tmp/arvados.git$ <span class="userinput">gitolite push /var/lib/arvados/git/repositories/<b>your_arvados_repo_uuid</b>.git '*:*'</span>
+</code></pre>
+</notextile>
diff --git a/doc/install/install-components.html.textile.liquid b/doc/install/install-components.html.textile.liquid
new file mode 100644 (file)
index 0000000..b21c4bd
--- /dev/null
@@ -0,0 +1,28 @@
+---
+layout: default
+navsection: installguide
+title: Choosing which components to install
+...
+
+Arvados consists of many components, some of which may be omitted (at the cost of reduced functionality.)  It may also be helpful to review the "Arvados Architecture":{{site.baseurl}}/architecture to understand how these components interact.
+
+table(table table-bordered table-condensed).
+|\3=. *Core*|
+|"Postgres database":install-postgresql.html |Stores data for the API server.|Required.|
+|"API server":install-api-server.html |Core Arvados logic for managing users, groups, collections, containers, and enforcing permissions.|Required.|
+|\3=. *Keep (storage)*|
+|"Keepstore":install-keepstore.html |Stores content-addressed blocks in a variety of backends (local filesystem, cloud object storage).|Required.|
+|"Keepproxy":install-keepproxy.html |Gateway service to access keep servers from external networks.|Required to be able to use arv-put, arv-get, or arv-mount outside the private Arvados network.|
+|"Keep-web":install-keep-web.html |Gateway service providing read/write HTTP and WebDAV support on top of Keep.|Required to be able to download files from Keep over plain HTTP in Workbench.|
+|"Keep-balance":install-keep-balance.html |Storage cluster maintenance daemon responsible for moving blocks to their optimal server location, adjusting block replication levels, and trashing unreferenced blocks.|Required to free deleted data from underlying storage, and to ensure proper replication and block distribution (including support for storage classes).|
+|\3=. *User interface*|
+|"Single Sign On server":install-sso.html |Login server.|Required for web based login to Workbench.|
+|"Workbench":install-workbench-app.html |Primary graphical user interface for working with file collections and running containers.|Optional.  Depends on API server, SSO server, keep-web, websockets server.|
+|"Workflow Composer":install-composer.html |Graphical user interface for editing Common Workflow Language workflows.|Optional.  Depends on git server (arv-git-httpd).|
+|\3=. *Additional services*|
+|"Websockets server":install-ws.html |Event distribution server.|Required to view streaming container logs in Workbench.|
+|"Shell server":install-shell-server.html |Synchronize (create/delete/configure) Unix shell accounts with Arvados users.|Optional.|
+|"Git server":install-arv-git-httpd.html |Arvados-hosted git repositories, with Arvados-token based authentication.|Optional, but required by Workflow Composer.|
+|\3=. *Crunch (running containers)*|
+|"crunch-dispatch-slurm":crunch2-slurm/install-prerequisites.html |Run analysis workflows using Docker containers distributed across a SLURM cluster.|Optional if you wish to use Arvados for data management only.|
+|"Node Manager":install-nodemanager.html |Allocate and free cloud VM instances on demand based on workload.|Optional, not needed for a static SLURM cluster (such as on-premise HPC).|
index 4c735a1eec1ec286b2652f6ee5282920c48cc797..3a8dce078dd092bfe687639f912415b2553bf14c 100644 (file)
@@ -57,12 +57,7 @@ h3. Create a keep-balance token
 
 Create an Arvados superuser token for use by keep-balance. *On the API server*, run:
 
-<notextile>
-<pre><code>apiserver:~$ <span class="userinput">cd /var/www/arvados-api/current</span>
-apiserver:/var/www/arvados-api/current$ <span class="userinput">sudo -u <b>webserver-user</b> RAILS_ENV=production bundle exec script/create_superuser_token.rb</span>
-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
-</code></pre>
-</notextile>
+{% include 'create_superuser_token' %}
 
 h3. Update keepstore configuration files
 
index fe690a5eda8880b67f21fca6c2242e8bf62afead..9f580c0f8b2af0f0244c1ae1570c4346d33cd6ac 100644 (file)
@@ -103,7 +103,18 @@ Note: if the Web uploader is failing to upload data and there are no logs from k
 
 h3. Tell the API server about the Keepproxy server
 
-The API server needs to be informed about the presence of your Keepproxy server. Please execute the following commands on your <strong>shell server</strong>.
+The API server needs to be informed about the presence of your Keepproxy server.
+
+First, if you don't already have an admin token, create a superuser token:
+
+{% include 'create_superuser_token' %}
+
+Configure your environment to run @arv@ using the output of create_superuser_token.rb:
+
+<pre>
+export ARVADOS_API_HOST=zzzzz.example.com
+export ARVADOS_API_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+</pre>
 
 <notextile>
 <pre><code>~$ <span class="userinput">uuid_prefix=`arv --format=uuid user current | cut -d- -f1`</span>
@@ -117,3 +128,13 @@ The API server needs to be informed about the presence of your Keepproxy server.
 }
 EOF</span>
 </code></pre></notextile>
+
+h3. Testing keepproxy
+
+Log into a host that is on an external network from your private Arvados network.  The host should be able to contact your keepproxy server (eg keep.$uuid_prefix.arvadosapi.com), but not your keepstore servers (eg keep[0-9].$uuid_prefix.arvadosapi.com).
+
+Install the "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html
+
+@ARVADOS_API_HOST@ and @ARVADOS_API_TOKEN@ must be set in the environment.
+
+You should now be able to use @arv-put@ to upload collections and @arv-get@ to fetch collections, for an example see "Testing keep.":install-keepstore.html#testing on the keepstore install page.
index 750b7a47ef184ecaa91536dd098e3b3b0891562b..64a710f9126fe7aa905817b3fb1fae162407a603 100644 (file)
@@ -198,19 +198,52 @@ Repeat the above sections to prepare volumes and bring up supervised services on
 
 h3. Tell the API server about the Keepstore servers
 
-The API server needs to be informed about the presence of your Keepstore servers. For each of the Keepstore servers you have created, please execute the following commands on your <strong>shell server</strong>.
+The API server needs to be informed about the presence of your Keepstore servers.
 
-Make sure to update the @service_host@ value to match each of your Keepstore servers.
+First, if you don't already have an admin token, create a superuser token:
+
+{% include 'create_superuser_token' %}
+
+Configure your environment to run @arv@ using the output of create_superuser_token.rb:
+
+<pre>
+export ARVADOS_API_HOST=zzzzz.example.com
+export ARVADOS_API_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+</pre>
+
+Use this command to register each keepstore server you have installed.  Make sure to update the @service_host@ value.
 
 <notextile>
 <pre><code>~$ <span class="userinput">prefix=`arv --format=uuid user current | cut -d- -f1`</span>
 ~$ <span class="userinput">echo "Site prefix is '$prefix'"</span>
 ~$ <span class="userinput">read -rd $'\000' keepservice &lt;&lt;EOF; arv keep_service create --keep-service "$keepservice"</span>
 <span class="userinput">{
- "service_host":"<strong>keep0.$prefix.your.domain</strong>",
+ "service_host":"<strong>keep0.$uuid_prefix.your.domain</strong>",
  "service_port":25107,
  "service_ssl_flag":false,
  "service_type":"disk"
 }
 EOF</span>
 </code></pre></notextile>
+
+h3(#testing). Testing keep
+
+Install the "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html
+
+@ARVADOS_API_HOST@ and @ARVADOS_API_TOKEN@ must be set in the environment.
+
+You should now be able to use @arv-put@ to upload collections and @arv-get@ to fetch collections:
+
+<pre>
+$ echo "hello world!" > hello.txt
+
+$ arv-put --portable-data-hash hello.txt
+2018-07-12 13:35:25 arvados.arv_put[28702] INFO: Creating new cache file at /home/example/.cache/arvados/arv-put/1571ec0adb397c6a18d5c74cc95b3a2a
+0M / 0M 100.0% 2018-07-12 13:35:27 arvados.arv_put[28702] INFO:
+
+2018-07-12 13:35:27 arvados.arv_put[28702] INFO: Collection saved as 'Saved at 2018-07-12 17:35:25 UTC by example@example'
+59389a8f9ee9d399be35462a0f92541c+53
+
+$ arv-get 59389a8f9ee9d399be35462a0f92541c+53/hello.txt
+hello world!
+</pre>
index 7b1b24e1445d59ac15d1205988d06814eab950eb..e0cc4b8581e65a1a38292f1953418db394f92bee 100644 (file)
@@ -19,7 +19,7 @@ This guide assumes you have seven systems available in the same network subnet:
 
 <div class="offset1">
 table(table table-bordered table-condensed).
-|_Function_|_Number of nodes_|
+|_. Function|_. Number of nodes|
 |Arvados API, Crunch dispatcher, Git, Websockets and Workbench|1|
 |Arvados Compute node|1|
 |Arvados Keepproxy and Keep-web server|1|
@@ -33,7 +33,7 @@ The number of Keepstore, shell and compute nodes listed above is a minimum. In a
 h2. Supported GNU/Linux distributions
 
 table(table table-bordered table-condensed).
-|_Distribution_|_State_|_Last supported version_|
+|_. Distribution|_. State|_. Last supported version|
 |CentOS 7|Supported|Latest|
 |Debian 8 ("jessie")|Supported|Latest|
 |Debian 9 ("stretch")|Supported|Latest|
@@ -73,7 +73,7 @@ First, register the Curoverse signing key in apt's database:
 Configure apt to retrieve packages from the Arvados package repository. This command depends on your OS vendor and version:
 
 table(table table-bordered table-condensed).
-|OS version|Command|
+|_. OS version|_. Command|
 |Debian 8 ("jessie")|<notextile><code><span class="userinput">echo "deb http://apt.arvados.org/ jessie main" &#x7c; sudo tee /etc/apt/sources.list.d/arvados.list</span></code></notextile>|
 |Debian 9 ("stretch")|<notextile><code><span class="userinput">echo "deb http://apt.arvados.org/ stretch main" &#x7c; sudo tee /etc/apt/sources.list.d/arvados.list</span></code></notextile>|
 |Ubuntu 14.04 ("trusty")[1]|<notextile><code><span class="userinput">echo "deb http://apt.arvados.org/ trusty main" &#x7c; sudo tee /etc/apt/sources.list.d/arvados.list</span></code></notextile>|
@@ -128,7 +128,7 @@ By convention, we use the following hostname pattern:
 
 <div class="offset1">
 table(table table-bordered table-condensed).
-|_Function_|_Hostname_|
+|_. Function|_. Hostname|
 |Arvados API|@uuid_prefix@.your.domain|
 |Arvados Git server|git.@uuid_prefix@.your.domain|
 |Arvados Keepproxy server|keep.@uuid_prefix@.your.domain|
index 9ee6722a07fa8b71be4b120e431b49f95635d881..defec2589e82a3f32266f39e500c54401ee57683 100644 (file)
@@ -11,7 +11,7 @@ SPDX-License-Identifier: CC-BY-SA-3.0
 
 Arvados Node Manager provides elastic computing for Arvados and SLURM by creating and destroying virtual machines on demand.  Node Manager currently supports Amazon Web Services (AWS), Google Cloud Platform (GCP) and Microsoft Azure.
 
-Note: node manager is only required for elastic computing cloud environments.  Fixed size clusters do not require node manager.
+Note: node manager is only required for elastic computing cloud environments.  Fixed size clusters (such as on-premise HPC) do not require node manager.
 
 h2. Install
 
@@ -113,6 +113,15 @@ boot_fail_after = 1800
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
@@ -282,6 +291,15 @@ poll_stale_after = 600
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
@@ -470,6 +488,15 @@ boot_fail_after = 1800
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
index 53adcd5c1c727ac56ccf771755ef5feea9d6bcef..43369a3bbfc230f3bf95a55923211dc24566c606 100644 (file)
@@ -11,7 +11,7 @@ SPDX-License-Identifier: CC-BY-SA-3.0
 
 h2. LobSTR v3 
 
-In this quickstart guide, we'll run an existing pipeline with pre-existing data. Step-by-step instructions are shown below. You can follow along using your own local install or by using Curoverse's <a href="http://lp.curoverse.com/beta-signup/">hosted version of Arvados</a> (in public beta, any Google account can be used to login).
+In this quickstart guide, we'll run an existing pipeline with pre-existing data. Step-by-step instructions are shown below. You can follow along using your own local install or by using the <a href="https://playground.arvados.org/">Arvados Playground</a> (any Google account can be used to log in).
 
 (For more information about this pipeline, see our <a href="https://dev.arvados.org/projects/arvados/wiki/LobSTR_tutorial">detailed lobSTR guide</a>).
 
index 2319b3cb81f8a85046be6d103fc92efe8ac0b1d8..ad5d3bd83643e6d9134dbfddddfdf2209be66140 100644 (file)
@@ -33,7 +33,7 @@ The tutorial files are located in the "documentation section of the Arvados sour
 </code></pre>
 </notextile>
 
-The tutorial data is hosted on "https://cloud.curoverse.com":https://cloud.curoverse.com (also referred to by the identifier *qr1hi*).  If you are using a different Arvados instance, you may need to copy the data to your own instance.  The easiest way to do this is with "arv-copy":{{site.baseurl}}/user/topics/arv-copy.html (this requires signing up for a free cloud.curoverse.com account).
+The tutorial data is hosted on "https://playground.arvados.org":https://playground.arvados.org (also referred to by the identifier *qr1hi*).  If you are using a different Arvados instance, you may need to copy the data to your own instance.  The easiest way to do this is with "arv-copy":{{site.baseurl}}/user/topics/arv-copy.html (this requires signing up for a free playground.arvados.org account).
 
 <notextile>
 <pre><code>~$ <span class="userinput">arv-copy --src qr1hi --dst settings 2463fa9efeb75e099685528b3b9071e0+438</span>
@@ -42,13 +42,13 @@ The tutorial data is hosted on "https://cloud.curoverse.com":https://cloud.curov
 </code></pre>
 </notextile>
 
-If you do not wish to create an account on "https://cloud.curoverse.com":https://cloud.curoverse.com, you may download the files anonymously and upload them to your local Arvados instance:
+If you do not wish to create an account on "https://playground.arvados.org":https://playground.arvados.org, you may download the files anonymously and upload them to your local Arvados instance:
 
-"https://cloud.curoverse.com/collections/2463fa9efeb75e099685528b3b9071e0+438":https://cloud.curoverse.com/collections/2463fa9efeb75e099685528b3b9071e0+438
+"https://playground.arvados.org/collections/2463fa9efeb75e099685528b3b9071e0+438":https://playground.arvados.org/collections/2463fa9efeb75e099685528b3b9071e0+438
 
-"https://cloud.curoverse.com/collections/ae480c5099b81e17267b7445e35b4bc7+180":https://cloud.curoverse.com/collections/ae480c5099b81e17267b7445e35b4bc7+180
+"https://playground.arvados.org/collections/ae480c5099b81e17267b7445e35b4bc7+180":https://playground.arvados.org/collections/ae480c5099b81e17267b7445e35b4bc7+180
 
-"https://cloud.curoverse.com/collections/655c6cd07550151b210961ed1d3852cf+57":https://cloud.curoverse.com/collections/655c6cd07550151b210961ed1d3852cf+57
+"https://playground.arvados.org/collections/655c6cd07550151b210961ed1d3852cf+57":https://playground.arvados.org/collections/655c6cd07550151b210961ed1d3852cf+57
 
 h2. Submitting a workflow to an Arvados cluster
 
index 74868bcab4a0b76d44cbd43eee0c2c89d73b0311..f1adfe28545fe235ddd64e0eed882c7a84966e88 100644 (file)
@@ -21,7 +21,7 @@ h2. arv-copy
 
 @arv-copy@ allows users to copy collections and pipeline templates from one cluster to another. By default, @arv-copy@ will recursively go through a template and copy all dependencies associated with the object.
 
-For example, let's copy from the <a href="https://cloud.curoverse.com/">cloud instance *qr1hi*</a> to *dst_cluster*. The names *qr1hi* and *dst_cluster* are interchangable with any cluster name. You can find the cluster name from the prefix of the uuid of the object you want to copy. For example, in *qr1hi*-4zz18-tci4vn4fa95w0zx, the cluster name is qr1hi.
+For example, let's copy from the <a href="https://playground.arvados.org/">Arvados playground</a>, also known as *qr1hi*, to *dst_cluster*. The names *qr1hi* and *dst_cluster* are interchangable with any cluster name. You can find the cluster name from the prefix of the uuid of the object you want to copy. For example, in *qr1hi*-4zz18-tci4vn4fa95w0zx, the cluster name is qr1hi.
 
 In order to communicate with both clusters, you must create custom configuration files for each cluster. In the Arvados Workbench, click on the dropdown menu icon <span class="fa fa-lg fa-user"></span> <span class="caret"></span> in the upper right corner of the top navigation menu to access the user settings menu, and click on the menu item *Current token*. Copy the @ARVADOS_API_HOST@ and @ARVADOS_API_TOKEN@ in both of your clusters. Then, create two configuration files, one for each cluster. The names of the files must have the format of *uuid_prefix.conf*. In our example, let's make two files, one for *qr1hi* and one for *dst_cluster*. From your *Current token* page in *qr1hi* and *dst_cluster*, copy the @ARVADOS_API_HOST@ and @ARVADOS_API_TOKEN@.
 
@@ -44,7 +44,7 @@ h3. How to copy a collection
 
 First, select the uuid of the collection you want to copy from the source cluster. The uuid can be found in the collection display page in the collection summary area (top left box), or from the URL bar (the part after @collections/...@)
 
-Now copy the collection from *qr1hi* to *dst_cluster*. We will use the uuid @qr1hi-4zz18-tci4vn4fa95w0zx@ as an example. You can find this collection in the <a href="https://cloud.curoverse.com/collections/qr1hi-4zz18-tci4vn4fa95w0zx">lobSTR v.3 project on cloud.curoverse.com</a>.
+Now copy the collection from *qr1hi* to *dst_cluster*. We will use the uuid @qr1hi-4zz18-tci4vn4fa95w0zx@ as an example. You can find this collection in the <a href="https://playground.arvados.org/collections/qr1hi-4zz18-tci4vn4fa95w0zx">lobSTR v.3 project on playground.arvados.org</a>.
 <notextile>
 <pre><code>~$ <span class="userinput">arv-copy --src qr1hi --dst dst_cluster qr1hi-4zz18-tci4vn4fa95w0zx</span>
 qr1hi-4zz18-tci4vn4fa95w0zx: 6.1M / 6.1M 100.0%
index bcbf148e5d66014ff0e519b810d9433981f97d92..a4e58b84be12b29f8f2950a1098d7490910696f6 100644 (file)
@@ -56,7 +56,7 @@ See the "run-command reference":{{site.baseurl}}/user/topics/run-command.html fo
 <pre><code>~$ <span class="userinput">git rev-parse HEAD</span></code></pre>
 </notextile>
 
-* @"docker_image"@ : The docker image hash used is found on the "Collection page":https://cloud.curoverse.com/collections/qr1hi-4zz18-dov6im679g3jr1n as the *Content address*.
+* @"docker_image"@ : The docker image hash used is found on the "Collection page":https://playground.arvados.org/collections/qr1hi-4zz18-dov6im679g3jr1n as the *Content address*.
 
 h2. Running your pipeline
 
@@ -82,4 +82,4 @@ Note: Job reuse can only happen if all input collections do not change.
 <pre><code>~$ <span class="userinput">git rev-parse HEAD</span></code></pre>
 </notextile>
 
-* @"docker_image"@ : This specifies the "Docker":https://www.docker.com/ runtime environment where jobs run their scripts. Docker version control is similar to git, and you can commit and push changes to your images. You must re-use the docker image hash from the previous run to use the same image. It can be found on the "Collection page":https://cloud.curoverse.com/collections/qr1hi-4zz18-dov6im679g3jr1n as the *Content address* or the *docker_image_locator* in a job's metadata.
+* @"docker_image"@ : This specifies the "Docker":https://www.docker.com/ runtime environment where jobs run their scripts. Docker version control is similar to git, and you can commit and push changes to your images. You must re-use the docker image hash from the previous run to use the same image. It can be found on the "Collection page":https://playground.arvados.org/collections/qr1hi-4zz18-dov6im679g3jr1n as the *Content address* or the *docker_image_locator* in a job's metadata.
index 0ec2d115295749067ceb4ee105245aad73df149f..4b65546912393b52b4e05a4d1ecd21b83f44bd28 100644 (file)
@@ -3,9 +3,9 @@
 # SPDX-License-Identifier: Apache-2.0
 
 #' users.get
-#' 
+#'
 #' users.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.get(uuid)
 #' @param uuid The UUID of the User in question.
 #' @return User object.
@@ -13,9 +13,9 @@
 NULL
 
 #' users.create
-#' 
+#'
 #' users.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.create(user, ensure_unique_name = "false")
 #' @param user User object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -24,9 +24,9 @@ NULL
 NULL
 
 #' users.update
-#' 
+#'
 #' users.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.update(user, uuid)
 #' @param user User object.
 #' @param uuid The UUID of the User in question.
@@ -35,9 +35,9 @@ NULL
 NULL
 
 #' users.delete
-#' 
+#'
 #' users.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.delete(uuid)
 #' @param uuid The UUID of the User in question.
 #' @return User object.
@@ -45,93 +45,93 @@ NULL
 NULL
 
 #' users.current
-#' 
+#'
 #' users.current is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.current(NULL)
 #' @return User object.
 #' @name users.current
 NULL
 
 #' users.system
-#' 
+#'
 #' users.system is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.system(NULL)
 #' @return User object.
 #' @name users.system
 NULL
 
 #' users.activate
-#' 
+#'
 #' users.activate is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.activate(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return User object.
 #' @name users.activate
 NULL
 
 #' users.setup
-#' 
+#'
 #' users.setup is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.setup(user = NULL, openid_prefix = NULL,
 #'     repo_name = NULL, vm_uuid = NULL, send_notification_email = "false")
-#' @param user 
-#' @param openid_prefix 
-#' @param repo_name 
-#' @param vm_uuid 
-#' @param send_notification_email 
+#' @param user
+#' @param openid_prefix
+#' @param repo_name
+#' @param vm_uuid
+#' @param send_notification_email
 #' @return User object.
 #' @name users.setup
 NULL
 
 #' users.unsetup
-#' 
+#'
 #' users.unsetup is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.unsetup(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return User object.
 #' @name users.unsetup
 NULL
 
 #' users.update_uuid
-#' 
+#'
 #' users.update_uuid is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.update_uuid(uuid, new_uuid)
-#' @param uuid 
-#' @param new_uuid 
+#' @param uuid
+#' @param new_uuid
 #' @return User object.
 #' @name users.update_uuid
 NULL
 
 #' users.list
-#' 
+#'
 #' users.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$users.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return UserList object.
 #' @name users.list
 NULL
 
 #' api_client_authorizations.get
-#' 
+#'
 #' api_client_authorizations.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.get(uuid)
 #' @param uuid The UUID of the ApiClientAuthorization in question.
 #' @return ApiClientAuthorization object.
@@ -139,9 +139,9 @@ NULL
 NULL
 
 #' api_client_authorizations.create
-#' 
+#'
 #' api_client_authorizations.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.create(apiclientauthorization,
 #'     ensure_unique_name = "false")
 #' @param apiClientAuthorization ApiClientAuthorization object.
@@ -151,9 +151,9 @@ NULL
 NULL
 
 #' api_client_authorizations.update
-#' 
+#'
 #' api_client_authorizations.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.update(apiclientauthorization,
 #'     uuid)
 #' @param apiClientAuthorization ApiClientAuthorization object.
@@ -163,9 +163,9 @@ NULL
 NULL
 
 #' api_client_authorizations.delete
-#' 
+#'
 #' api_client_authorizations.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.delete(uuid)
 #' @param uuid The UUID of the ApiClientAuthorization in question.
 #' @return ApiClientAuthorization object.
@@ -173,50 +173,50 @@ NULL
 NULL
 
 #' api_client_authorizations.create_system_auth
-#' 
+#'
 #' api_client_authorizations.create_system_auth is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.create_system_auth(api_client_id = NULL,
 #'     scopes = NULL)
-#' @param api_client_id 
-#' @param scopes 
+#' @param api_client_id
+#' @param scopes
 #' @return ApiClientAuthorization object.
 #' @name api_client_authorizations.create_system_auth
 NULL
 
 #' api_client_authorizations.current
-#' 
+#'
 #' api_client_authorizations.current is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.current(NULL)
 #' @return ApiClientAuthorization object.
 #' @name api_client_authorizations.current
 NULL
 
 #' api_client_authorizations.list
-#' 
+#'
 #' api_client_authorizations.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_client_authorizations.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return ApiClientAuthorizationList object.
 #' @name api_client_authorizations.list
 NULL
 
 #' containers.get
-#' 
+#'
 #' containers.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.get(uuid)
 #' @param uuid The UUID of the Container in question.
 #' @return Container object.
@@ -224,9 +224,9 @@ NULL
 NULL
 
 #' containers.create
-#' 
+#'
 #' containers.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.create(container,
 #'     ensure_unique_name = "false")
 #' @param container Container object.
@@ -236,9 +236,9 @@ NULL
 NULL
 
 #' containers.update
-#' 
+#'
 #' containers.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.update(container,
 #'     uuid)
 #' @param container Container object.
@@ -248,9 +248,9 @@ NULL
 NULL
 
 #' containers.delete
-#' 
+#'
 #' containers.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.delete(uuid)
 #' @param uuid The UUID of the Container in question.
 #' @return Container object.
@@ -258,78 +258,78 @@ NULL
 NULL
 
 #' containers.auth
-#' 
+#'
 #' containers.auth is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.auth(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Container object.
 #' @name containers.auth
 NULL
 
 #' containers.lock
-#' 
+#'
 #' containers.lock is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.lock(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Container object.
 #' @name containers.lock
 NULL
 
 #' containers.unlock
-#' 
+#'
 #' containers.unlock is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.unlock(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Container object.
 #' @name containers.unlock
 NULL
 
 #' containers.secret_mounts
-#' 
+#'
 #' containers.secret_mounts is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.secret_mounts(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Container object.
 #' @name containers.secret_mounts
 NULL
 
 #' containers.current
-#' 
+#'
 #' containers.current is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.current(NULL)
 #' @return Container object.
 #' @name containers.current
 NULL
 
 #' containers.list
-#' 
+#'
 #' containers.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$containers.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return ContainerList object.
 #' @name containers.list
 NULL
 
 #' api_clients.get
-#' 
+#'
 #' api_clients.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_clients.get(uuid)
 #' @param uuid The UUID of the ApiClient in question.
 #' @return ApiClient object.
@@ -337,9 +337,9 @@ NULL
 NULL
 
 #' api_clients.create
-#' 
+#'
 #' api_clients.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_clients.create(apiclient,
 #'     ensure_unique_name = "false")
 #' @param apiClient ApiClient object.
@@ -349,9 +349,9 @@ NULL
 NULL
 
 #' api_clients.update
-#' 
+#'
 #' api_clients.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_clients.update(apiclient,
 #'     uuid)
 #' @param apiClient ApiClient object.
@@ -361,9 +361,9 @@ NULL
 NULL
 
 #' api_clients.delete
-#' 
+#'
 #' api_clients.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_clients.delete(uuid)
 #' @param uuid The UUID of the ApiClient in question.
 #' @return ApiClient object.
@@ -371,29 +371,29 @@ NULL
 NULL
 
 #' api_clients.list
-#' 
+#'
 #' api_clients.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$api_clients.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return ApiClientList object.
 #' @name api_clients.list
 NULL
 
 #' authorized_keys.get
-#' 
+#'
 #' authorized_keys.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$authorized_keys.get(uuid)
 #' @param uuid The UUID of the AuthorizedKey in question.
 #' @return AuthorizedKey object.
@@ -401,9 +401,9 @@ NULL
 NULL
 
 #' authorized_keys.create
-#' 
+#'
 #' authorized_keys.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$authorized_keys.create(authorizedkey,
 #'     ensure_unique_name = "false")
 #' @param authorizedKey AuthorizedKey object.
@@ -413,9 +413,9 @@ NULL
 NULL
 
 #' authorized_keys.update
-#' 
+#'
 #' authorized_keys.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$authorized_keys.update(authorizedkey,
 #'     uuid)
 #' @param authorizedKey AuthorizedKey object.
@@ -425,9 +425,9 @@ NULL
 NULL
 
 #' authorized_keys.delete
-#' 
+#'
 #' authorized_keys.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$authorized_keys.delete(uuid)
 #' @param uuid The UUID of the AuthorizedKey in question.
 #' @return AuthorizedKey object.
@@ -435,29 +435,29 @@ NULL
 NULL
 
 #' authorized_keys.list
-#' 
+#'
 #' authorized_keys.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$authorized_keys.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return AuthorizedKeyList object.
 #' @name authorized_keys.list
 NULL
 
 #' container_requests.get
-#' 
+#'
 #' container_requests.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$container_requests.get(uuid)
 #' @param uuid The UUID of the ContainerRequest in question.
 #' @return ContainerRequest object.
@@ -465,9 +465,9 @@ NULL
 NULL
 
 #' container_requests.create
-#' 
+#'
 #' container_requests.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$container_requests.create(containerrequest,
 #'     ensure_unique_name = "false")
 #' @param containerRequest ContainerRequest object.
@@ -477,9 +477,9 @@ NULL
 NULL
 
 #' container_requests.update
-#' 
+#'
 #' container_requests.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$container_requests.update(containerrequest,
 #'     uuid)
 #' @param containerRequest ContainerRequest object.
@@ -489,9 +489,9 @@ NULL
 NULL
 
 #' container_requests.delete
-#' 
+#'
 #' container_requests.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$container_requests.delete(uuid)
 #' @param uuid The UUID of the ContainerRequest in question.
 #' @return ContainerRequest object.
@@ -499,29 +499,29 @@ NULL
 NULL
 
 #' container_requests.list
-#' 
+#'
 #' container_requests.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$container_requests.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return ContainerRequestList object.
 #' @name container_requests.list
 NULL
 
 #' collections.get
-#' 
+#'
 #' collections.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.get(uuid)
 #' @param uuid The UUID of the Collection in question.
 #' @return Collection object.
@@ -529,9 +529,9 @@ NULL
 NULL
 
 #' collections.create
-#' 
+#'
 #' collections.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.create(collection,
 #'     ensure_unique_name = "false")
 #' @param collection Collection object.
@@ -541,9 +541,9 @@ NULL
 NULL
 
 #' collections.update
-#' 
+#'
 #' collections.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.update(collection,
 #'     uuid)
 #' @param collection Collection object.
@@ -553,9 +553,9 @@ NULL
 NULL
 
 #' collections.delete
-#' 
+#'
 #' collections.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.delete(uuid)
 #' @param uuid The UUID of the Collection in question.
 #' @return Collection object.
@@ -563,70 +563,70 @@ NULL
 NULL
 
 #' collections.provenance
-#' 
+#'
 #' collections.provenance is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.provenance(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Collection object.
 #' @name collections.provenance
 NULL
 
 #' collections.used_by
-#' 
+#'
 #' collections.used_by is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.used_by(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Collection object.
 #' @name collections.used_by
 NULL
 
 #' collections.trash
-#' 
+#'
 #' collections.trash is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.trash(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Collection object.
 #' @name collections.trash
 NULL
 
 #' collections.untrash
-#' 
+#'
 #' collections.untrash is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.untrash(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Collection object.
 #' @name collections.untrash
 NULL
 
 #' collections.list
-#' 
+#'
 #' collections.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$collections.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact", include_trash = NULL)
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @param include_trash Include collections whose is_trashed attribute is true.
 #' @return CollectionList object.
 #' @name collections.list
 NULL
 
 #' humans.get
-#' 
+#'
 #' humans.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$humans.get(uuid)
 #' @param uuid The UUID of the Human in question.
 #' @return Human object.
@@ -634,9 +634,9 @@ NULL
 NULL
 
 #' humans.create
-#' 
+#'
 #' humans.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$humans.create(human, ensure_unique_name = "false")
 #' @param human Human object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -645,9 +645,9 @@ NULL
 NULL
 
 #' humans.update
-#' 
+#'
 #' humans.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$humans.update(human, uuid)
 #' @param human Human object.
 #' @param uuid The UUID of the Human in question.
@@ -656,9 +656,9 @@ NULL
 NULL
 
 #' humans.delete
-#' 
+#'
 #' humans.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$humans.delete(uuid)
 #' @param uuid The UUID of the Human in question.
 #' @return Human object.
@@ -666,29 +666,29 @@ NULL
 NULL
 
 #' humans.list
-#' 
+#'
 #' humans.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$humans.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return HumanList object.
 #' @name humans.list
 NULL
 
 #' job_tasks.get
-#' 
+#'
 #' job_tasks.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$job_tasks.get(uuid)
 #' @param uuid The UUID of the JobTask in question.
 #' @return JobTask object.
@@ -696,9 +696,9 @@ NULL
 NULL
 
 #' job_tasks.create
-#' 
+#'
 #' job_tasks.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$job_tasks.create(jobtask, ensure_unique_name = "false")
 #' @param jobTask JobTask object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -707,9 +707,9 @@ NULL
 NULL
 
 #' job_tasks.update
-#' 
+#'
 #' job_tasks.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$job_tasks.update(jobtask, uuid)
 #' @param jobTask JobTask object.
 #' @param uuid The UUID of the JobTask in question.
@@ -718,9 +718,9 @@ NULL
 NULL
 
 #' job_tasks.delete
-#' 
+#'
 #' job_tasks.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$job_tasks.delete(uuid)
 #' @param uuid The UUID of the JobTask in question.
 #' @return JobTask object.
@@ -728,29 +728,29 @@ NULL
 NULL
 
 #' job_tasks.list
-#' 
+#'
 #' job_tasks.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$job_tasks.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return JobTaskList object.
 #' @name job_tasks.list
 NULL
 
 #' links.get
-#' 
+#'
 #' links.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.get(uuid)
 #' @param uuid The UUID of the Link in question.
 #' @return Link object.
@@ -758,9 +758,9 @@ NULL
 NULL
 
 #' links.create
-#' 
+#'
 #' links.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.create(link, ensure_unique_name = "false")
 #' @param link Link object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -769,9 +769,9 @@ NULL
 NULL
 
 #' links.update
-#' 
+#'
 #' links.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.update(link, uuid)
 #' @param link Link object.
 #' @param uuid The UUID of the Link in question.
@@ -780,9 +780,9 @@ NULL
 NULL
 
 #' links.delete
-#' 
+#'
 #' links.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.delete(uuid)
 #' @param uuid The UUID of the Link in question.
 #' @return Link object.
@@ -790,39 +790,39 @@ NULL
 NULL
 
 #' links.list
-#' 
+#'
 #' links.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return LinkList object.
 #' @name links.list
 NULL
 
 #' links.get_permissions
-#' 
+#'
 #' links.get_permissions is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$links.get_permissions(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Link object.
 #' @name links.get_permissions
 NULL
 
 #' jobs.get
-#' 
+#'
 #' jobs.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.get(uuid)
 #' @param uuid The UUID of the Job in question.
 #' @return Job object.
@@ -830,26 +830,26 @@ NULL
 NULL
 
 #' jobs.create
-#' 
+#'
 #' jobs.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.create(job, ensure_unique_name = "false",
 #'     find_or_create = "false", filters = NULL,
 #'     minimum_script_version = NULL, exclude_script_versions = NULL)
 #' @param job Job object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @param find_or_create 
-#' @param filters 
-#' @param minimum_script_version 
-#' @param exclude_script_versions 
+#' @param find_or_create
+#' @param filters
+#' @param minimum_script_version
+#' @param exclude_script_versions
 #' @return Job object.
 #' @name jobs.create
 NULL
 
 #' jobs.update
-#' 
+#'
 #' jobs.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.update(job, uuid)
 #' @param job Job object.
 #' @param uuid The UUID of the Job in question.
@@ -858,9 +858,9 @@ NULL
 NULL
 
 #' jobs.delete
-#' 
+#'
 #' jobs.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.delete(uuid)
 #' @param uuid The UUID of the Job in question.
 #' @return Job object.
@@ -868,77 +868,77 @@ NULL
 NULL
 
 #' jobs.queue
-#' 
+#'
 #' jobs.queue is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.queue(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return Job object.
 #' @name jobs.queue
 NULL
 
 #' jobs.queue_size
-#' 
+#'
 #' jobs.queue_size is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.queue_size(NULL)
 #' @return Job object.
 #' @name jobs.queue_size
 NULL
 
 #' jobs.cancel
-#' 
+#'
 #' jobs.cancel is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.cancel(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Job object.
 #' @name jobs.cancel
 NULL
 
 #' jobs.lock
-#' 
+#'
 #' jobs.lock is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.lock(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Job object.
 #' @name jobs.lock
 NULL
 
 #' jobs.list
-#' 
+#'
 #' jobs.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$jobs.list(filters = NULL, where = NULL,
 #'     order = NULL, select = NULL, distinct = NULL,
 #'     limit = "100", offset = "0", count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return JobList object.
 #' @name jobs.list
 NULL
 
 #' keep_disks.get
-#' 
+#'
 #' keep_disks.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.get(uuid)
 #' @param uuid The UUID of the KeepDisk in question.
 #' @return KeepDisk object.
@@ -946,9 +946,9 @@ NULL
 NULL
 
 #' keep_disks.create
-#' 
+#'
 #' keep_disks.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.create(keepdisk,
 #'     ensure_unique_name = "false")
 #' @param keepDisk KeepDisk object.
@@ -958,9 +958,9 @@ NULL
 NULL
 
 #' keep_disks.update
-#' 
+#'
 #' keep_disks.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.update(keepdisk,
 #'     uuid)
 #' @param keepDisk KeepDisk object.
@@ -970,9 +970,9 @@ NULL
 NULL
 
 #' keep_disks.delete
-#' 
+#'
 #' keep_disks.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.delete(uuid)
 #' @param uuid The UUID of the KeepDisk in question.
 #' @return KeepDisk object.
@@ -980,47 +980,47 @@ NULL
 NULL
 
 #' keep_disks.ping
-#' 
+#'
 #' keep_disks.ping is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.ping(uuid = NULL,
 #'     ping_secret, node_uuid = NULL, filesystem_uuid = NULL,
 #'     service_host = NULL, service_port, service_ssl_flag)
-#' @param uuid 
-#' @param ping_secret 
-#' @param node_uuid 
-#' @param filesystem_uuid 
-#' @param service_host 
-#' @param service_port 
-#' @param service_ssl_flag 
+#' @param uuid
+#' @param ping_secret
+#' @param node_uuid
+#' @param filesystem_uuid
+#' @param service_host
+#' @param service_port
+#' @param service_ssl_flag
 #' @return KeepDisk object.
 #' @name keep_disks.ping
 NULL
 
 #' keep_disks.list
-#' 
+#'
 #' keep_disks.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_disks.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return KeepDiskList object.
 #' @name keep_disks.list
 NULL
 
 #' keep_services.get
-#' 
+#'
 #' keep_services.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.get(uuid)
 #' @param uuid The UUID of the KeepService in question.
 #' @return KeepService object.
@@ -1028,9 +1028,9 @@ NULL
 NULL
 
 #' keep_services.create
-#' 
+#'
 #' keep_services.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.create(keepservice,
 #'     ensure_unique_name = "false")
 #' @param keepService KeepService object.
@@ -1040,9 +1040,9 @@ NULL
 NULL
 
 #' keep_services.update
-#' 
+#'
 #' keep_services.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.update(keepservice,
 #'     uuid)
 #' @param keepService KeepService object.
@@ -1052,9 +1052,9 @@ NULL
 NULL
 
 #' keep_services.delete
-#' 
+#'
 #' keep_services.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.delete(uuid)
 #' @param uuid The UUID of the KeepService in question.
 #' @return KeepService object.
@@ -1062,38 +1062,38 @@ NULL
 NULL
 
 #' keep_services.accessible
-#' 
+#'
 #' keep_services.accessible is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.accessible(NULL)
 #' @return KeepService object.
 #' @name keep_services.accessible
 NULL
 
 #' keep_services.list
-#' 
+#'
 #' keep_services.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$keep_services.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return KeepServiceList object.
 #' @name keep_services.list
 NULL
 
 #' pipeline_templates.get
-#' 
+#'
 #' pipeline_templates.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_templates.get(uuid)
 #' @param uuid The UUID of the PipelineTemplate in question.
 #' @return PipelineTemplate object.
@@ -1101,9 +1101,9 @@ NULL
 NULL
 
 #' pipeline_templates.create
-#' 
+#'
 #' pipeline_templates.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_templates.create(pipelinetemplate,
 #'     ensure_unique_name = "false")
 #' @param pipelineTemplate PipelineTemplate object.
@@ -1113,9 +1113,9 @@ NULL
 NULL
 
 #' pipeline_templates.update
-#' 
+#'
 #' pipeline_templates.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_templates.update(pipelinetemplate,
 #'     uuid)
 #' @param pipelineTemplate PipelineTemplate object.
@@ -1125,9 +1125,9 @@ NULL
 NULL
 
 #' pipeline_templates.delete
-#' 
+#'
 #' pipeline_templates.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_templates.delete(uuid)
 #' @param uuid The UUID of the PipelineTemplate in question.
 #' @return PipelineTemplate object.
@@ -1135,29 +1135,29 @@ NULL
 NULL
 
 #' pipeline_templates.list
-#' 
+#'
 #' pipeline_templates.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_templates.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return PipelineTemplateList object.
 #' @name pipeline_templates.list
 NULL
 
 #' pipeline_instances.get
-#' 
+#'
 #' pipeline_instances.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.get(uuid)
 #' @param uuid The UUID of the PipelineInstance in question.
 #' @return PipelineInstance object.
@@ -1165,9 +1165,9 @@ NULL
 NULL
 
 #' pipeline_instances.create
-#' 
+#'
 #' pipeline_instances.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.create(pipelineinstance,
 #'     ensure_unique_name = "false")
 #' @param pipelineInstance PipelineInstance object.
@@ -1177,9 +1177,9 @@ NULL
 NULL
 
 #' pipeline_instances.update
-#' 
+#'
 #' pipeline_instances.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.update(pipelineinstance,
 #'     uuid)
 #' @param pipelineInstance PipelineInstance object.
@@ -1189,9 +1189,9 @@ NULL
 NULL
 
 #' pipeline_instances.delete
-#' 
+#'
 #' pipeline_instances.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.delete(uuid)
 #' @param uuid The UUID of the PipelineInstance in question.
 #' @return PipelineInstance object.
@@ -1199,39 +1199,39 @@ NULL
 NULL
 
 #' pipeline_instances.cancel
-#' 
+#'
 #' pipeline_instances.cancel is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.cancel(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return PipelineInstance object.
 #' @name pipeline_instances.cancel
 NULL
 
 #' pipeline_instances.list
-#' 
+#'
 #' pipeline_instances.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$pipeline_instances.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return PipelineInstanceList object.
 #' @name pipeline_instances.list
 NULL
 
 #' nodes.get
-#' 
+#'
 #' nodes.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.get(uuid)
 #' @param uuid The UUID of the Node in question.
 #' @return Node object.
@@ -1239,9 +1239,9 @@ NULL
 NULL
 
 #' nodes.create
-#' 
+#'
 #' nodes.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.create(node, ensure_unique_name = "false",
 #'     assign_slot = NULL)
 #' @param node Node object.
@@ -1252,9 +1252,9 @@ NULL
 NULL
 
 #' nodes.update
-#' 
+#'
 #' nodes.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.update(node, uuid, assign_slot = NULL)
 #' @param node Node object.
 #' @param uuid The UUID of the Node in question.
@@ -1264,9 +1264,9 @@ NULL
 NULL
 
 #' nodes.delete
-#' 
+#'
 #' nodes.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.delete(uuid)
 #' @param uuid The UUID of the Node in question.
 #' @return Node object.
@@ -1274,40 +1274,40 @@ NULL
 NULL
 
 #' nodes.ping
-#' 
+#'
 #' nodes.ping is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.ping(uuid, ping_secret)
-#' @param uuid 
-#' @param ping_secret 
+#' @param uuid
+#' @param ping_secret
 #' @return Node object.
 #' @name nodes.ping
 NULL
 
 #' nodes.list
-#' 
+#'
 #' nodes.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$nodes.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return NodeList object.
 #' @name nodes.list
 NULL
 
 #' repositories.get
-#' 
+#'
 #' repositories.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.get(uuid)
 #' @param uuid The UUID of the Repository in question.
 #' @return Repository object.
@@ -1315,9 +1315,9 @@ NULL
 NULL
 
 #' repositories.create
-#' 
+#'
 #' repositories.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.create(repository,
 #'     ensure_unique_name = "false")
 #' @param repository Repository object.
@@ -1327,9 +1327,9 @@ NULL
 NULL
 
 #' repositories.update
-#' 
+#'
 #' repositories.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.update(repository,
 #'     uuid)
 #' @param repository Repository object.
@@ -1339,9 +1339,9 @@ NULL
 NULL
 
 #' repositories.delete
-#' 
+#'
 #' repositories.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.delete(uuid)
 #' @param uuid The UUID of the Repository in question.
 #' @return Repository object.
@@ -1349,38 +1349,38 @@ NULL
 NULL
 
 #' repositories.get_all_permissions
-#' 
+#'
 #' repositories.get_all_permissions is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.get_all_permissions(NULL)
 #' @return Repository object.
 #' @name repositories.get_all_permissions
 NULL
 
 #' repositories.list
-#' 
+#'
 #' repositories.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$repositories.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return RepositoryList object.
 #' @name repositories.list
 NULL
 
 #' specimens.get
-#' 
+#'
 #' specimens.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$specimens.get(uuid)
 #' @param uuid The UUID of the Specimen in question.
 #' @return Specimen object.
@@ -1388,9 +1388,9 @@ NULL
 NULL
 
 #' specimens.create
-#' 
+#'
 #' specimens.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$specimens.create(specimen,
 #'     ensure_unique_name = "false")
 #' @param specimen Specimen object.
@@ -1400,9 +1400,9 @@ NULL
 NULL
 
 #' specimens.update
-#' 
+#'
 #' specimens.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$specimens.update(specimen,
 #'     uuid)
 #' @param specimen Specimen object.
@@ -1412,9 +1412,9 @@ NULL
 NULL
 
 #' specimens.delete
-#' 
+#'
 #' specimens.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$specimens.delete(uuid)
 #' @param uuid The UUID of the Specimen in question.
 #' @return Specimen object.
@@ -1422,29 +1422,29 @@ NULL
 NULL
 
 #' specimens.list
-#' 
+#'
 #' specimens.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$specimens.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return SpecimenList object.
 #' @name specimens.list
 NULL
 
 #' logs.get
-#' 
+#'
 #' logs.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$logs.get(uuid)
 #' @param uuid The UUID of the Log in question.
 #' @return Log object.
@@ -1452,9 +1452,9 @@ NULL
 NULL
 
 #' logs.create
-#' 
+#'
 #' logs.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$logs.create(log, ensure_unique_name = "false")
 #' @param log Log object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -1463,9 +1463,9 @@ NULL
 NULL
 
 #' logs.update
-#' 
+#'
 #' logs.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$logs.update(log, uuid)
 #' @param log Log object.
 #' @param uuid The UUID of the Log in question.
@@ -1474,9 +1474,9 @@ NULL
 NULL
 
 #' logs.delete
-#' 
+#'
 #' logs.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$logs.delete(uuid)
 #' @param uuid The UUID of the Log in question.
 #' @return Log object.
@@ -1484,28 +1484,28 @@ NULL
 NULL
 
 #' logs.list
-#' 
+#'
 #' logs.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$logs.list(filters = NULL, where = NULL,
 #'     order = NULL, select = NULL, distinct = NULL,
 #'     limit = "100", offset = "0", count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return LogList object.
 #' @name logs.list
 NULL
 
 #' traits.get
-#' 
+#'
 #' traits.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$traits.get(uuid)
 #' @param uuid The UUID of the Trait in question.
 #' @return Trait object.
@@ -1513,9 +1513,9 @@ NULL
 NULL
 
 #' traits.create
-#' 
+#'
 #' traits.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$traits.create(trait, ensure_unique_name = "false")
 #' @param trait Trait object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -1524,9 +1524,9 @@ NULL
 NULL
 
 #' traits.update
-#' 
+#'
 #' traits.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$traits.update(trait, uuid)
 #' @param trait Trait object.
 #' @param uuid The UUID of the Trait in question.
@@ -1535,9 +1535,9 @@ NULL
 NULL
 
 #' traits.delete
-#' 
+#'
 #' traits.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$traits.delete(uuid)
 #' @param uuid The UUID of the Trait in question.
 #' @return Trait object.
@@ -1545,29 +1545,29 @@ NULL
 NULL
 
 #' traits.list
-#' 
+#'
 #' traits.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$traits.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return TraitList object.
 #' @name traits.list
 NULL
 
 #' virtual_machines.get
-#' 
+#'
 #' virtual_machines.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.get(uuid)
 #' @param uuid The UUID of the VirtualMachine in question.
 #' @return VirtualMachine object.
@@ -1575,9 +1575,9 @@ NULL
 NULL
 
 #' virtual_machines.create
-#' 
+#'
 #' virtual_machines.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.create(virtualmachine,
 #'     ensure_unique_name = "false")
 #' @param virtualMachine VirtualMachine object.
@@ -1587,9 +1587,9 @@ NULL
 NULL
 
 #' virtual_machines.update
-#' 
+#'
 #' virtual_machines.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.update(virtualmachine,
 #'     uuid)
 #' @param virtualMachine VirtualMachine object.
@@ -1599,9 +1599,9 @@ NULL
 NULL
 
 #' virtual_machines.delete
-#' 
+#'
 #' virtual_machines.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.delete(uuid)
 #' @param uuid The UUID of the VirtualMachine in question.
 #' @return VirtualMachine object.
@@ -1609,48 +1609,48 @@ NULL
 NULL
 
 #' virtual_machines.logins
-#' 
+#'
 #' virtual_machines.logins is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.logins(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return VirtualMachine object.
 #' @name virtual_machines.logins
 NULL
 
 #' virtual_machines.get_all_logins
-#' 
+#'
 #' virtual_machines.get_all_logins is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.get_all_logins(NULL)
 #' @return VirtualMachine object.
 #' @name virtual_machines.get_all_logins
 NULL
 
 #' virtual_machines.list
-#' 
+#'
 #' virtual_machines.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$virtual_machines.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return VirtualMachineList object.
 #' @name virtual_machines.list
 NULL
 
 #' workflows.get
-#' 
+#'
 #' workflows.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$workflows.get(uuid)
 #' @param uuid The UUID of the Workflow in question.
 #' @return Workflow object.
@@ -1658,9 +1658,9 @@ NULL
 NULL
 
 #' workflows.create
-#' 
+#'
 #' workflows.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$workflows.create(workflow,
 #'     ensure_unique_name = "false")
 #' @param workflow Workflow object.
@@ -1670,9 +1670,9 @@ NULL
 NULL
 
 #' workflows.update
-#' 
+#'
 #' workflows.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$workflows.update(workflow,
 #'     uuid)
 #' @param workflow Workflow object.
@@ -1682,9 +1682,9 @@ NULL
 NULL
 
 #' workflows.delete
-#' 
+#'
 #' workflows.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$workflows.delete(uuid)
 #' @param uuid The UUID of the Workflow in question.
 #' @return Workflow object.
@@ -1692,29 +1692,29 @@ NULL
 NULL
 
 #' workflows.list
-#' 
+#'
 #' workflows.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$workflows.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return WorkflowList object.
 #' @name workflows.list
 NULL
 
 #' groups.get
-#' 
+#'
 #' groups.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.get(uuid)
 #' @param uuid The UUID of the Group in question.
 #' @return Group object.
@@ -1722,9 +1722,9 @@ NULL
 NULL
 
 #' groups.create
-#' 
+#'
 #' groups.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.create(group, ensure_unique_name = "false")
 #' @param group Group object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -1733,9 +1733,9 @@ NULL
 NULL
 
 #' groups.update
-#' 
+#'
 #' groups.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.update(group, uuid)
 #' @param group Group object.
 #' @param uuid The UUID of the Group in question.
@@ -1744,9 +1744,9 @@ NULL
 NULL
 
 #' groups.delete
-#' 
+#'
 #' groups.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.delete(uuid)
 #' @param uuid The UUID of the Group in question.
 #' @return Group object.
@@ -1754,72 +1754,72 @@ NULL
 NULL
 
 #' groups.contents
-#' 
+#'
 #' groups.contents is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.contents(filters = NULL,
 #'     where = NULL, order = NULL, distinct = NULL,
 #'     limit = "100", offset = "0", count = "exact",
 #'     include_trash = NULL, uuid = NULL, recursive = NULL)
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @param include_trash Include items whose is_trashed attribute is true.
-#' @param uuid 
+#' @param uuid
 #' @param recursive Include contents from child groups recursively.
 #' @return Group object.
 #' @name groups.contents
 NULL
 
 #' groups.trash
-#' 
+#'
 #' groups.trash is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.trash(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Group object.
 #' @name groups.trash
 NULL
 
 #' groups.untrash
-#' 
+#'
 #' groups.untrash is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.untrash(uuid)
-#' @param uuid 
+#' @param uuid
 #' @return Group object.
 #' @name groups.untrash
 NULL
 
 #' groups.list
-#' 
+#'
 #' groups.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$groups.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact", include_trash = NULL)
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @param include_trash Include items whose is_trashed attribute is true.
 #' @return GroupList object.
 #' @name groups.list
 NULL
 
 #' user_agreements.get
-#' 
+#'
 #' user_agreements.get is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.get(uuid)
 #' @param uuid The UUID of the UserAgreement in question.
 #' @return UserAgreement object.
@@ -1827,9 +1827,9 @@ NULL
 NULL
 
 #' user_agreements.create
-#' 
+#'
 #' user_agreements.create is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.create(useragreement,
 #'     ensure_unique_name = "false")
 #' @param userAgreement UserAgreement object.
@@ -1839,9 +1839,9 @@ NULL
 NULL
 
 #' user_agreements.update
-#' 
+#'
 #' user_agreements.update is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.update(useragreement,
 #'     uuid)
 #' @param userAgreement UserAgreement object.
@@ -1851,9 +1851,9 @@ NULL
 NULL
 
 #' user_agreements.delete
-#' 
+#'
 #' user_agreements.delete is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.delete(uuid)
 #' @param uuid The UUID of the UserAgreement in question.
 #' @return UserAgreement object.
@@ -1861,56 +1861,56 @@ NULL
 NULL
 
 #' user_agreements.signatures
-#' 
+#'
 #' user_agreements.signatures is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.signatures(NULL)
 #' @return UserAgreement object.
 #' @name user_agreements.signatures
 NULL
 
 #' user_agreements.sign
-#' 
+#'
 #' user_agreements.sign is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.sign(NULL)
 #' @return UserAgreement object.
 #' @name user_agreements.sign
 NULL
 
 #' user_agreements.list
-#' 
+#'
 #' user_agreements.list is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
 #'     count = "exact")
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param select 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param select
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @return UserAgreementList object.
 #' @name user_agreements.list
 NULL
 
 #' user_agreements.new
-#' 
+#'
 #' user_agreements.new is a method defined in Arvados class.
-#' 
+#'
 #' @usage arv$user_agreements.new(NULL)
 #' @return UserAgreement object.
 #' @name user_agreements.new
 NULL
 
 #' project.get
-#' 
+#'
 #' projects.get is equivalent to groups.get method.
-#' 
+#'
 #' @usage arv$projects.get(uuid)
 #' @param uuid The UUID of the Group in question.
 #' @return Group object.
@@ -1918,9 +1918,9 @@ NULL
 NULL
 
 #' project.create
-#' 
+#'
 #' projects.create wrapps groups.create method by setting group_class attribute to "project".
-#' 
+#'
 #' @usage arv$projects.create(group, ensure_unique_name = "false")
 #' @param group Group object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
@@ -1929,9 +1929,9 @@ NULL
 NULL
 
 #' project.update
-#' 
+#'
 #' projects.update wrapps groups.update method by setting group_class attribute to "project".
-#' 
+#'
 #' @usage arv$projects.update(group, uuid)
 #' @param group Group object.
 #' @param uuid The UUID of the Group in question.
@@ -1940,9 +1940,9 @@ NULL
 NULL
 
 #' project.delete
-#' 
+#'
 #' projects.delete is equivalent to groups.delete method.
-#' 
+#'
 #' @usage arv$project.delete(uuid)
 #' @param uuid The UUID of the Group in question.
 #' @return Group object.
@@ -1950,22 +1950,22 @@ NULL
 NULL
 
 #' project.list
-#' 
+#'
 #' projects.list wrapps groups.list method by setting group_class attribute to "project".
-#' 
+#'
 #' @usage arv$projects.list(filters = NULL,
 #'     where = NULL, order = NULL, distinct = NULL,
 #'     limit = "100", offset = "0", count = "exact",
 #'     include_trash = NULL, uuid = NULL, recursive = NULL)
-#' @param filters 
-#' @param where 
-#' @param order 
-#' @param distinct 
-#' @param limit 
-#' @param offset 
-#' @param count 
+#' @param filters
+#' @param where
+#' @param order
+#' @param distinct
+#' @param limit
+#' @param offset
+#' @param count
 #' @param include_trash Include items whose is_trashed attribute is true.
-#' @param uuid 
+#' @param uuid
 #' @param recursive Include contents from child groups recursively.
 #' @return Group object.
 #' @name projects.list
@@ -2237,19 +2237,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2257,23 +2257,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(user) > 0)
-                               body <- jsonlite::toJSON(list(user = user), 
+                               body <- jsonlite::toJSON(list(user = user),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2281,23 +2281,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(user) > 0)
-                               body <- jsonlite::toJSON(list(user = user), 
+                               body <- jsonlite::toJSON(list(user = user),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2305,19 +2305,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2325,19 +2325,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2345,19 +2345,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/system")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2365,19 +2365,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}/activate")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2386,21 +2386,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/setup")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(user = user, openid_prefix = openid_prefix,
                                                          repo_name = repo_name, vm_uuid = vm_uuid,
                                                          send_notification_email = send_notification_email)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2408,19 +2408,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}/unsetup")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2428,19 +2428,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users/${uuid}/update_uuid")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(new_uuid = new_uuid)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2450,21 +2450,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("users")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2472,19 +2472,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2493,23 +2493,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(apiclientauthorization) > 0)
-                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization), 
+                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2517,23 +2517,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(apiclientauthorization) > 0)
-                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization), 
+                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2541,19 +2541,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2561,20 +2561,20 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations/create_system_auth")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(api_client_id = api_client_id,
                                                          scopes = scopes)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2582,19 +2582,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2605,21 +2605,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_client_authorizations")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2627,19 +2627,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2647,23 +2647,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(container) > 0)
-                               body <- jsonlite::toJSON(list(container = container), 
+                               body <- jsonlite::toJSON(list(container = container),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2671,23 +2671,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(container) > 0)
-                               body <- jsonlite::toJSON(list(container = container), 
+                               body <- jsonlite::toJSON(list(container = container),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2695,19 +2695,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2715,19 +2715,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}/auth")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2735,19 +2735,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}/lock")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2755,19 +2755,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}/unlock")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2775,19 +2775,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/${uuid}/secret_mounts")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2795,19 +2795,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2818,21 +2818,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("containers")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2840,19 +2840,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2860,23 +2860,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_clients")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(apiclient) > 0)
-                               body <- jsonlite::toJSON(list(apiclient = apiclient), 
+                               body <- jsonlite::toJSON(list(apiclient = apiclient),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2884,23 +2884,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(apiclient) > 0)
-                               body <- jsonlite::toJSON(list(apiclient = apiclient), 
+                               body <- jsonlite::toJSON(list(apiclient = apiclient),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2908,19 +2908,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2931,21 +2931,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("api_clients")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2953,19 +2953,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2974,23 +2974,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("authorized_keys")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(authorizedkey) > 0)
-                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey), 
+                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -2998,23 +2998,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(authorizedkey) > 0)
-                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey), 
+                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3022,19 +3022,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3045,21 +3045,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("authorized_keys")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3067,19 +3067,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3088,23 +3088,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("container_requests")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(containerrequest) > 0)
-                               body <- jsonlite::toJSON(list(containerrequest = containerrequest), 
+                               body <- jsonlite::toJSON(list(containerrequest = containerrequest),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3112,23 +3112,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(containerrequest) > 0)
-                               body <- jsonlite::toJSON(list(containerrequest = containerrequest), 
+                               body <- jsonlite::toJSON(list(containerrequest = containerrequest),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3136,19 +3136,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3159,21 +3159,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("container_requests")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3181,19 +3181,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3201,23 +3201,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(collection) > 0)
-                               body <- jsonlite::toJSON(list(collection = collection), 
+                               body <- jsonlite::toJSON(list(collection = collection),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3225,23 +3225,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(collection) > 0)
-                               body <- jsonlite::toJSON(list(collection = collection), 
+                               body <- jsonlite::toJSON(list(collection = collection),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3249,19 +3249,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3269,19 +3269,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}/provenance")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3289,19 +3289,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}/used_by")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3309,19 +3309,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}/trash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3329,19 +3329,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections/${uuid}/untrash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3352,22 +3352,22 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("collections")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count,
                                                          include_trash = include_trash)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3375,19 +3375,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("humans/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3395,23 +3395,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("humans")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(human) > 0)
-                               body <- jsonlite::toJSON(list(human = human), 
+                               body <- jsonlite::toJSON(list(human = human),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3419,23 +3419,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("humans/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(human) > 0)
-                               body <- jsonlite::toJSON(list(human = human), 
+                               body <- jsonlite::toJSON(list(human = human),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3443,19 +3443,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("humans/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3465,21 +3465,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("humans")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3487,19 +3487,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("job_tasks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3507,23 +3507,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("job_tasks")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(jobtask) > 0)
-                               body <- jsonlite::toJSON(list(jobtask = jobtask), 
+                               body <- jsonlite::toJSON(list(jobtask = jobtask),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3531,23 +3531,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("job_tasks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(jobtask) > 0)
-                               body <- jsonlite::toJSON(list(jobtask = jobtask), 
+                               body <- jsonlite::toJSON(list(jobtask = jobtask),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3555,19 +3555,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("job_tasks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3578,21 +3578,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("job_tasks")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3600,19 +3600,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3620,23 +3620,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("links")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(link) > 0)
-                               body <- jsonlite::toJSON(list(link = link), 
+                               body <- jsonlite::toJSON(list(link = link),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3644,23 +3644,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(link) > 0)
-                               body <- jsonlite::toJSON(list(link = link), 
+                               body <- jsonlite::toJSON(list(link = link),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3668,19 +3668,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3690,21 +3690,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("links")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3712,19 +3712,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("permissions/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3732,19 +3732,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3754,26 +3754,26 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name,
                                                          find_or_create = find_or_create, filters = filters,
                                                          minimum_script_version = minimum_script_version,
                                                          exclude_script_versions = exclude_script_versions)
-                       
+
                        if(length(job) > 0)
-                               body <- jsonlite::toJSON(list(job = job), 
+                               body <- jsonlite::toJSON(list(job = job),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3781,23 +3781,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(job) > 0)
-                               body <- jsonlite::toJSON(list(job = job), 
+                               body <- jsonlite::toJSON(list(job = job),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3805,19 +3805,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3827,21 +3827,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/queue")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3849,19 +3849,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/queue_size")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3869,19 +3869,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/${uuid}/cancel")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3889,19 +3889,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs/${uuid}/lock")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3911,21 +3911,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("jobs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3933,19 +3933,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3953,23 +3953,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(keepdisk) > 0)
-                               body <- jsonlite::toJSON(list(keepdisk = keepdisk), 
+                               body <- jsonlite::toJSON(list(keepdisk = keepdisk),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -3977,23 +3977,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(keepdisk) > 0)
-                               body <- jsonlite::toJSON(list(keepdisk = keepdisk), 
+                               body <- jsonlite::toJSON(list(keepdisk = keepdisk),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4001,19 +4001,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4023,22 +4023,22 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks/ping")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(uuid = uuid, ping_secret = ping_secret,
                                                          node_uuid = node_uuid, filesystem_uuid = filesystem_uuid,
                                                          service_host = service_host, service_port = service_port,
                                                          service_ssl_flag = service_ssl_flag)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4049,21 +4049,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_disks")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4071,19 +4071,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4092,23 +4092,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(keepservice) > 0)
-                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
+                               body <- jsonlite::toJSON(list(keepservice = keepservice),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4116,23 +4116,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(keepservice) > 0)
-                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
+                               body <- jsonlite::toJSON(list(keepservice = keepservice),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4140,19 +4140,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4160,19 +4160,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services/accessible")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4183,21 +4183,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("keep_services")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4205,19 +4205,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4226,23 +4226,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_templates")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(pipelinetemplate) > 0)
-                               body <- jsonlite::toJSON(list(pipelinetemplate = pipelinetemplate), 
+                               body <- jsonlite::toJSON(list(pipelinetemplate = pipelinetemplate),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4250,23 +4250,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(pipelinetemplate) > 0)
-                               body <- jsonlite::toJSON(list(pipelinetemplate = pipelinetemplate), 
+                               body <- jsonlite::toJSON(list(pipelinetemplate = pipelinetemplate),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4274,19 +4274,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4297,21 +4297,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_templates")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4319,19 +4319,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4340,23 +4340,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(pipelineinstance) > 0)
-                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance), 
+                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4364,23 +4364,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(pipelineinstance) > 0)
-                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance), 
+                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4388,19 +4388,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4408,19 +4408,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances/${uuid}/cancel")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4431,21 +4431,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("pipeline_instances")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4453,19 +4453,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4474,24 +4474,24 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name,
                                                          assign_slot = assign_slot)
-                       
+
                        if(length(node) > 0)
-                               body <- jsonlite::toJSON(list(node = node), 
+                               body <- jsonlite::toJSON(list(node = node),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4499,23 +4499,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(assign_slot = assign_slot)
-                       
+
                        if(length(node) > 0)
-                               body <- jsonlite::toJSON(list(node = node), 
+                               body <- jsonlite::toJSON(list(node = node),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4523,19 +4523,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4543,19 +4543,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes/${uuid}/ping")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ping_secret = ping_secret)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4565,21 +4565,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("nodes")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4587,19 +4587,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4607,23 +4607,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(repository) > 0)
-                               body <- jsonlite::toJSON(list(repository = repository), 
+                               body <- jsonlite::toJSON(list(repository = repository),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4631,23 +4631,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(repository) > 0)
-                               body <- jsonlite::toJSON(list(repository = repository), 
+                               body <- jsonlite::toJSON(list(repository = repository),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4655,19 +4655,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4675,19 +4675,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories/get_all_permissions")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4698,21 +4698,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("repositories")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4720,19 +4720,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("specimens/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4740,23 +4740,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("specimens")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(specimen) > 0)
-                               body <- jsonlite::toJSON(list(specimen = specimen), 
+                               body <- jsonlite::toJSON(list(specimen = specimen),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4764,23 +4764,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("specimens/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(specimen) > 0)
-                               body <- jsonlite::toJSON(list(specimen = specimen), 
+                               body <- jsonlite::toJSON(list(specimen = specimen),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4788,19 +4788,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("specimens/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4811,21 +4811,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("specimens")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4833,19 +4833,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4853,23 +4853,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("logs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(log) > 0)
-                               body <- jsonlite::toJSON(list(log = log), 
+                               body <- jsonlite::toJSON(list(log = log),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4877,23 +4877,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(log) > 0)
-                               body <- jsonlite::toJSON(list(log = log), 
+                               body <- jsonlite::toJSON(list(log = log),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4901,19 +4901,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4923,21 +4923,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("logs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4945,19 +4945,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("traits/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4965,23 +4965,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("traits")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(trait) > 0)
-                               body <- jsonlite::toJSON(list(trait = trait), 
+                               body <- jsonlite::toJSON(list(trait = trait),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -4989,23 +4989,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("traits/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(trait) > 0)
-                               body <- jsonlite::toJSON(list(trait = trait), 
+                               body <- jsonlite::toJSON(list(trait = trait),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5013,19 +5013,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("traits/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5035,21 +5035,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("traits")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5057,19 +5057,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5078,23 +5078,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(virtualmachine) > 0)
-                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
+                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5102,23 +5102,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(virtualmachine) > 0)
-                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
+                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5126,19 +5126,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5146,19 +5146,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines/${uuid}/logins")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5166,19 +5166,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines/get_all_logins")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5189,21 +5189,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("virtual_machines")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5211,19 +5211,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5231,23 +5231,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("workflows")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(workflow) > 0)
-                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                               body <- jsonlite::toJSON(list(workflow = workflow),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5255,23 +5255,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(workflow) > 0)
-                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                               body <- jsonlite::toJSON(list(workflow = workflow),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5279,19 +5279,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5302,21 +5302,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("workflows")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5324,19 +5324,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5344,23 +5344,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(group) > 0)
-                               body <- jsonlite::toJSON(list(group = group), 
+                               body <- jsonlite::toJSON(list(group = group),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5368,23 +5368,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(group) > 0)
-                               body <- jsonlite::toJSON(list(group = group), 
+                               body <- jsonlite::toJSON(list(group = group),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5392,19 +5392,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5415,22 +5415,22 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/contents")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, distinct = distinct, limit = limit,
                                                          offset = offset, count = count, include_trash = include_trash,
                                                          uuid = uuid, recursive = recursive)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5438,19 +5438,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/${uuid}/trash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5458,19 +5458,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups/${uuid}/untrash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5481,22 +5481,22 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("groups")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count,
                                                          include_trash = include_trash)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5504,19 +5504,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5525,23 +5525,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(ensure_unique_name = ensure_unique_name)
-                       
+
                        if(length(useragreement) > 0)
-                               body <- jsonlite::toJSON(list(useragreement = useragreement), 
+                               body <- jsonlite::toJSON(list(useragreement = useragreement),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5549,23 +5549,23 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        if(length(useragreement) > 0)
-                               body <- jsonlite::toJSON(list(useragreement = useragreement), 
+                               body <- jsonlite::toJSON(list(useragreement = useragreement),
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
-                       
+
                        response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5573,19 +5573,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5593,19 +5593,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/signatures")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5613,19 +5613,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/sign")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5636,21 +5636,21 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
                                                          limit = limit, offset = offset, count = count)
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
@@ -5658,19 +5658,19 @@ Arvados <- R6::R6Class(
                {
                        endPoint <- stringr::str_interp("user_agreements/new")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("OAuth2", private$token),
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
-                       
+
                        body <- NULL
-                       
+
                        response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
-                       
+
                        if(!is.null(resource$errors))
                                stop(resource$errors)
-                       
+
                        resource
                },
 
index 8f737831c4634cc09a3121a86e04dcbf0361946b..1071302892690a659370d41afaa4336316678362 100644 (file)
@@ -5,9 +5,9 @@
 source("./R/util.R")
 
 #' ArvadosFile
-#' 
+#'
 #' ArvadosFile class represents a file inside Arvados collection.
-#' 
+#'
 #' @section Usage:
 #' \preformatted{file = ArvadosFile$new(name)}
 #'
@@ -15,7 +15,7 @@ source("./R/util.R")
 #' \describe{
 #'   \item{name}{Name of the file.}
 #' }
-#' 
+#'
 #' @section Methods:
 #' \describe{
 #'   \item{getName()}{Returns name of the file.}
@@ -37,7 +37,7 @@ source("./R/util.R")
 #' myFile$write("This is new file content")
 #' fileContent <- myFile$read()
 #' fileContent <- myFile$read("text")
-#' fileContent <- myFile$read("raw", offset = 8, length = 4) 
+#' fileContent <- myFile$read("raw", offset = 8, length = 4)
 #'
 #' #Write a table:
 #' arvConnection <- myFile$connection("w")
@@ -141,14 +141,14 @@ ArvadosFile <- R6::R6Class(
 
         connection = function(rw)
         {
-            if (rw == "r" || rw == "rb") 
+            if (rw == "r" || rw == "rb")
             {
                 REST <- private$collection$getRESTService()
-                return(REST$getConnection(private$collection$uuid,
-                                          self$getRelativePath(),
+                return(REST$getConnection(self$getRelativePath(),
+                                          private$collection$uuid,
                                           rw))
             }
-            else if (rw == "w") 
+            else if (rw == "w")
             {
                 private$buffer <- textConnection(NULL, "w")
 
@@ -156,7 +156,7 @@ ArvadosFile <- R6::R6Class(
             }
         },
 
-        flush = function() 
+        flush = function()
         {
             v <- textConnectionValue(private$buffer)
             close(private$buffer)
@@ -255,7 +255,7 @@ ArvadosFile <- R6::R6Class(
 #'
 #' @param x Instance of ArvadosFile class
 #' @param ... Optional arguments.
-#' @export 
+#' @export
 print.ArvadosFile = function(x, ...)
 {
     collection   <- NULL
index e23da138329786cba49e3a8001479461dd30be77..833b833c80f367ef59d4ca82ef78784e278cf73d 100644 (file)
@@ -8,9 +8,9 @@ source("./R/RESTService.R")
 source("./R/util.R")
 
 #' Collection
-#' 
+#'
 #' Collection class provides interface for working with Arvados collections.
-#' 
+#'
 #' @section Usage:
 #' \preformatted{collection = Collection$new(arv, uuid)}
 #'
@@ -19,7 +19,7 @@ source("./R/util.R")
 #'   \item{arv}{Arvados object.}
 #'   \item{uuid}{UUID of a collection.}
 #' }
-#' 
+#'
 #' @section Methods:
 #' \describe{
 #'   \item{add(content)}{Adds ArvadosFile or Subcollection specified by content to the collection.}
@@ -60,7 +60,7 @@ Collection <- R6::R6Class(
                uuid = NULL,
         # api  = NULL,
 
-               initialize = function(api, uuid) 
+               initialize = function(api, uuid)
         {
             # self$api <- api
             private$REST <- api$getRESTService()
@@ -121,7 +121,7 @@ Collection <- R6::R6Class(
             }
             else
             {
-                relativePath  <- trimFromEnd(relativePath, "/") 
+                relativePath  <- trimFromEnd(relativePath, "/")
                 subcollection <- self$get(relativePath)
             }
 
@@ -148,7 +148,7 @@ Collection <- R6::R6Class(
                 else
                     return(arvadosFiles)
             }
-            else 
+            else
             {
                 stop(paste0("Expected character vector, got ",
                             paste0("(", paste0(class(fileNames), collapse = ", "), ")"),
@@ -181,7 +181,7 @@ Collection <- R6::R6Class(
 
                 "Content removed"
             }
-            else 
+            else
             {
                 stop(paste0("Expected character vector, got ",
                             paste0("(", paste0(class(paths), collapse = ", "), ")"),
@@ -221,14 +221,14 @@ Collection <- R6::R6Class(
             private$tree$getElement(relativePath)
         },
 
-               toJSON = function() 
+               toJSON = function()
         {
                        fields <- sapply(private$classFields, function(field)
                        {
                                self[[field]]
                        }, USE.NAMES = TRUE)
-                       
-                       jsonlite::toJSON(list("collection" = 
+
+                       jsonlite::toJSON(list("collection" =
                      Filter(Negate(is.null), fields)), auto_unbox = TRUE)
                },
 
@@ -275,7 +275,7 @@ Collection <- R6::R6Class(
 #'
 #' @param x Instance of Collection class
 #' @param ... Optional arguments.
-#' @export 
+#' @export
 print.Collection = function(x, ...)
 {
     cat(paste0("Type: ", "\"", "Arvados Collection", "\""), sep = "\n")
index 8686f88c1a8a3c55b695351b9993df55939d0f1a..8b2f8876b0f91a0d86e148f81f1d29d87ab2f479 100644 (file)
@@ -19,7 +19,7 @@ CollectionTree <- R6::R6Class(
             treeBranches <- sapply(fileContent, function(filePath)
             {
                 splitPath <- unlist(strsplit(filePath, "/", fixed = TRUE))
-                branch <- private$createBranch(splitPath)      
+                branch <- private$createBranch(splitPath)
             })
 
             root <- Subcollection$new("")
@@ -80,7 +80,7 @@ CollectionTree <- R6::R6Class(
                     branch <- newFolder
                 }
             }
-            
+
             branch
         },
 
@@ -94,10 +94,10 @@ CollectionTree <- R6::R6Class(
             }
             else
             {
-                # Note: REST always returns folder name alone before other folder 
+                # Note: REST always returns folder name alone before other folder
                 # content, so in first iteration we don't know if it's a file
-                # or folder since its just a name, so we assume it's a file. 
-                # If we encounter that same name again we know 
+                # or folder since its just a name, so we assume it's a file.
+                # If we encounter that same name again we know
                 # it's a folder so we need to replace ArvadosFile with Subcollection.
                 if("ArvadosFile" %in% class(child))
                 {
index 8ce68f3837f158486534c6adc55e4ff23e9386e1..cd492166a139bf56dccebf732f2533c443440cf7 100644 (file)
@@ -10,12 +10,12 @@ HttpParser <- R6::R6Class(
 
         validContentTypes = NULL,
 
-        initialize = function() 
+        initialize = function()
         {
             self$validContentTypes <- c("text", "raw")
         },
 
-        parseJSONResponse = function(serverResponse) 
+        parseJSONResponse = function(serverResponse)
         {
             parsed_response <- httr::content(serverResponse,
                                              as = "parsed",
@@ -41,7 +41,7 @@ HttpParser <- R6::R6Class(
             result[-1]
         },
 
-        getFileSizesFromResponse = function(response, uri)    
+        getFileSizesFromResponse = function(response, uri)
         {
             text <- rawToChar(response$content)
             doc <- XML::xmlParse(text, asText=TRUE)
index 95dd375debe5ce076638c55de49a57db1f2d8f0d..4595fef662c1c9422af13dc0222a10bd9a9df48a 100644 (file)
@@ -13,7 +13,7 @@ HttpRequest <- R6::R6Class(
         validContentTypes = NULL,
         validVerbs = NULL,
 
-        initialize = function() 
+        initialize = function()
         {
             self$validContentTypes <- c("text", "raw")
             self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE")
@@ -30,7 +30,7 @@ HttpRequest <- R6::R6Class(
 
             config <- httr::add_headers(unlist(headers))
             if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
-               config$options = list(ssl_verifypeer = FALSE)
+               config$options = list(ssl_verifypeer = 0L)
 
             # times = 1 regular call + numberOfRetries
             response <- httr::RETRY(verb, url = url, body = body,
@@ -58,6 +58,17 @@ HttpRequest <- R6::R6Class(
             }
 
             return("")
+        },
+
+        getConnection = function(url, headers, openMode)
+        {
+            h <- curl::new_handle()
+            curl::handle_setheaders(h, .list = headers)
+
+            if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
+               curl::handle_setopt(h, ssl_verifypeer = 0L)
+
+            conn <- curl::curl(url = url, open = openMode, handle = h)
         }
     ),
 
index ac65d0df3f37b6baa6031bc8cbab71b163e27a76..867665299f49899909167c4fd838bc9ae1371dd8 100644 (file)
@@ -66,7 +66,7 @@ RESTService <- R6::R6Class(
         {
             fileURL <- paste0(self$getWebDavHostName(), "c=",
                               uuid, "/", relativePath);
-            headers <- list(Authorization = paste("OAuth2", self$token)) 
+            headers <- list(Authorization = paste("OAuth2", self$token))
 
             serverResponse <- self$http$exec("DELETE", fileURL, headers,
                                              retryTimes = self$numRetries)
@@ -186,18 +186,13 @@ RESTService <- R6::R6Class(
             self$httpParser$parseResponse(serverResponse, "text")
         },
 
-        getConnection = function(uuid, relativePath, openMode)
+        getConnection = function(relativePath, uuid, openMode)
         {
-            fileURL <- paste0(self$getWebDavHostName(), 
+            fileURL <- paste0(self$getWebDavHostName(),
                               "c=", uuid, "/", relativePath);
             headers <- list(Authorization = paste("OAuth2", self$token))
 
-            h <- curl::new_handle()
-            curl::handle_setheaders(h, .list = headers)
-
-            conn <- curl::curl(url = fileURL, open = openMode, handle = h)
-
-            conn
+            conn <- self$http$getConnection(fileURL, headers, openMode)
         }
     ),
 
@@ -210,7 +205,7 @@ RESTService <- R6::R6Class(
         {
             fileURL <- paste0(self$getWebDavHostName(), "c=",
                               uuid, "/", relativePath)
-            headers <- list(Authorization = paste("OAuth2", self$token), 
+            headers <- list(Authorization = paste("OAuth2", self$token),
                             "Content-Type" = contentType)
             body <- NULL
 
index 60714a4ad835b9bc201fb780bb38b5fb8a81461c..45fe34347903192bed1d8618e14aceedf73a18f2 100644 (file)
@@ -5,10 +5,10 @@
 source("./R/util.R")
 
 #' Subcollection
-#' 
+#'
 #' Subcollection class represents a folder inside Arvados collection.
 #' It is essentially a composite of arvadosFiles and other subcollections.
-#' 
+#'
 #' @section Usage:
 #' \preformatted{subcollection = Subcollection$new(name)}
 #'
@@ -16,7 +16,7 @@ source("./R/util.R")
 #' \describe{
 #'   \item{name}{Name of the subcollection.}
 #' }
-#' 
+#'
 #' @section Methods:
 #' \describe{
 #'   \item{getName()}{Returns name of the subcollection.}
@@ -56,7 +56,7 @@ Subcollection <- R6::R6Class(
         },
 
         getName = function() private$name,
-        
+
         getRelativePath = function()
         {
             relativePath <- c(private$name)
@@ -87,7 +87,7 @@ Subcollection <- R6::R6Class(
                                "or Subcollection with same name."))
 
                 if(!is.null(private$collection))
-                {       
+                {
                     if(self$getRelativePath() != "")
                         contentPath <- paste0(self$getRelativePath(),
                                               "/", content$getFileListing())
@@ -302,7 +302,7 @@ Subcollection <- R6::R6Class(
             content
         }
     ),
-    
+
     cloneable = FALSE
 )
 
@@ -312,7 +312,7 @@ Subcollection <- R6::R6Class(
 #'
 #' @param x Instance of Subcollection class
 #' @param ... Optional arguments.
-#' @export 
+#' @export
 print.Subcollection = function(x, ...)
 {
     collection   <- NULL
index 3e8c2fa0cf2b1494c33a7246a9f97a8669a3b514..1aef20b6cb90fe11d7440219bbe24d464af988c2 100644 (file)
@@ -343,7 +343,7 @@ genMethodsDoc <- function(methodResources, resourceNames)
     }, methodResources, resourceNames)))
 
     projectDoc <- genProjectMethodsDoc()
-    
+
     c(methodsDoc, projectDoc)
 }
 
@@ -401,10 +401,10 @@ getAPIClassMethodList <- function(methodResources, resourceNames)
                methodNames[!(methodNames %in% c("index", "show", "destroy"))])
 
     }, methodResources, resourceNames)))
-    
+
     hardcodedMethods <- c("projects.create", "projects.get",
                           "projects.list", "projects.update", "projects.delete")
-    paste0("#' \t\\item{}{\\code{\\link{", sort(c(methodList, hardcodedMethods)), "}}}") 
+    paste0("#' \t\\item{}{\\code{\\link{", sort(c(methodList, hardcodedMethods)), "}}}")
 }
 
 getMethodDoc <- function(methodName, methodMetaData)
@@ -447,7 +447,7 @@ getMethodDescription <- function(methodMetaData)
                                  className <- sapply(prop, function(ref) ref)
                                  objectName <- paste0(tolower(substr(className, 1, 1)),
                                                       substr(className, 2, nchar(className)))
-                                 paste("#' @param", objectName, className, "object.") 
+                                 paste("#' @param", objectName, className, "object.")
                              })))
     }
 
@@ -457,7 +457,7 @@ getMethodDescription <- function(methodMetaData)
     {
         arg <- methodMetaData$parameters[[argName]]
         argDescription <- arg$description
-        paste("#' @param", argName, argDescription) 
+        paste("#' @param", argName, argDescription)
     })))
 
     c(requestDoc, argsDoc)
@@ -541,7 +541,7 @@ formatArgs <- function(prependAtStart, prependToEachSplit,
 {
     if(length(args) > 1)
     {
-        args[1:(length(args) - 1)] <- paste0(args[1:(length(args) - 1)], ",") 
+        args[1:(length(args) - 1)] <- paste0(args[1:(length(args) - 1)], ",")
     }
 
     args[1] <- paste0(prependAtStart, args[1])
@@ -564,12 +564,12 @@ formatArgs <- function(prependAtStart, prependToEachSplit,
 
         argLines <- c(argLines, line)
     }
-    
+
     argLines <- unlist(argLines)
     argLinesLen <- length(argLines)
 
     if(argLinesLen > 1)
-        argLines[2:argLinesLen] <- paste0(prependToEachSplit, argLines[2:argLinesLen]) 
+        argLines[2:argLinesLen] <- paste0(prependToEachSplit, argLines[2:argLinesLen])
 
     argLines
 }
index c97572c193f1eadbd315928fb09d56aff5e2d7a2..c23283989a9c982146168a4ec883a670bd2e7510 100644 (file)
@@ -11,13 +11,13 @@ FakeHttpParser <- R6::R6Class(
         validContentTypes = NULL,
         parserCallCount = NULL,
 
-        initialize = function() 
+        initialize = function()
         {
             self$parserCallCount <- 0
             self$validContentTypes <- c("text", "raw")
         },
 
-        parseJSONResponse = function(serverResponse) 
+        parseJSONResponse = function(serverResponse)
         {
             self$parserCallCount <- self$parserCallCount + 1
 
@@ -47,7 +47,7 @@ FakeHttpParser <- R6::R6Class(
             serverResponse
         },
 
-        getFileSizesFromResponse = function(serverResponse, uri)    
+        getFileSizesFromResponse = function(serverResponse, uri)
         {
             self$parserCallCount <- self$parserCallCount + 1
 
index 2633abdf2c745bf0e4c9afcee1b73b7c5751fbeb..2ebcda2e4d671dc91cef9ca6ca0cdcb6a2707e18 100644 (file)
@@ -22,11 +22,12 @@ FakeHttpRequest <- R6::R6Class(
         JSONEncodedBodyIsProvided               = NULL,
         requestBodyIsProvided                   = NULL,
 
-        numberOfGETRequests    = NULL,
-        numberOfDELETERequests = NULL,
-        numberOfPUTRequests    = NULL,
-        numberOfPOSTRequests   = NULL,
-        numberOfMOVERequests   = NULL,
+        numberOfGETRequests        = NULL,
+        numberOfDELETERequests     = NULL,
+        numberOfPUTRequests        = NULL,
+        numberOfPOSTRequests       = NULL,
+        numberOfMOVERequests       = NULL,
+        numberOfgetConnectionCalls = NULL,
 
         initialize = function(expectedURL      = NULL,
                               serverResponse   = NULL,
@@ -57,6 +58,8 @@ FakeHttpRequest <- R6::R6Class(
             self$numberOfPOSTRequests   <- 0
             self$numberOfMOVERequests   <- 0
 
+            self$numberOfgetConnectionCalls <- 0
+
             self$serverMaxElementsPerRequest <- 5
         },
 
@@ -87,18 +90,24 @@ FakeHttpRequest <- R6::R6Class(
                 return(private$getElements(offset, limit))
             else
                 return(self$content)
+        },
+
+        getConnection = function(url, headers, openMode)
+        {
+            self$numberOfgetConnectionCalls <- self$numberOfgetConnectionCalls + 1
+            c(url, headers, openMode)
         }
     ),
 
     private = list(
 
-        validateURL = function(url) 
+        validateURL = function(url)
         {
             if(!is.null(self$expectedURL) && url == self$expectedURL)
                 self$URLIsProperlyConfigured <- TRUE
         },
 
-        validateHeaders = function(headers) 
+        validateHeaders = function(headers)
         {
             if(!is.null(headers$Authorization))
                 self$requestHeaderContainsAuthorizationField <- TRUE
@@ -115,11 +124,11 @@ FakeHttpRequest <- R6::R6Class(
 
         validateBody = function(body)
         {
-            if(!is.null(body))           
+            if(!is.null(body))
             {
                 self$requestBodyIsProvided <- TRUE
 
-                if(class(body) == "json")           
+                if(class(body) == "json")
                     self$JSONEncodedBodyIsProvided <- TRUE
             }
         },
@@ -143,7 +152,7 @@ FakeHttpRequest <- R6::R6Class(
             {
                 if(offset > self$content$items_available)
                     stop("Invalid offset")
-                
+
                 start <- offset + 1
             }
 
index 08e8717de5e4b97b5776c2c6cc8893c523f4c133..048013f566a3c737188dc04f876bee6d9ae8dd90 100644 (file)
@@ -153,14 +153,14 @@ FakeRESTService <- R6::R6Class(
             self$returnContent
         },
 
-        write = function(uuid, relativePath, content, contentType)
+        write = function(relativePath, uuid, content, contentType)
         {
             self$writeBuffer <- content
             self$writeCallCount <- self$writeCallCount + 1
             self$returnContent
         },
 
-        getConnection = function(relativePath, uuid, openMode)
+        getConnection = function(uuid, relativePath, openMode)
         {
             self$getConnectionCallCount <- self$getConnectionCallCount + 1
             self$returnContent
index fb14888aab91b982d88dbdddca0be9589f757fb8..1f559e999c52be207317b1f9f6f17332ab287ac0 100644 (file)
@@ -9,30 +9,30 @@ context("ArvadosFile")
 test_that("constructor raises error if  file name is empty string", {
 
     expect_that(ArvadosFile$new(""), throws_error("Invalid name."))
-}) 
+})
 
 test_that("getFileListing always returns file name", {
 
     dog <- ArvadosFile$new("dog")
 
     expect_that(dog$getFileListing(), equals("dog"))
-}) 
+})
 
 test_that("get always returns NULL", {
 
     dog <- ArvadosFile$new("dog")
-    
+
     responseIsNull <- is.null(dog$get("something"))
     expect_that(responseIsNull, is_true())
-}) 
+})
 
 test_that("getFirst always returns NULL", {
 
     dog <- ArvadosFile$new("dog")
-    
+
     responseIsNull <- is.null(dog$getFirst())
     expect_that(responseIsNull, is_true())
-}) 
+})
 
 test_that(paste("getSizeInBytes returns zero if arvadosFile",
                 "is not part of a collection"), {
@@ -40,7 +40,7 @@ test_that(paste("getSizeInBytes returns zero if arvadosFile",
     dog <- ArvadosFile$new("dog")
 
     expect_that(dog$getSizeInBytes(), equals(0))
-}) 
+})
 
 test_that(paste("getSizeInBytes delegates size calculation",
                 "to REST service class"), {
@@ -57,7 +57,7 @@ test_that(paste("getSizeInBytes delegates size calculation",
     resourceSize <- fish$getSizeInBytes()
 
     expect_that(resourceSize, equals(100))
-}) 
+})
 
 test_that("getRelativePath returns path relative to the tree root", {
 
@@ -69,7 +69,7 @@ test_that("getRelativePath returns path relative to the tree root", {
     fish$add(shark)
 
     expect_that(shark$getRelativePath(), equals("animal/fish/shark"))
-}) 
+})
 
 test_that("read raises exception if file doesn't belong to a collection", {
 
@@ -77,7 +77,7 @@ test_that("read raises exception if file doesn't belong to a collection", {
 
     expect_that(dog$read(),
                 throws_error("ArvadosFile doesn't belong to any collection."))
-}) 
+})
 
 test_that("read raises exception offset or length is negative number", {
 
@@ -96,7 +96,7 @@ test_that("read raises exception offset or length is negative number", {
                 throws_error("Offset and length must be positive values."))
     expect_that(fish$read(contentType = "text", offset = -1, length = -1),
                 throws_error("Offset and length must be positive values."))
-}) 
+})
 
 test_that("read delegates reading operation to REST service class", {
 
@@ -108,15 +108,15 @@ test_that("read delegates reading operation to REST service class", {
     api$setRESTService(fakeREST)
     collection <- Collection$new(api, "myUUID")
     fish <- collection$get("animal/fish")
-    
+
     fileContent <- fish$read("text")
 
     expect_that(fileContent, equals("my file"))
     expect_that(fakeREST$readCallCount, equals(1))
-}) 
+})
 
 test_that(paste("connection delegates connection creation ro RESTService class",
-                "which returns curl connection opened in read mode when", 
+                "which returns curl connection opened in read mode when",
                 "'r' of 'rb' is passed as argument"), {
 
     collectionContent <- c("animal", "animal/fish")
@@ -130,7 +130,7 @@ test_that(paste("connection delegates connection creation ro RESTService class",
     connection <- fish$connection("r")
 
     expect_that(fakeREST$getConnectionCallCount, equals(1))
-}) 
+})
 
 test_that(paste("connection returns textConnection opened",
                 "in write mode when 'w' is passed as argument"), {
@@ -152,7 +152,7 @@ test_that(paste("connection returns textConnection opened",
 
     expect_that(writeResult[1], equals("file"))
     expect_that(writeResult[2], equals("content"))
-}) 
+})
 
 test_that("flush sends data stored in a connection to a REST server", {
 
@@ -172,7 +172,7 @@ test_that("flush sends data stored in a connection to a REST server", {
     fish$flush()
 
     expect_that(fakeREST$writeBuffer, equals("file content"))
-}) 
+})
 
 test_that("write raises exception if file doesn't belong to a collection", {
 
@@ -180,7 +180,7 @@ test_that("write raises exception if file doesn't belong to a collection", {
 
     expect_that(dog$write(),
                 throws_error("ArvadosFile doesn't belong to any collection."))
-}) 
+})
 
 test_that("write delegates writing operation to REST service class", {
 
@@ -192,11 +192,11 @@ test_that("write delegates writing operation to REST service class", {
     api$setRESTService(fakeREST)
     collection <- Collection$new(api, "myUUID")
     fish <- collection$get("animal/fish")
-    
+
     fileContent <- fish$write("new file content")
 
     expect_that(fakeREST$writeBuffer, equals("new file content"))
-}) 
+})
 
 test_that(paste("move raises exception if arvados file",
                 "doesn't belong to any collection"), {
@@ -205,7 +205,7 @@ test_that(paste("move raises exception if arvados file",
 
     expect_that(animal$move("new/location"),
                 throws_error("ArvadosFile doesn't belong to any collection"))
-}) 
+})
 
 test_that(paste("move raises exception if newLocationInCollection",
                 "parameter is invalid"), {
@@ -227,7 +227,7 @@ test_that(paste("move raises exception if newLocationInCollection",
 
     expect_that(dog$move("objects/dog"),
                 throws_error("Unable to get destination subcollection"))
-}) 
+})
 
 test_that("move raises exception if new location contains content with the same name", {
 
@@ -248,7 +248,7 @@ test_that("move raises exception if new location contains content with the same
     expect_that(dog$move("dog"),
                 throws_error("Destination already contains content with same name."))
 
-}) 
+})
 
 test_that("move moves arvados file inside collection tree", {
 
index c3c70910e4c63acea6d86f5df71cc9bab9f3e72f..af5fabeb73c82c99cfee67e935a1ebfa8e61fd2c 100644 (file)
@@ -100,7 +100,7 @@ test_that("create raises exception if passed argumet is not character vector", {
     collection <- Collection$new(api, "myUUID")
 
     expect_that(collection$create(10),
-                throws_error("Expected character vector, got (numeric).", 
+                throws_error("Expected character vector, got (numeric).",
                              fixed = TRUE))
 })
 
@@ -156,7 +156,7 @@ test_that("remove raises exception if passed argumet is not character vector", {
     collection <- Collection$new(api, "myUUID")
 
     expect_that(collection$remove(10),
-                throws_error("Expected character vector, got (numeric).", 
+                throws_error("Expected character vector, got (numeric).",
                              fixed = TRUE))
 })
 
@@ -238,7 +238,7 @@ test_that("getFileListing returns sorted collection content received from REST s
     api$setRESTService(fakeREST)
     collection <- Collection$new(api, "myUUID")
 
-    contentMatchExpected <- all(collection$getFileListing() == 
+    contentMatchExpected <- all(collection$getFileListing() ==
                                 c("animal", "animal/fish", "ball"))
 
     expect_that(contentMatchExpected, is_true())
index 5c8a40526988bb562c45b5702fd921a743f0a77c..1a3aefecd012325658ad408ee2a699682907dbaf 100644 (file)
@@ -7,7 +7,7 @@ context("CollectionTree")
 test_that("constructor creates file tree from character array properly", {
 
     collection <- "myCollection"
-    characterArray <- c("animal", 
+    characterArray <- c("animal",
                         "animal/dog",
                         "boat")
 
@@ -44,12 +44,12 @@ test_that("constructor creates file tree from character array properly", {
     expect_that(boatIsOfTypeArvadosFile, is_true())
     expect_that(boatsParentIsRoot, is_true())
     expect_that(allElementsBelongToSameCollection, is_true())
-}) 
+})
 
 test_that("getElement returns element from tree if element exists on specified path", {
 
     collection <- "myCollection"
-    characterArray <- c("animal", 
+    characterArray <- c("animal",
                         "animal/dog",
                         "boat")
 
@@ -58,12 +58,12 @@ test_that("getElement returns element from tree if element exists on specified p
     dog <- collectionTree$getElement("animal/dog")
 
     expect_that(dog$getName(), equals("dog"))
-}) 
+})
 
 test_that("getElement returns NULL from tree if element doesn't exists on specified path", {
 
     collection <- "myCollection"
-    characterArray <- c("animal", 
+    characterArray <- c("animal",
                         "animal/dog",
                         "boat")
 
@@ -73,12 +73,12 @@ test_that("getElement returns NULL from tree if element doesn't exists on specif
     fishIsNULL <- is.null(fish)
 
     expect_that(fishIsNULL, is_true())
-}) 
+})
 
 test_that("getElement trims ./ from start of relativePath", {
 
     collection <- "myCollection"
-    characterArray <- c("animal", 
+    characterArray <- c("animal",
                         "animal/dog",
                         "boat")
 
@@ -88,12 +88,12 @@ test_that("getElement trims ./ from start of relativePath", {
     dogWithDotSlash <- collectionTree$getElement("./animal/dog")
 
     expect_that(dogWithDotSlash$getName(), equals(dog$getName()))
-}) 
+})
 
 test_that("getElement trims / from end of relativePath", {
 
     collection <- "myCollection"
-    characterArray <- c("animal", 
+    characterArray <- c("animal",
                         "animal/dog",
                         "boat")
 
@@ -103,4 +103,4 @@ test_that("getElement trims / from end of relativePath", {
     animalWithSlash <- collectionTree$getElement("animal/")
 
     expect_that(animalWithSlash$getName(), equals(animal$getName()))
-}) 
+})
index a119d88bf82fa226e26d5127f3ae001d1b515a2e..82c0fb0dd2fed88598e8fd14a8dd88a11d065b71 100644 (file)
@@ -20,7 +20,7 @@ test_that("parseJSONResponse generates and returns JSON object from server respo
 
     expect_that(barExists, is_true())
     expect_that(unlist(result$bar$foo), equals(10))
-}) 
+})
 
 test_that(paste("parseResponse generates and returns character vector",
                 "from server response if outputType is text"), {
@@ -35,10 +35,10 @@ test_that(paste("parseResponse generates and returns character vector",
     parsedResponse <- parser$parseResponse(serverResponse, "text")
 
     expect_that(parsedResponse, equals("random text"))
-}) 
+})
 
 
-webDAVResponseSample = 
+webDAVResponseSample =
     paste0("<?xml version=\"1.0\" encoding=\"UTF-8\"?><D:multistatus xmlns:",
            "D=\"DAV:\"><D:response><D:href>/c=aaaaa-bbbbb-ccccccccccccccc</D",
            ":href><D:propstat><D:prop><D:resourcetype><D:collection xmlns:D=",
@@ -76,7 +76,7 @@ test_that(paste("getFileNamesFromResponse returns file names belonging to specif
     resultMatchExpected <- all.equal(result, expectedResult)
 
     expect_that(resultMatchExpected, is_true())
-}) 
+})
 
 test_that(paste("getFileSizesFromResponse returns file sizes",
                 "parsed from webDAV server response"), {
@@ -93,4 +93,4 @@ test_that(paste("getFileSizesFromResponse returns file sizes",
     resultMatchExpected <- result == expectedResult
 
     expect_that(resultMatchExpected, is_true())
-}) 
+})
index 5ad8aa03115207035ee7f369ded5fbcd597e0ba7..f12463c805dda10e67325adb2a892d5223600932 100644 (file)
@@ -5,12 +5,12 @@
 context("Http Request")
 
 
-test_that("execyte raises exception if http verb is not valid", {
+test_that("execute raises exception if http verb is not valid", {
 
     http <- HttpRequest$new()
     expect_that(http$exec("FAKE VERB", "url"),
                throws_error("Http verb is not valid."))
-}) 
+})
 
 test_that("createQuery generates and encodes query portion of http", {
 
@@ -22,10 +22,87 @@ test_that("createQuery generates and encodes query portion of http", {
     expect_that(http$createQuery(queryParams),
                 equals(paste0("/?filters=%5B%5B%22color%22%2C%22%3D%22%2C%22red",
                               "%22%5D%5D&limit=20&offset=50")))
-}) 
+})
 
 test_that("createQuery generates and empty string when queryParams is an empty list", {
 
     http <- HttpRequest$new()
     expect_that(http$createQuery(list()), equals(""))
-}) 
+})
+
+test_that("exec calls httr functions correctly", {
+    httrNamespace <- getNamespace("httr")
+
+    # Monkeypatch httr functions and assert that they are called later
+    add_headersCalled <- FALSE
+    unlockBinding("add_headers", httrNamespace)
+    newAddHeaders <- function(h)
+    {
+        add_headersCalled <<- TRUE
+        list()
+    }
+    httrNamespace$add_headers <- newAddHeaders
+    lockBinding("add_headers", httrNamespace)
+
+    expectedConfig <- list()
+    retryCalled <- FALSE
+    unlockBinding("RETRY", httrNamespace)
+    newRETRY <- function(verb, url, body, config, times)
+    {
+        retryCalled <<- TRUE
+        expectedConfig <<- config
+    }
+    httrNamespace$RETRY <- newRETRY
+    lockBinding("RETRY", httrNamespace)
+
+    Sys.setenv("ARVADOS_API_HOST_INSECURE" = TRUE)
+    http <- HttpRequest$new()
+    http$exec("GET", "url")
+
+    expect_that(add_headersCalled, is_true())
+    expect_that(retryCalled, is_true())
+    expect_that(expectedConfig$options, equals(list(ssl_verifypeer = 0L)))
+})
+
+test_that("getConnection calls curl functions correctly", {
+    curlNamespace <- getNamespace("curl")
+
+    # Monkeypatch curl functions and assert that they are called later
+    curlCalled <- FALSE
+    unlockBinding("curl", curlNamespace)
+    newCurl <- function(url, open, handle) curlCalled <<- TRUE
+    curlNamespace$curl <- newCurl
+    lockBinding("curl", curlNamespace)
+
+    new_handleCalled <- FALSE
+    unlockBinding("new_handle", curlNamespace)
+    newHandleFun <- function()
+    {
+        new_handleCalled <<- TRUE
+        list()
+    }
+    curlNamespace$new_handle <- newHandleFun
+    lockBinding("new_handle", curlNamespace)
+
+    handle_setheadersCalled <- FALSE
+    unlockBinding("handle_setheaders", curlNamespace)
+    newHandleSetHeaders <- function(h, .list) handle_setheadersCalled <<- TRUE
+    curlNamespace$handle_setheaders <- newHandleSetHeaders
+    lockBinding("handle_setheaders", curlNamespace)
+
+    handle_setoptCalled <- FALSE
+    unlockBinding("handle_setopt", curlNamespace)
+    newHandleSetOpt <- function(h, ssl_verifypeer) handle_setoptCalled <<- TRUE
+    curlNamespace$handle_setopt <- newHandleSetOpt
+    lockBinding("handle_setopt", curlNamespace)
+
+
+    Sys.setenv("ARVADOS_API_HOST_INSECURE" = TRUE)
+    http <- HttpRequest$new()
+    http$getConnection("location", list(), "r")
+
+    expect_that(new_handleCalled, is_true())
+    expect_that(handle_setheadersCalled, is_true())
+    expect_that(handle_setoptCalled, is_true())
+    expect_that(curlCalled, is_true())
+})
index 859b6180f3380c2d834b99e126aa0c7761155368..26f459b17355903640676b7d4a717bd2c9052890 100644 (file)
@@ -22,7 +22,7 @@ test_that("getWebDavHostName calls REST service properly", {
     expect_that(httpRequest$URLIsProperlyConfigured, is_true())
     expect_that(httpRequest$requestHeaderContainsAuthorizationField, is_true())
     expect_that(httpRequest$numberOfGETRequests, equals(1))
-}) 
+})
 
 test_that("getWebDavHostName returns webDAV host name properly", {
 
@@ -32,8 +32,8 @@ test_that("getWebDavHostName returns webDAV host name properly", {
     REST <- RESTService$new("token", "host",
                             httpRequest, FakeHttpParser$new())
 
-    expect_that("https://myWebDavServer.com", equals(REST$getWebDavHostName())) 
-}) 
+    expect_that("https://myWebDavServer.com", equals(REST$getWebDavHostName()))
+})
 
 test_that("create calls REST service properly", {
 
@@ -51,7 +51,7 @@ test_that("create calls REST service properly", {
     expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(fakeHttp$numberOfPUTRequests, equals(1))
-}) 
+})
 
 test_that("create raises exception if server response code is not between 200 and 300", {
 
@@ -60,13 +60,13 @@ test_that("create raises exception if server response code is not between 200 an
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$create("file", uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 test_that("delete calls REST service properly", {
 
@@ -75,7 +75,7 @@ test_that("delete calls REST service properly", {
     fakeHttp <- FakeHttpRequest$new(expectedURL)
     fakeHttpParser <- FakeHttpParser$new()
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, fakeHttpParser,
                             0, "https://webDavHost/")
 
@@ -84,7 +84,7 @@ test_that("delete calls REST service properly", {
     expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(fakeHttp$numberOfDELETERequests, equals(1))
-}) 
+})
 
 test_that("delete raises exception if server response code is not between 200 and 300", {
 
@@ -99,7 +99,7 @@ test_that("delete raises exception if server response code is not between 200 an
 
     expect_that(REST$delete("file", uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 test_that("move calls REST service properly", {
 
@@ -108,7 +108,7 @@ test_that("move calls REST service properly", {
     fakeHttp <- FakeHttpRequest$new(expectedURL)
     fakeHttpParser <- FakeHttpParser$new()
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, fakeHttpParser,
                             0, "https://webDavHost/")
 
@@ -118,7 +118,7 @@ test_that("move calls REST service properly", {
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(fakeHttp$requestHeaderContainsDestinationField, is_true())
     expect_that(fakeHttp$numberOfMOVERequests, equals(1))
-}) 
+})
 
 test_that("move raises exception if server response code is not between 200 and 300", {
 
@@ -127,13 +127,13 @@ test_that("move raises exception if server response code is not between 200 and
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$move("file", "newDestination/file", uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 test_that("getCollectionContent retreives correct content from WebDAV server", {
 
@@ -145,7 +145,7 @@ test_that("getCollectionContent retreives correct content from WebDAV server", {
 
     fakeHttp <- FakeHttpRequest$new(expectedURL, returnContent)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
@@ -155,7 +155,7 @@ test_that("getCollectionContent retreives correct content from WebDAV server", {
 
     expect_that(returnedContentMatchExpected, is_true())
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-}) 
+})
 
 test_that("getCollectionContent raises exception if server returns empty response", {
 
@@ -163,26 +163,26 @@ test_that("getCollectionContent raises exception if server returns empty respons
     response <- ""
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$getCollectionContent(uuid),
                 throws_error("Response is empty, request may be misconfigured"))
-}) 
+})
 
 test_that("getCollectionContent parses server response", {
 
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
     fakeHttpParser <- FakeHttpParser$new()
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             FakeHttpRequest$new(), fakeHttpParser,
                             0, "https://webDavHost/")
 
     REST$getCollectionContent(uuid)
 
     expect_that(fakeHttpParser$parserCallCount, equals(1))
-}) 
+})
 
 test_that("getCollectionContent raises exception if server returns empty response", {
 
@@ -190,13 +190,13 @@ test_that("getCollectionContent raises exception if server returns empty respons
     response <- ""
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$getCollectionContent(uuid),
                 throws_error("Response is empty, request may be misconfigured"))
-}) 
+})
 
 test_that(paste("getCollectionContent raises exception if server",
                 "response code is not between 200 and 300"), {
@@ -206,13 +206,13 @@ test_that(paste("getCollectionContent raises exception if server",
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$getCollectionContent(uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 
 test_that("getResourceSize calls REST service properly", {
@@ -235,7 +235,7 @@ test_that("getResourceSize calls REST service properly", {
     expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(returnedContentMatchExpected, is_true())
-}) 
+})
 
 test_that("getResourceSize raises exception if server returns empty response", {
 
@@ -243,13 +243,13 @@ test_that("getResourceSize raises exception if server returns empty response", {
     response <- ""
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$getResourceSize("file", uuid),
                 throws_error("Response is empty, request may be misconfigured"))
-}) 
+})
 
 test_that(paste("getResourceSize raises exception if server",
                 "response code is not between 200 and 300"), {
@@ -259,26 +259,26 @@ test_that(paste("getResourceSize raises exception if server",
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$getResourceSize("file", uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 test_that("getResourceSize parses server response", {
 
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
     fakeHttpParser <- FakeHttpParser$new()
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             FakeHttpRequest$new(), fakeHttpParser,
                             0, "https://webDavHost/")
 
     REST$getResourceSize("file", uuid)
 
     expect_that(fakeHttpParser$parserCallCount, equals(1))
-}) 
+})
 
 test_that("read calls REST service properly", {
 
@@ -290,7 +290,7 @@ test_that("read calls REST service properly", {
 
     fakeHttp <- FakeHttpRequest$new(expectedURL, serverResponse)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
@@ -300,7 +300,7 @@ test_that("read calls REST service properly", {
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(fakeHttp$requestHeaderContainsRangeField, is_true())
     expect_that(returnResult, equals("file content"))
-}) 
+})
 
 test_that("read raises exception if server response code is not between 200 and 300", {
 
@@ -309,48 +309,48 @@ test_that("read raises exception if server response code is not between 200 and
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$read("file", uuid),
                 throws_error("Server code: 404"))
-}) 
+})
 
 test_that("read raises exception if contentType is not valid", {
 
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
     fakeHttp <- FakeHttpRequest$new()
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, HttpParser$new(),
                             0, "https://webDavHost/")
 
     expect_that(REST$read("file", uuid, "some invalid content type"),
                 throws_error("Invalid contentType. Please use text or raw."))
-}) 
+})
 
 test_that("read parses server response", {
 
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
     fakeHttpParser <- FakeHttpParser$new()
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             FakeHttpRequest$new(), fakeHttpParser,
                             0, "https://webDavHost/")
 
     REST$read("file", uuid, "text", 1024, 512)
 
     expect_that(fakeHttpParser$parserCallCount, equals(1))
-}) 
+})
 
 test_that("write calls REST service properly", {
 
-    fileContent <- "new file content" 
+    fileContent <- "new file content"
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
     expectedURL <- "https://webDavHost/c=aaaaa-j7d0g-ccccccccccccccc/file"
     fakeHttp <- FakeHttpRequest$new(expectedURL)
 
-    REST <- RESTService$new("token", "https://host/", 
+    REST <- RESTService$new("token", "https://host/",
                             fakeHttp, FakeHttpParser$new(),
                             0, "https://webDavHost/")
 
@@ -360,12 +360,12 @@ test_that("write calls REST service properly", {
     expect_that(fakeHttp$requestBodyIsProvided, is_true())
     expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
     expect_that(fakeHttp$requestHeaderContainsContentTypeField, is_true())
-}) 
+})
 
 test_that("write raises exception if server response code is not between 200 and 300", {
 
     uuid <- "aaaaa-j7d0g-ccccccccccccccc"
-    fileContent <- "new file content" 
+    fileContent <- "new file content"
     response <- list()
     response$status_code <- 404
     fakeHttp <- FakeHttpRequest$new(serverResponse = response)
@@ -376,4 +376,17 @@ test_that("write raises exception if server response code is not between 200 and
 
     expect_that(REST$write("file", uuid, fileContent, "text/html"),
                 throws_error("Server code: 404"))
-}) 
+})
+
+test_that("getConnection calls REST service properly", {
+    uuid <- "aaaaa-j7d0g-ccccccccccccccc"
+    fakeHttp <- FakeHttpRequest$new()
+
+    REST <- RESTService$new("token", "https://host/",
+                            fakeHttp, FakeHttpParser$new(),
+                            0, "https://webDavHost/")
+
+    REST$getConnection("file", uuid, "r")
+
+    expect_that(fakeHttp$numberOfgetConnectionCalls, equals(1))
+})
index e025586c58a968f6c0d61a47512087a69d601635..6845801e59abb8155736fddcf4d92595ef67f018 100644 (file)
@@ -15,7 +15,7 @@ test_that("getRelativePath returns path relative to the tree root", {
 
     expect_that(animal$getRelativePath(), equals("animal"))
     expect_that(fish$getRelativePath(), equals("animal/fish"))
-}) 
+})
 
 test_that(paste("getFileListing by default returns sorted path of all files",
                 "relative to the current subcollection"), {
@@ -38,7 +38,7 @@ test_that(paste("getFileListing by default returns sorted path of all files",
                     all(expectedResult == result)
 
     expect_that(resultsMatch, is_true())
-}) 
+})
 
 test_that(paste("getFileListing returns sorted names of all direct children",
                 "if fullPath is set to FALSE"), {
@@ -59,7 +59,7 @@ test_that(paste("getFileListing returns sorted names of all direct children",
                     all(expectedResult == result)
 
     expect_that(resultsMatch, is_true())
-}) 
+})
 
 test_that("add adds content to inside collection tree", {
 
@@ -75,7 +75,7 @@ test_that("add adds content to inside collection tree", {
 
     expect_that(animalContainsFish, is_true())
     expect_that(animalContainsDog, is_true())
-}) 
+})
 
 test_that("add raises exception if content name is empty string", {
 
@@ -86,7 +86,7 @@ test_that("add raises exception if content name is empty string", {
                 throws_error("Content has invalid name.", fixed = TRUE))
 })
 
-test_that(paste("add raises exception if ArvadosFile/Subcollection", 
+test_that(paste("add raises exception if ArvadosFile/Subcollection",
                 "with same name already exists in the subcollection"), {
 
     animal     <- Subcollection$new("animal")
@@ -102,9 +102,9 @@ test_that(paste("add raises exception if ArvadosFile/Subcollection",
     expect_that(animal$add(thirdFish),
                 throws_error(paste("Subcollection already contains ArvadosFile or",
                                    "Subcollection with same name."), fixed = TRUE))
-}) 
+})
 
-test_that(paste("add raises exception if passed argument is", 
+test_that(paste("add raises exception if passed argument is",
                 "not ArvadosFile or Subcollection"), {
 
     animal <- Subcollection$new("animal")
@@ -113,11 +113,11 @@ test_that(paste("add raises exception if passed argument is",
     expect_that(animal$add(number),
                 throws_error(paste("Expected AravodsFile or Subcollection object,",
                                    "got (numeric)."), fixed = TRUE))
-}) 
+})
 
-test_that(paste("add post content to a REST service", 
+test_that(paste("add post content to a REST service",
                 "if subcollection belongs to a collection"), {
-    
+
     collectionContent <- c("animal", "animal/fish")
     fakeREST <- FakeRESTService$new(collectionContent)
 
@@ -131,7 +131,7 @@ test_that(paste("add post content to a REST service",
     animal$add(dog)
 
     expect_that(fakeREST$createCallCount, equals(1))
-}) 
+})
 
 test_that("remove removes content from subcollection", {
 
@@ -144,9 +144,9 @@ test_that("remove removes content from subcollection", {
     returnValueAfterRemovalIsNull <- is.null(animal$get("fish"))
 
     expect_that(returnValueAfterRemovalIsNull, is_true())
-}) 
+})
 
-test_that(paste("remove raises exception", 
+test_that(paste("remove raises exception",
                 "if content to remove doesn't exist in the subcollection"), {
 
     animal <- Subcollection$new("animal")
@@ -154,7 +154,7 @@ test_that(paste("remove raises exception",
     expect_that(animal$remove("fish"),
                 throws_error(paste("Subcollection doesn't contains ArvadosFile",
                                    "or Subcollection with specified name.")))
-}) 
+})
 
 test_that("remove raises exception if passed argument is not character vector", {
 
@@ -164,11 +164,11 @@ test_that("remove raises exception if passed argument is not character vector",
     expect_that(animal$remove(number),
                 throws_error(paste("Expected character,",
                                    "got (numeric)."), fixed = TRUE))
-}) 
+})
 
-test_that(paste("remove removes content from REST service", 
+test_that(paste("remove removes content from REST service",
                 "if subcollection belongs to a collection"), {
-    
+
     collectionContent <- c("animal", "animal/fish", "animal/dog")
     fakeREST <- FakeRESTService$new(collectionContent)
 
@@ -180,9 +180,9 @@ test_that(paste("remove removes content from REST service",
     animal$remove("fish")
 
     expect_that(fakeREST$deleteCallCount, equals(1))
-}) 
+})
 
-test_that(paste("get returns ArvadosFile or Subcollection", 
+test_that(paste("get returns ArvadosFile or Subcollection",
                 "if file or folder with given name exists"), {
 
     animal <- Subcollection$new("animal")
@@ -203,9 +203,9 @@ test_that(paste("get returns ArvadosFile or Subcollection",
 
     expect_that(returnedDogIsArvadosFile, is_true())
     expect_that(returnedDog$getName(), equals("dog"))
-}) 
+})
 
-test_that(paste("get returns NULL if file or folder", 
+test_that(paste("get returns NULL if file or folder",
                 "with given name doesn't exists"), {
 
     animal <- Subcollection$new("animal")
@@ -216,7 +216,7 @@ test_that(paste("get returns NULL if file or folder",
     returnedDogIsNull <- is.null(animal$get("dog"))
 
     expect_that(returnedDogIsNull, is_true())
-}) 
+})
 
 test_that("getFirst returns first child in the subcollection", {
 
@@ -226,7 +226,7 @@ test_that("getFirst returns first child in the subcollection", {
     animal$add(fish)
 
     expect_that(animal$getFirst()$getName(), equals("fish"))
-}) 
+})
 
 test_that("getFirst returns NULL if subcollection contains no children", {
 
@@ -235,7 +235,7 @@ test_that("getFirst returns NULL if subcollection contains no children", {
     returnedElementIsNull <- is.null(animal$getFirst())
 
     expect_that(returnedElementIsNull, is_true())
-}) 
+})
 
 test_that(paste("setCollection by default sets collection",
                 "filed of subcollection and all its children"), {
@@ -248,7 +248,7 @@ test_that(paste("setCollection by default sets collection",
 
     expect_that(animal$getCollection(), equals("myCollection"))
     expect_that(fish$getCollection(), equals("myCollection"))
-}) 
+})
 
 test_that(paste("setCollection sets collection filed of subcollection only",
                 "if parameter setRecursively is set to FALSE"), {
@@ -262,7 +262,7 @@ test_that(paste("setCollection sets collection filed of subcollection only",
 
     expect_that(animal$getCollection(), equals("myCollection"))
     expect_that(fishCollectionIsNull, is_true())
-}) 
+})
 
 test_that(paste("move raises exception if subcollection",
                 "doesn't belong to any collection"), {
@@ -271,7 +271,7 @@ test_that(paste("move raises exception if subcollection",
 
     expect_that(animal$move("new/location"),
                 throws_error("Subcollection doesn't belong to any collection"))
-}) 
+})
 
 test_that("move raises exception if new location contains content with the same name", {
 
@@ -290,7 +290,7 @@ test_that("move raises exception if new location contains content with the same
     expect_that(fish$move("fish"),
                 throws_error("Destination already contains content with same name."))
 
-}) 
+})
 
 test_that(paste("move raises exception if newLocationInCollection",
                 "parameter is invalid"), {
@@ -310,7 +310,7 @@ test_that(paste("move raises exception if newLocationInCollection",
 
     expect_that(fish$move("objects/dog"),
                 throws_error("Unable to get destination subcollection"))
-}) 
+})
 
 test_that("move moves subcollection inside collection tree", {
 
@@ -332,7 +332,7 @@ test_that("move moves subcollection inside collection tree", {
 
     expect_that(fishIsNullOnOldLocation, is_true())
     expect_that(fishExistsOnNewLocation, is_true())
-}) 
+})
 
 test_that(paste("getSizeInBytes returns zero if subcollection",
                 "is not part of a collection"), {
@@ -340,7 +340,7 @@ test_that(paste("getSizeInBytes returns zero if subcollection",
     animal <- Subcollection$new("animal")
 
     expect_that(animal$getSizeInBytes(), equals(0))
-}) 
+})
 
 test_that(paste("getSizeInBytes delegates size calculation",
                 "to REST service class"), {
index 9f5e07c1767af6c089274a308dc3dc270fb25c2f..419e8785fdf53d0b7c0ef538e6dc9eeb8f7a8ee0 100644 (file)
@@ -26,7 +26,7 @@ test_that("listAll always returns all resource items from server", {
     result <- listAll(testFunction)
 
     expect_that(length(result), equals(8))
-}) 
+})
 
 test_that("trimFromStart trims string correctly if string starts with trimCharacters", {
 
@@ -36,7 +36,7 @@ test_that("trimFromStart trims string correctly if string starts with trimCharac
     result <- trimFromStart(sample, trimCharacters)
 
     expect_that(result, equals("random"))
-}) 
+})
 
 test_that("trimFromStart returns original string if string doesn't starts with trimCharacters", {
 
@@ -46,7 +46,7 @@ test_that("trimFromStart returns original string if string doesn't starts with t
     result <- trimFromStart(sample, trimCharacters)
 
     expect_that(result, equals("./something/random"))
-}) 
+})
 
 test_that("trimFromEnd trims string correctly if string ends with trimCharacters", {
 
@@ -56,7 +56,7 @@ test_that("trimFromEnd trims string correctly if string ends with trimCharacters
     result <- trimFromEnd(sample, trimCharacters)
 
     expect_that(result, equals("./something"))
-}) 
+})
 
 test_that("trimFromEnd returns original string if string doesn't end with trimCharacters", {
 
@@ -66,11 +66,11 @@ test_that("trimFromEnd returns original string if string doesn't end with trimCh
     result <- trimFromStart(sample, trimCharacters)
 
     expect_that(result, equals("./something/random"))
-}) 
+})
 
 test_that("RListToPythonList converts nested R list to char representation of Python list", {
 
-    sample <- list("insert", list("random", list("text")), list("here")) 
+    sample <- list("insert", list("random", list("text")), list("here"))
 
     result              <- RListToPythonList(sample)
     resultWithSeparator <- RListToPythonList(sample, separator = ",+")
@@ -78,7 +78,7 @@ test_that("RListToPythonList converts nested R list to char representation of Py
     expect_that(result, equals("[\"insert\", [\"random\", \"text\"], \"here\"]"))
     expect_that(resultWithSeparator,
                 equals("[\"insert\",+[\"random\",+\"text\"],+\"here\"]"))
-}) 
+})
 
 test_that("appendToStartIfNotExist appends characters to beginning of a string", {
 
@@ -88,7 +88,7 @@ test_that("appendToStartIfNotExist appends characters to beginning of a string",
     result <- appendToStartIfNotExist(sample, charactersToAppend)
 
     expect_that(result, equals("Happy New Year"))
-}) 
+})
 
 test_that(paste("appendToStartIfNotExist returns original string if string",
                 "doesn't start with specified characters"), {
@@ -99,7 +99,7 @@ test_that(paste("appendToStartIfNotExist returns original string if string",
     result <- appendToStartIfNotExist(sample, charactersToAppend)
 
     expect_that(result, equals("Happy New Year"))
-}) 
+})
 
 test_that(paste("splitToPathAndName splits relative path to file/folder",
                 "name and rest of the path"), {
@@ -110,4 +110,4 @@ test_that(paste("splitToPathAndName splits relative path to file/folder",
 
     expect_that(result$name, equals("file.exe"))
     expect_that(result$path, equals("path/to/my"))
-}) 
+})
index fd48b4852df4f1223eb7ce6fc125fc2234e78f6d..f84636e077e2e5785ed9aa4cb58940beba58cbfc 100644 (file)
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
   s.add_runtime_dependency 'json', '>= 1.7.7', '<3'
   s.add_runtime_dependency 'trollop', '~> 2.0'
   s.add_runtime_dependency 'andand', '~> 1.3', '>= 1.3.3'
-  s.add_runtime_dependency 'oj', '~> 2.0', '>= 2.0.3'
+  s.add_runtime_dependency 'oj', '~> 3.0'
   s.add_runtime_dependency 'curb', '~> 0.8'
   s.homepage    =
     'https://arvados.org'
index 3289c67b013f37a67ae8ddeaa52d3fd74abe34e5..c3d60309992c9368ba7a2d75586db58829c8f2c0 100644 (file)
@@ -162,19 +162,21 @@ func (d *Dispatcher) checkForUpdates(filters [][]interface{}, todo map[string]*r
        params := arvadosclient.Dict{
                "filters": filters,
                "order":   []string{"priority desc"}}
-
-       var list arvados.ContainerList
-       for offset, more := 0, true; more; offset += len(list.Items) {
+       offset := 0
+       for {
                params["offset"] = offset
+               var list arvados.ContainerList
                err := d.Arv.List("containers", params, &list)
                if err != nil {
                        log.Printf("Error getting list of containers: %q", err)
                        return false
                }
-               more = len(list.Items) > 0 && list.ItemsAvailable > len(list.Items)+offset
                d.checkListForUpdates(list.Items, todo)
+               offset += len(list.Items)
+               if len(list.Items) == 0 || list.ItemsAvailable <= offset {
+                       return true
+               }
        }
-       return true
 }
 
 func (d *Dispatcher) checkListForUpdates(containers []arvados.Container, todo map[string]*runTracker) {
diff --git a/sdk/go/httpserver/metrics.go b/sdk/go/httpserver/metrics.go
new file mode 100644 (file)
index 0000000..77525a8
--- /dev/null
@@ -0,0 +1,129 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+package httpserver
+
+import (
+       "net/http"
+       "strconv"
+       "strings"
+       "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/stats"
+       "github.com/Sirupsen/logrus"
+       "github.com/gogo/protobuf/jsonpb"
+       "github.com/prometheus/client_golang/prometheus"
+       "github.com/prometheus/client_golang/prometheus/promhttp"
+)
+
+type Handler interface {
+       http.Handler
+
+       // Returns an http.Handler that serves the Handler's metrics
+       // data at /metrics and /metrics.json, and passes other
+       // requests through to next.
+       ServeAPI(next http.Handler) http.Handler
+}
+
+type metrics struct {
+       next         http.Handler
+       logger       *logrus.Logger
+       registry     *prometheus.Registry
+       reqDuration  *prometheus.SummaryVec
+       timeToStatus *prometheus.SummaryVec
+       exportProm   http.Handler
+}
+
+func (*metrics) Levels() []logrus.Level {
+       return logrus.AllLevels
+}
+
+// Fire implements logrus.Hook in order to collect data points from
+// request logs.
+func (m *metrics) Fire(ent *logrus.Entry) error {
+       if tts, ok := ent.Data["timeToStatus"].(stats.Duration); !ok {
+       } else if method, ok := ent.Data["reqMethod"].(string); !ok {
+       } else if code, ok := ent.Data["respStatusCode"].(int); !ok {
+       } else {
+               m.timeToStatus.WithLabelValues(strconv.Itoa(code), strings.ToLower(method)).Observe(time.Duration(tts).Seconds())
+       }
+       return nil
+}
+
+func (m *metrics) exportJSON(w http.ResponseWriter, req *http.Request) {
+       jm := jsonpb.Marshaler{Indent: "  "}
+       mfs, _ := m.registry.Gather()
+       w.Write([]byte{'['})
+       for i, mf := range mfs {
+               if i > 0 {
+                       w.Write([]byte{','})
+               }
+               jm.Marshal(w, mf)
+       }
+       w.Write([]byte{']'})
+}
+
+// ServeHTTP implements http.Handler.
+func (m *metrics) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+       m.next.ServeHTTP(w, req)
+}
+
+// ServeAPI returns a new http.Handler that serves current data at
+// metrics API endpoints (currently "GET /metrics(.json)?") and passes
+// other requests through to next.
+//
+// Typical example:
+//
+//     m := Instrument(...)
+//     srv := http.Server{Handler: m.ServeAPI(m)}
+func (m *metrics) ServeAPI(next http.Handler) http.Handler {
+       return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+               switch {
+               case req.Method != "GET" && req.Method != "HEAD":
+                       next.ServeHTTP(w, req)
+               case req.URL.Path == "/metrics.json":
+                       m.exportJSON(w, req)
+               case req.URL.Path == "/metrics":
+                       m.exportProm.ServeHTTP(w, req)
+               default:
+                       next.ServeHTTP(w, req)
+               }
+       })
+}
+
+// Instrument returns a new Handler that passes requests through to
+// the next handler in the stack, and tracks metrics of those
+// requests.
+//
+// For the metrics to be accurate, the caller must ensure every
+// request passed to the Handler also passes through
+// LogRequests(logger, ...), and vice versa.
+func Instrument(logger *logrus.Logger, next http.Handler) Handler {
+       if logger == nil {
+               logger = logrus.StandardLogger()
+       }
+       reqDuration := prometheus.NewSummaryVec(prometheus.SummaryOpts{
+               Name: "request_duration_seconds",
+               Help: "Summary of request duration.",
+       }, []string{"code", "method"})
+       timeToStatus := prometheus.NewSummaryVec(prometheus.SummaryOpts{
+               Name: "time_to_status_seconds",
+               Help: "Summary of request TTFB.",
+       }, []string{"code", "method"})
+       registry := prometheus.NewRegistry()
+       registry.MustRegister(timeToStatus)
+       registry.MustRegister(reqDuration)
+       m := &metrics{
+               next:         promhttp.InstrumentHandlerDuration(reqDuration, next),
+               logger:       logger,
+               registry:     registry,
+               reqDuration:  reqDuration,
+               timeToStatus: timeToStatus,
+               exportProm: promhttp.HandlerFor(registry, promhttp.HandlerOpts{
+                       ErrorLog: logger,
+               }),
+       }
+       m.logger.AddHook(m)
+       return m
+}
index 7d4d4bba176591a97e2d166c6e291e4588dbe99e..135b8d1d07e1fc6332f1320f614744eef4054dcd 100644 (file)
@@ -32,7 +32,6 @@ gem 'pg', '~> 0.18'
 
 gem 'multi_json'
 gem 'oj'
-gem 'oj_mimic_json'
 
 # for building assets
 gem 'sass-rails',   '~> 4.0'
@@ -62,7 +61,6 @@ gem 'faye-websocket'
 gem 'themes_for_rails', git: 'https://github.com/curoverse/themes_for_rails'
 
 gem 'arvados', '>= 0.1.20150615153458'
-gem 'arvados-cli', '>= 0.1.20161017193526'
 gem 'httpclient'
 
 gem 'sshkey'
index a3ff8e78997855640e93aa479d92dd93cb36b012..1514ce1342064ce9698f3905047255692a3e1a5e 100644 (file)
@@ -58,15 +58,6 @@ GEM
       i18n (~> 0)
       json (>= 1.7.7, < 3)
       jwt (>= 0.1.5, < 2)
-    arvados-cli (1.1.4.20180412190507)
-      activesupport (>= 3.2.13, < 5)
-      andand (~> 1.3, >= 1.3.3)
-      arvados (~> 0.1, >= 0.1.20150128223554)
-      curb (~> 0.8)
-      google-api-client (~> 0.6, >= 0.6.3, < 0.8.9)
-      json (>= 1.7.7, < 3)
-      oj (~> 2.0, >= 2.0.3)
-      trollop (~> 2.0)
     autoparse (0.3.3)
       addressable (>= 2.3.1)
       extlib (>= 0.9.15)
@@ -87,7 +78,6 @@ GEM
     coffee-script-source (1.12.2)
     concurrent-ruby (1.0.5)
     crass (1.0.4)
-    curb (0.9.4)
     database_cleaner (1.7.0)
     erubis (2.7.0)
     eventmachine (1.2.6)
@@ -179,8 +169,7 @@ GEM
       multi_json (~> 1.3)
       multi_xml (~> 0.5)
       rack (>= 1.2, < 3)
-    oj (2.18.5)
-    oj_mimic_json (1.0.1)
+    oj (3.6.4)
     omniauth (1.4.3)
       hashie (>= 1.2, < 4)
       rack (>= 1.6.2, < 3)
@@ -292,7 +281,6 @@ DEPENDENCIES
   acts_as_api
   andand
   arvados (>= 0.1.20150615153458)
-  arvados-cli (>= 0.1.20161017193526)
   coffee-rails (~> 4.0)
   database_cleaner
   factory_girl_rails
@@ -304,7 +292,6 @@ DEPENDENCIES
   mocha
   multi_json
   oj
-  oj_mimic_json
   omniauth (~> 1.4.0)
   omniauth-oauth2 (~> 1.1)
   passenger
@@ -328,4 +315,4 @@ DEPENDENCIES
   uglifier (~> 2.0)
 
 BUNDLED WITH
-   1.16.1
+   1.16.2
diff --git a/services/api/config/initializers/oj_mimic_json.rb b/services/api/config/initializers/oj_mimic_json.rb
new file mode 100644 (file)
index 0000000..ce2d40c
--- /dev/null
@@ -0,0 +1,11 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+require 'oj'
+
+Oj::Rails.set_encoder()
+Oj::Rails.set_decoder()
+Oj::Rails.optimize()
+Oj::Rails.mimic_JSON()
+
index 3d690930ae18a1a4d1956f0872b37eec77d9d228..78cabc87ac7cd5f66a07becb1207be53ff6e2af3 100644 (file)
@@ -2,6 +2,8 @@
 #
 # SPDX-License-Identifier: AGPL-3.0
 
+ActiveSupport::JSON::Encoding.time_precision = 9
+
 class ActiveSupport::TimeWithZone
   remove_method :as_json
   def as_json *args
index f4da283d746fcbecba6a03ce54fa041f0e3f58de..f78a3d34dc5d00b2d47ac8b4f9634d319c5462bc 100644 (file)
@@ -7,6 +7,12 @@ class SafeJSON
     return Oj.dump(o, mode: :compat)
   end
   def self.load(s)
+    if s.nil? or s == ''
+      # Oj 2.18.5 used to return nil. Not anymore on 3.6.4.
+      # Upgraded for performance issues (see #13803 and
+      # https://github.com/ohler55/oj/issues/441)
+      return nil
+    end
     Oj.strict_load(s, symbol_keys: false)
   end
 end
index c834250cb6caa89c28ff25ad942978dd14399949..6dbaa7550f55a8e49b035e6092c331304c6e4edb 100644 (file)
@@ -143,7 +143,7 @@ class ActiveSupport::TestCase
   end
 
   def self.slow_test(name, &block)
-    define_method(name, block) unless skip_slow_tests?
+    test(name, &block) unless skip_slow_tests?
   end
 end
 
index 23a8a0ca01124df89575c5724a4b6cb6650527fb..719ec98d27aa19d65eceb7d3db3a46f506aed2f0 100644 (file)
@@ -55,11 +55,12 @@ func (s *IntegrationSuite) TearDownTest(c *C) {
 }
 
 type slurmFake struct {
-       didBatch   [][]string
-       didCancel  []string
-       didRelease []string
-       didRenice  [][]string
-       queue      string
+       didBatch      [][]string
+       didCancel     []string
+       didRelease    []string
+       didRenice     [][]string
+       queue         string
+       rejectNice10K bool
        // If non-nil, run this func during the 2nd+ call to Cancel()
        onCancel func()
        // Error returned by Batch()
@@ -82,6 +83,9 @@ func (sf *slurmFake) Release(name string) error {
 
 func (sf *slurmFake) Renice(name string, nice int64) error {
        sf.didRenice = append(sf.didRenice, []string{name, fmt.Sprintf("%d", nice)})
+       if sf.rejectNice10K && nice > 10000 {
+               return errors.New("scontrol: error: Invalid nice value, must be between -10000 and 10000")
+       }
        return nil
 }
 
index 742943f197580e186e7fd1f7b8084a1357f3661d..fd4851eb0a8a92b48fcacef0e4552ce99d0a7f48 100644 (file)
@@ -14,11 +14,14 @@ import (
        "time"
 )
 
+const slurm15NiceLimit int64 = 10000
+
 type slurmJob struct {
        uuid         string
        wantPriority int64
        priority     int64 // current slurm priority (incorporates nice value)
        nice         int64 // current slurm nice value
+       hitNiceLimit bool
 }
 
 // Squeue implements asynchronous polling monitor of the SLURM queue using the
@@ -103,10 +106,18 @@ func (sqc *SqueueChecker) reniceAll() {
        })
        renice := wantNice(jobs, sqc.PrioritySpread)
        for i, job := range jobs {
-               if renice[i] == job.nice {
+               niceNew := renice[i]
+               if job.hitNiceLimit && niceNew > slurm15NiceLimit {
+                       niceNew = slurm15NiceLimit
+               }
+               if niceNew == job.nice {
                        continue
                }
-               sqc.Slurm.Renice(job.uuid, renice[i])
+               err := sqc.Slurm.Renice(job.uuid, niceNew)
+               if err != nil && niceNew > slurm15NiceLimit && strings.Contains(err.Error(), "Invalid nice value") {
+                       log.Printf("container %q clamping nice values at %d, priority order will not be correct -- see https://dev.arvados.org/projects/arvados/wiki/SLURM_integration#Limited-nice-values-SLURM-15", job.uuid, slurm15NiceLimit)
+                       job.hitNiceLimit = true
+               }
        }
 }
 
@@ -157,14 +168,17 @@ func (sqc *SqueueChecker) check() {
                replacing.nice = n
                newq[uuid] = replacing
 
-               if state == "PENDING" && ((reason == "BadConstraints" && p == 0) || reason == "launch failed requeued held") && replacing.wantPriority > 0 {
+               if state == "PENDING" && ((reason == "BadConstraints" && p <= 2*slurm15NiceLimit) || reason == "launch failed requeued held") && replacing.wantPriority > 0 {
                        // When using SLURM 14.x or 15.x, our queued
                        // jobs land in this state when "scontrol
                        // reconfigure" invalidates their feature
                        // constraints by clearing all node features.
                        // They stay in this state even after the
                        // features reappear, until we run "scontrol
-                       // release {jobid}".
+                       // release {jobid}". Priority is usually 0 in
+                       // this state, but sometimes (due to a race
+                       // with nice adjustments?) it's a small
+                       // positive value.
                        //
                        // "scontrol release" is silent and successful
                        // regardless of whether the features have
@@ -175,7 +189,7 @@ func (sqc *SqueueChecker) check() {
                        // "launch failed requeued held" seems to be
                        // another manifestation of this problem,
                        // resolved the same way.
-                       log.Printf("releasing held job %q", uuid)
+                       log.Printf("releasing held job %q (priority=%d, state=%q, reason=%q)", uuid, p, state, reason)
                        sqc.Slurm.Release(uuid)
                } else if p < 1<<20 && replacing.wantPriority > 0 {
                        log.Printf("warning: job %q has low priority %d, nice %d, state %q, reason %q", uuid, p, n, state, reason)
index c9329fdf95bf87028346fb727b8521dc8edfa1cd..ef036dabd781edd425b29fc28f847ae18370d700 100644 (file)
@@ -103,6 +103,50 @@ func (s *SqueueSuite) TestReniceAll(c *C) {
        }
 }
 
+// If a limited nice range prevents desired priority adjustments, give
+// up and clamp nice to 10K.
+func (s *SqueueSuite) TestReniceInvalidNiceValue(c *C) {
+       uuids := []string{"zzzzz-dz642-fake0fake0fake0", "zzzzz-dz642-fake1fake1fake1", "zzzzz-dz642-fake2fake2fake2"}
+       slurm := &slurmFake{
+               queue:         uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 0 4294555222 PENDING Resources\n",
+               rejectNice10K: true,
+       }
+       sqc := &SqueueChecker{
+               Slurm:          slurm,
+               PrioritySpread: 1,
+               Period:         time.Hour,
+       }
+       sqc.startOnce.Do(sqc.start)
+       sqc.check()
+       sqc.SetPriority(uuids[0], 2)
+       sqc.SetPriority(uuids[1], 1)
+
+       // First attempt should renice to 555001, which will fail
+       sqc.reniceAll()
+       c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}})
+
+       // Next attempt should renice to 10K, which will succeed
+       sqc.reniceAll()
+       c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}})
+       // ...so we'll change the squeue response to reflect the
+       // updated priority+nice, and make sure sqc sees that...
+       slurm.queue = uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 10000 4294545222 PENDING Resources\n"
+       sqc.check()
+
+       // Next attempt should leave nice alone because it's already
+       // at the 10K limit
+       sqc.reniceAll()
+       c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}})
+
+       // Back to normal if desired nice value falls below 10K
+       slurm.queue = uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 10000 4294000111 PENDING Resources\n"
+       sqc.check()
+       sqc.reniceAll()
+       c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}, {uuids[1], "9890"}})
+
+       sqc.Stop()
+}
+
 // If the given UUID isn't in the slurm queue yet, SetPriority()
 // should wait for it to appear on the very next poll, then give up.
 func (s *SqueueSuite) TestSetPriorityBeforeQueued(c *C) {
index 89cd26ac49a8b76fcf0053633ca26917477c9478..d65156f98781f99cd3fbc4a20b2f0ba144ea8f97 100644 (file)
 // avoids redirecting requests to keep-web if they depend on
 // TrustAllContent being enabled.
 //
+// Metrics
+//
+// Keep-web exposes request metrics in Prometheus text-based format at
+// /metrics. The same information is also available as JSON at
+// /metrics.json.
+//
 package main
index 7d17be6e7cfe8c59305b452c8d788bca5748acdc..d0ba431aa6312d64f44e518d5ca19d8826ad1c5c 100644 (file)
@@ -31,6 +31,7 @@ import (
 
 type handler struct {
        Config        *Config
+       MetricsAPI    http.Handler
        clientPool    *arvadosclient.ClientPool
        setupOnce     sync.Once
        healthHandler http.Handler
@@ -259,6 +260,9 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
        } else if r.URL.Path == "/status.json" {
                h.serveStatus(w, r)
                return
+       } else if strings.HasPrefix(r.URL.Path, "/metrics") {
+               h.MetricsAPI.ServeHTTP(w, r)
+               return
        } else if siteFSDir[pathParts[0]] {
                useSiteFS = true
        } else if len(pathParts) >= 1 && strings.HasPrefix(pathParts[0], "c=") {
index 206bf6f4381fd98d4e7c4244e787c040de558aad..68ed062160401e59bb79479c71fbfde21a2495e1 100644 (file)
@@ -29,7 +29,7 @@ type UnitSuite struct{}
 
 func (s *UnitSuite) TestCORSPreflight(c *check.C) {
        h := handler{Config: DefaultConfig()}
-       u, _ := url.Parse("http://keep-web.example/c=" + arvadostest.FooCollection + "/foo")
+       u := mustParseURL("http://keep-web.example/c=" + arvadostest.FooCollection + "/foo")
        req := &http.Request{
                Method:     "OPTIONS",
                Host:       u.Host,
@@ -70,8 +70,7 @@ func (s *UnitSuite) TestInvalidUUID(c *check.C) {
                "http://" + bogusID + ".keep-web/t=" + token + "/" + bogusID + "/foo",
        } {
                c.Log(trial)
-               u, err := url.Parse(trial)
-               c.Assert(err, check.IsNil)
+               u := mustParseURL(trial)
                req := &http.Request{
                        Method:     "GET",
                        Host:       u.Host,
index e51376c3bc35cc10a92bf5a6f7c646a18bea3476..58ec348c882b88e6c92116dca947bd24e62c5877 100644 (file)
@@ -5,6 +5,8 @@
 package main
 
 import (
+       "net/http"
+
        "git.curoverse.com/arvados.git/sdk/go/httpserver"
 )
 
@@ -14,7 +16,10 @@ type server struct {
 }
 
 func (srv *server) Start() error {
-       srv.Handler = httpserver.AddRequestIDs(httpserver.LogRequests(nil, &handler{Config: srv.Config}))
+       h := &handler{Config: srv.Config}
+       mh := httpserver.Instrument(nil, httpserver.AddRequestIDs(httpserver.LogRequests(nil, h)))
+       h.MetricsAPI = mh.ServeAPI(http.NotFoundHandler())
+       srv.Handler = mh
        srv.Addr = srv.Config.Listen
        return srv.Server.Start()
 }
index ee585ad5b212af1f12f2bad3f162f8c1c11f3a2f..6688cc2ee743ec53bf4f2ce15fdfcb4621f09253 100644 (file)
@@ -6,10 +6,12 @@ package main
 
 import (
        "crypto/md5"
+       "encoding/json"
        "fmt"
        "io"
        "io/ioutil"
        "net"
+       "net/http"
        "os"
        "os/exec"
        "strings"
@@ -294,6 +296,76 @@ func (s *IntegrationSuite) runCurl(c *check.C, token, host, uri string, args ...
        return
 }
 
+func (s *IntegrationSuite) TestMetrics(c *check.C) {
+       origin := "http://" + s.testServer.Addr
+       req, _ := http.NewRequest("GET", origin+"/notfound", nil)
+       _, err := http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       req, _ = http.NewRequest("GET", origin+"/by_id/", nil)
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+       resp, err := http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       c.Check(resp.StatusCode, check.Equals, http.StatusOK)
+       req, _ = http.NewRequest("GET", origin+"/foo", nil)
+       req.Host = arvadostest.FooCollection + ".example.com"
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+       resp, err = http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       c.Check(resp.StatusCode, check.Equals, http.StatusOK)
+       buf, _ := ioutil.ReadAll(resp.Body)
+       c.Check(buf, check.DeepEquals, []byte("foo"))
+
+       req, _ = http.NewRequest("GET", origin+"/metrics.json", nil)
+       resp, err = http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       c.Check(resp.StatusCode, check.Equals, http.StatusOK)
+       type summary struct {
+               SampleCount string  `json:"sample_count"`
+               SampleSum   float64 `json:"sample_sum"`
+               Quantile    []struct {
+                       Quantile float64
+                       Value    float64
+               }
+       }
+       var ents []struct {
+               Name   string
+               Help   string
+               Type   string
+               Metric []struct {
+                       Label []struct {
+                               Name  string
+                               Value string
+                       }
+                       Summary summary
+               }
+       }
+       json.NewDecoder(resp.Body).Decode(&ents)
+       flat := map[string]summary{}
+       for _, e := range ents {
+               for _, m := range e.Metric {
+                       labels := map[string]string{}
+                       for _, lbl := range m.Label {
+                               labels[lbl.Name] = lbl.Value
+                       }
+                       flat[e.Name+"/"+labels["method"]+"/"+labels["code"]] = m.Summary
+               }
+       }
+       c.Check(flat["request_duration_seconds/get/200"].SampleSum, check.Not(check.Equals), 0)
+       c.Check(flat["request_duration_seconds/get/200"].SampleCount, check.Equals, "2")
+       c.Check(flat["request_duration_seconds/get/404"].SampleCount, check.Equals, "1")
+       c.Check(flat["time_to_status_seconds/get/404"].SampleCount, check.Equals, "1")
+
+       // If the Host header indicates a collection, /metrics.json
+       // refers to a file in the collection -- the metrics handler
+       // must not intercept that route.
+       req, _ = http.NewRequest("GET", origin+"/metrics.json", nil)
+       req.Host = strings.Replace(arvadostest.FooCollectionPDH, "+", "-", -1) + ".example.com"
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+       resp, err = http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       c.Check(resp.StatusCode, check.Equals, http.StatusNotFound)
+}
+
 func (s *IntegrationSuite) SetUpSuite(c *check.C) {
        arvadostest.StartAPI()
        arvadostest.StartKeep(2, true)
index e87fa4afd0db660c16af8a7ec78e68027620c531..dc70d968e2992a16581694ac70bbf42ba92f93ba 100644 (file)
@@ -617,7 +617,7 @@ func (s *ServerRequiredSuite) TestAskGetKeepProxyConnectionError(c *C) {
        kc := runProxy(c, nil, false)
        defer closeListener()
 
-       // Point keepproxy to a non-existant keepstore
+       // Point keepproxy at a non-existent keepstore
        locals := map[string]string{
                TestProxyUUID: "http://localhost:12345",
        }
index 3db20e29ce64eaca4d8c5ddd58389595d2f9ce16..1f8c7e31a2997ac2884ae2936ea174a0d859e017 100644 (file)
@@ -9,17 +9,11 @@ import (
        "encoding/json"
        "fmt"
        "io/ioutil"
-       "net/http"
-       "strconv"
        "strings"
        "time"
 
        "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "git.curoverse.com/arvados.git/sdk/go/stats"
        "github.com/Sirupsen/logrus"
-       "github.com/golang/protobuf/jsonpb"
-       "github.com/prometheus/client_golang/prometheus"
-       "github.com/prometheus/client_golang/prometheus/promhttp"
 )
 
 type Config struct {
@@ -54,8 +48,6 @@ type Config struct {
 
        ManagementToken string `doc: The secret key that must be provided by monitoring services
 wishing to access the health check endpoint (/_health).`
-
-       metrics
 }
 
 var (
@@ -161,62 +153,6 @@ func (cfg *Config) Start() error {
        return nil
 }
 
-type metrics struct {
-       registry     *prometheus.Registry
-       reqDuration  *prometheus.SummaryVec
-       timeToStatus *prometheus.SummaryVec
-       exportProm   http.Handler
-}
-
-func (*metrics) Levels() []logrus.Level {
-       return logrus.AllLevels
-}
-
-func (m *metrics) Fire(ent *logrus.Entry) error {
-       if tts, ok := ent.Data["timeToStatus"].(stats.Duration); !ok {
-       } else if method, ok := ent.Data["reqMethod"].(string); !ok {
-       } else if code, ok := ent.Data["respStatusCode"].(int); !ok {
-       } else {
-               m.timeToStatus.WithLabelValues(strconv.Itoa(code), strings.ToLower(method)).Observe(time.Duration(tts).Seconds())
-       }
-       return nil
-}
-
-func (m *metrics) setup() {
-       m.registry = prometheus.NewRegistry()
-       m.timeToStatus = prometheus.NewSummaryVec(prometheus.SummaryOpts{
-               Name: "time_to_status_seconds",
-               Help: "Summary of request TTFB.",
-       }, []string{"code", "method"})
-       m.reqDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{
-               Name: "request_duration_seconds",
-               Help: "Summary of request duration.",
-       }, []string{"code", "method"})
-       m.registry.MustRegister(m.timeToStatus)
-       m.registry.MustRegister(m.reqDuration)
-       m.exportProm = promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{
-               ErrorLog: log,
-       })
-       log.AddHook(m)
-}
-
-func (m *metrics) exportJSON(w http.ResponseWriter, req *http.Request) {
-       jm := jsonpb.Marshaler{Indent: "  "}
-       mfs, _ := m.registry.Gather()
-       w.Write([]byte{'['})
-       for i, mf := range mfs {
-               if i > 0 {
-                       w.Write([]byte{','})
-               }
-               jm.Marshal(w, mf)
-       }
-       w.Write([]byte{']'})
-}
-
-func (m *metrics) Instrument(next http.Handler) http.Handler {
-       return promhttp.InstrumentHandlerDuration(m.reqDuration, next)
-}
-
 // VolumeTypes is built up by init() funcs in the source files that
 // define the volume types.
 var VolumeTypes = []func() VolumeWithExamples{}
index fb327a386b0f33fdae30f1e0d3e4f880c8d0bfa1..d19be61e9ade77958b376450169f5b2abdafc66b 100644 (file)
@@ -86,17 +86,11 @@ func MakeRESTRouter() http.Handler {
        // 400 Bad Request.
        rtr.NotFoundHandler = http.HandlerFunc(BadRequestHandler)
 
-       theConfig.metrics.setup()
-
        rtr.limiter = httpserver.NewRequestLimiter(theConfig.MaxRequests, rtr)
 
-       mux := http.NewServeMux()
-       mux.Handle("/", theConfig.metrics.Instrument(
-               httpserver.AddRequestIDs(httpserver.LogRequests(nil, rtr.limiter))))
-       mux.HandleFunc("/metrics.json", theConfig.metrics.exportJSON)
-       mux.Handle("/metrics", theConfig.metrics.exportProm)
-
-       return mux
+       stack := httpserver.Instrument(nil,
+               httpserver.AddRequestIDs(httpserver.LogRequests(nil, rtr.limiter)))
+       return stack.ServeAPI(stack)
 }
 
 // BadRequestHandler is a HandleFunc to address bad requests.
index b4fec5096d5a8e2767169fce3910f45136ddaee3..77c515d565e8113681c2dad610d103fae4156a15 100644 (file)
@@ -243,12 +243,15 @@ class ComputeNodeShutdownActor(ComputeNodeStateChangeBase):
         return super(ComputeNodeShutdownActor, self)._finished()
 
     def cancel_shutdown(self, reason, **kwargs):
+        if not self.cancellable:
+            return False
         if self.cancel_reason is not None:
             # already cancelled
-            return
+            return False
         self.cancel_reason = reason
         self._logger.info("Shutdown cancelled: %s.", reason)
         self._finished(success_flag=False)
+        return True
 
     def _cancel_on_exception(orig_func):
         @functools.wraps(orig_func)
@@ -282,6 +285,7 @@ class ComputeNodeShutdownActor(ComputeNodeStateChangeBase):
         self._logger.info("Starting shutdown")
         arv_node = self._arvados_node()
         if self._cloud.destroy_node(self.cloud_node):
+            self.cancellable = False
             self._logger.info("Shutdown success")
             if arv_node:
                 self._later.clean_arvados_node(arv_node)
@@ -335,7 +339,7 @@ class ComputeNodeMonitorActor(config.actor_class):
     def __init__(self, cloud_node, cloud_node_start_time, shutdown_timer,
                  timer_actor, update_actor, cloud_client,
                  arvados_node=None, poll_stale_after=600, node_stale_after=3600,
-                 boot_fail_after=1800
+                 boot_fail_after=1800, consecutive_idle_count=0
     ):
         super(ComputeNodeMonitorActor, self).__init__()
         self._later = self.actor_ref.tell_proxy()
@@ -350,6 +354,8 @@ class ComputeNodeMonitorActor(config.actor_class):
         self.boot_fail_after = boot_fail_after
         self.subscribers = set()
         self.arvados_node = None
+        self.consecutive_idle_count = consecutive_idle_count
+        self.consecutive_idle = 0
         self._later.update_arvados_node(arvados_node)
         self.last_shutdown_opening = None
         self._later.consider_shutdown()
@@ -456,8 +462,14 @@ class ComputeNodeMonitorActor(config.actor_class):
         else:
             boot_grace = "boot exceeded"
 
-        # API server side not implemented yet.
-        idle_grace = 'idle exceeded'
+        if crunch_worker_state == "idle":
+            # Must report as "idle" at least "consecutive_idle_count" times
+            if self.consecutive_idle < self.consecutive_idle_count:
+                idle_grace = 'idle wait'
+            else:
+                idle_grace = 'idle exceeded'
+        else:
+            idle_grace = 'not idle'
 
         node_state = (crunch_worker_state, window, boot_grace, idle_grace)
         t = transitions[node_state]
@@ -517,4 +529,8 @@ class ComputeNodeMonitorActor(config.actor_class):
         if arvados_node is not None:
             self.arvados_node = arvados_node
             self._update.sync_node(self.cloud_node, self.arvados_node)
+            if self.arvados_node['crunch_worker_state'] == "idle":
+                self.consecutive_idle += 1
+            else:
+                self.consecutive_idle = 0
             self._later.consider_shutdown()
index 9e38d13eb7f4788d8af485a7e5b4b6589c9f324c..48d19f592bbdb0b87d905bac377c849000b59ef1 100644 (file)
@@ -35,8 +35,10 @@ class BaseComputeNodeDriver(RetryMixin):
         return driver_class(**auth_kwargs)
 
     @RetryMixin._retry()
-    def _set_sizes(self):
-        self.sizes = {sz.id: sz for sz in self.real.list_sizes()}
+    def sizes(self):
+        if self._sizes is None:
+            self._sizes = {sz.id: sz for sz in self.real.list_sizes()}
+        return self._sizes
 
     def __init__(self, auth_kwargs, list_kwargs, create_kwargs,
                  driver_class, retry_wait=1, max_retry_wait=180):
@@ -73,7 +75,7 @@ class BaseComputeNodeDriver(RetryMixin):
                 if new_pair is not None:
                     self.create_kwargs[new_pair[0]] = new_pair[1]
 
-        self._set_sizes()
+        self._sizes = None
 
     def _init_ping_host(self, ping_host):
         self.ping_host = ping_host
index ae554327ca20d929a92b595da54e32ba05e6485f..35c8b5a8c97db40b4d15a7ad20e20acaefdc605a 100644 (file)
@@ -89,8 +89,8 @@ echo %s > /var/tmp/arv-node-data/meta-data/instance-type
         for n in nodes:
             # Need to populate Node.size
             if not n.size:
-                n.size = self.sizes[n.extra["properties"]["hardwareProfile"]["vmSize"]]
-            n.extra['arvados_node_size'] = n.extra.get('tags', {}).get('arvados_node_size')
+                n.size = self.sizes()[n.extra["properties"]["hardwareProfile"]["vmSize"]]
+            n.extra['arvados_node_size'] = n.extra.get('tags', {}).get('arvados_node_size') or n.size.id
         return nodes
 
     def broken(self, cloud_node):
index 2829b9c0b1bead892aa83d10cf01f6aaa4f7e9a3..14845ac12fe31414e84749190593556516b6b224 100644 (file)
@@ -41,7 +41,7 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
         nodelist = super(ComputeNodeDriver, self).list_nodes()
         for node in nodelist:
             self._ensure_private_ip(node)
-            node.size = self.sizes["1"]
+            node.size = self.sizes()["1"]
         return nodelist
 
     def create_node(self, size, arvados_node):
index 2b1564279717d0d0159bd3c07b307b4b5675c98f..418a9f9d85499b64e592d614cfa793af70e694ca 100644 (file)
@@ -110,8 +110,8 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
         nodes = super(ComputeNodeDriver, self).list_nodes()
         for n in nodes:
             if not n.size:
-                n.size = self.sizes[n.extra["instance_type"]]
-            n.extra['arvados_node_size'] = n.extra.get('tags', {}).get('arvados_node_size')
+                n.size = self.sizes()[n.extra["instance_type"]]
+            n.extra['arvados_node_size'] = n.extra.get('tags', {}).get('arvados_node_size') or n.size.id
         return nodes
 
     @classmethod
index be39ecba6bf4b3cfb4ef6e0e5dd7c1168dc86ddd..23a1017316656cfe4323646ac9bba5e793f915cb 100644 (file)
@@ -38,7 +38,6 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
         super(ComputeNodeDriver, self).__init__(
             auth_kwargs, list_kwargs, create_kwargs,
             driver_class)
-        self._sizes_by_id = {sz.id: sz for sz in self.sizes.itervalues()}
         self._disktype_links = {dt.name: self._object_link(dt)
                                 for dt in self.real.ex_list_disktypes()}
 
@@ -120,9 +119,9 @@ class ComputeNodeDriver(BaseComputeNodeDriver):
             # It's supposed to be the actual size object.  Check that it's not,
             # and monkeypatch the results when that's the case.
             if not hasattr(node.size, 'id'):
-                node.size = self._sizes_by_id[node.size]
+                node.size = self.sizes()[node.size]
             # Get arvados-assigned cloud size id
-            node.extra['arvados_node_size'] = node.extra.get('metadata', {}).get('arvados_node_size')
+            node.extra['arvados_node_size'] = node.extra.get('metadata', {}).get('arvados_node_size') or node.size.id
         return nodelist
 
     @classmethod
index 8c6757e51c451c253e5f16f57570d85bb52f3d7a..4fda7e76d69ed87aa1b5b032f1e3b1b8e608f5b5 100644 (file)
@@ -57,7 +57,8 @@ class NodeManagerConfig(ConfigParser.SafeConfigParser):
                        'boot_fail_after': str(sys.maxint),
                        'node_stale_after': str(60 * 60 * 2),
                        'watchdog': '600',
-                       'node_mem_scaling': '0.95'},
+                       'node_mem_scaling': '0.95',
+                       'consecutive_idle_count': '2'},
             'Manage': {'address': '127.0.0.1',
                        'port': '-1',
                        'ManagementToken': ''},
index 911798e08f937ded2d10e30b8b8fe7d64edd8f6b..1edf4dc4792e5b7a9f638a17599c66c76410ab84 100644 (file)
@@ -112,7 +112,8 @@ class NodeManagerDaemonActor(actor_class):
                  node_setup_class=dispatch.ComputeNodeSetupActor,
                  node_shutdown_class=dispatch.ComputeNodeShutdownActor,
                  node_actor_class=dispatch.ComputeNodeMonitorActor,
-                 max_total_price=0):
+                 max_total_price=0,
+                 consecutive_idle_count=1):
         super(NodeManagerDaemonActor, self).__init__()
         self._node_setup = node_setup_class
         self._node_shutdown = node_shutdown_class
@@ -133,6 +134,7 @@ class NodeManagerDaemonActor(actor_class):
         self.poll_stale_after = poll_stale_after
         self.boot_fail_after = boot_fail_after
         self.node_stale_after = node_stale_after
+        self.consecutive_idle_count = consecutive_idle_count
         self.last_polls = {}
         for poll_name in ['server_wishlist', 'arvados_nodes', 'cloud_nodes']:
             poll_actor = locals()[poll_name + '_actor']
@@ -173,7 +175,8 @@ class NodeManagerDaemonActor(actor_class):
             poll_stale_after=self.poll_stale_after,
             node_stale_after=self.node_stale_after,
             cloud_client=self._cloud_driver,
-            boot_fail_after=self.boot_fail_after)
+            boot_fail_after=self.boot_fail_after,
+            consecutive_idle_count=self.consecutive_idle_count)
         actorTell = actor.tell_proxy()
         actorTell.subscribe(self._later.node_can_shutdown)
         self._cloud_nodes_actor.subscribe_to(cloud_node.id,
@@ -390,22 +393,25 @@ class NodeManagerDaemonActor(actor_class):
         nodes_wanted = self._nodes_wanted(cloud_size)
         if nodes_wanted < 1:
             return None
-        arvados_node = self.arvados_nodes.find_stale_node(self.node_stale_after)
-        self._logger.info("Want %i more %s nodes.  Booting a node.",
-                          nodes_wanted, cloud_size.id)
-        new_setup = self._node_setup.start(
-            timer_actor=self._timer,
-            arvados_client=self._new_arvados(),
-            arvados_node=arvados_node,
-            cloud_client=self._new_cloud(),
-            cloud_size=self.server_calculator.find_size(cloud_size.id)).proxy()
-        self.booting[new_setup.actor_ref.actor_urn] = new_setup
-        self.sizes_booting[new_setup.actor_ref.actor_urn] = cloud_size
-
-        if arvados_node is not None:
-            self.arvados_nodes[arvados_node['uuid']].assignment_time = (
-                time.time())
-        new_setup.subscribe(self._later.node_setup_finished)
+
+        if not self.cancel_node_shutdown(cloud_size):
+            arvados_node = self.arvados_nodes.find_stale_node(self.node_stale_after)
+            self._logger.info("Want %i more %s nodes.  Booting a node.",
+                              nodes_wanted, cloud_size.id)
+            new_setup = self._node_setup.start(
+                timer_actor=self._timer,
+                arvados_client=self._new_arvados(),
+                arvados_node=arvados_node,
+                cloud_client=self._new_cloud(),
+                cloud_size=self.server_calculator.find_size(cloud_size.id))
+            self.booting[new_setup.actor_urn] = new_setup.proxy()
+            self.sizes_booting[new_setup.actor_urn] = cloud_size
+
+            if arvados_node is not None:
+                self.arvados_nodes[arvados_node['uuid']].assignment_time = (
+                    time.time())
+            new_setup.tell_proxy().subscribe(self._later.node_setup_finished)
+
         if nodes_wanted > 1:
             self._later.start_node(cloud_size)
 
@@ -456,13 +462,28 @@ class NodeManagerDaemonActor(actor_class):
         if (nodes_excess < 1) or not self.booting:
             return None
         for key, node in self.booting.iteritems():
-            if node and node.cloud_size.get().id == size.id and node.stop_if_no_cloud_node().get():
-                del self.booting[key]
-                del self.sizes_booting[key]
+            try:
+                if node and node.cloud_size.get().id == size.id and node.stop_if_no_cloud_node().get(2):
+                    del self.booting[key]
+                    del self.sizes_booting[key]
+                    if nodes_excess > 1:
+                        self._later.stop_booting_node(size)
+                    return
+            except pykka.Timeout:
+                pass
 
-                if nodes_excess > 1:
-                    self._later.stop_booting_node(size)
-                break
+    @_check_poll_freshness
+    def cancel_node_shutdown(self, size):
+        # Go through shutdown actors and see if there are any of the appropriate size that can be cancelled
+        for record in self.cloud_nodes.nodes.itervalues():
+            try:
+                if (record.shutdown_actor is not None and
+                    record.cloud_node.size.id == size.id and
+                    record.shutdown_actor.cancel_shutdown("Node size is in wishlist").get(2)):
+                        return True
+            except (pykka.ActorDeadError, pykka.Timeout) as e:
+                pass
+        return False
 
     def _begin_node_shutdown(self, node_actor, cancellable):
         cloud_node_obj = node_actor.cloud_node.get()
index 1020b4a80ced597911b886c40789dea39f1d5598..7ca9c9553721f0fa1291273bfeff5f5f9f7d0e78 100644 (file)
@@ -37,7 +37,10 @@ class ServerCalculator(object):
             self.scratch = 0
             self.cores = 0
             self.bandwidth = 0
-            self.price = 9999999
+            # price is multiplied by 1000 to get the node weight
+            # the maximum node weight is                  4294967280
+            # so use invalid node weight 4294967 * 1000 = 4294967000
+            self.price = 4294967
             self.preemptible = False
             self.extra = {}
 
index f65e0806ec56df96f81c5bed87f657b15355fdec..1439c94118a913179f09a928df38caaab4c24e04 100644 (file)
@@ -144,7 +144,8 @@ def main(args=None):
             config.getint('Daemon', 'boot_fail_after'),
             config.getint('Daemon', 'node_stale_after'),
             node_setup, node_shutdown, node_monitor,
-            max_total_price=config.getfloat('Daemon', 'max_total_price')).tell_proxy()
+            max_total_price=config.getfloat('Daemon', 'max_total_price'),
+            consecutive_idle_count=config.getint('Daemon', 'consecutive_idle_count'),).tell_proxy()
 
         watchdog = WatchdogActor.start(config.getint('Daemon', 'watchdog'),
                             cloud_node_poller.actor_ref,
index efd2445175589f761165aa7ff5746be7ab4b6f44..8ba68018d5840466698cf8a0cf19546887bf143b 100644 (file)
@@ -65,6 +65,15 @@ boot_fail_after = 1800
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
@@ -74,6 +83,7 @@ node_mem_scaling = 0.95
 # File path for Certificate Authorities
 certs_file = /etc/ssl/certs/ca-certificates.crt
 
+
 [Logging]
 # Log file path
 file = /var/log/arvados/node-manager.log
index 117f9b224bff2f4ca567b64e09de81b4ed34c692..f5329ebe16213ad1d7fa37aff09212efce299603 100644 (file)
@@ -65,6 +65,15 @@ boot_fail_after = 1800
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
index 8a244a444487052cd1543d9135448703741ca3e0..acd3fd1e3e6ab6a36720670f439cc2061f2c574f 100644 (file)
@@ -54,6 +54,15 @@ poll_stale_after = 600
 # an Arvados node that hasn't been updated for this long.
 node_stale_after = 14400
 
+# Number of consecutive times a node must report as "idle" before it
+# will be considered eligible for shutdown.  Node status is checked
+# each poll period, and node can go idle at any point during a poll
+# period (meaning a node could be reported as idle that has only been
+# idle for 1 second).  With a 60 second poll period, three consecutive
+# status updates of "idle" suggests the node has been idle at least
+# 121 seconds.
+consecutive_idle_count = 3
+
 # Scaling factor to be applied to nodes' available RAM size. Usually there's a
 # variable discrepancy between the advertised RAM value on cloud nodes and the
 # actual amount available.
index 69a29019e78cb1ab7de2a8fdc41de85c8abc645a..1ba2957ee5544c9346bbb00bc3f0e2ad9e51276a 100755 (executable)
@@ -115,7 +115,10 @@ def node_shutdown(g):
     global compute_nodes
     if g.group(1) in compute_nodes:
         del compute_nodes[g.group(1)]
-    return 0
+        return 0
+    else:
+        return 1
+
 
 def jobs_req(g):
     global all_jobs
index 778c9aeaf5ffdbbcecaf90ac8072ace7210ce4a5..aee3cbdac8928cb8237357b9250d595bba349ba9 100644 (file)
@@ -424,7 +424,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
         self.make_actor()
         self.shutdowns._set_state(True, 600)
         self.assertEquals(self.node_actor.shutdown_eligible().get(self.TIMEOUT),
-                          (False, "node state is ('unpaired', 'open', 'boot wait', 'idle exceeded')"))
+                          (False, "node state is ('unpaired', 'open', 'boot wait', 'not idle')"))
 
     def test_shutdown_when_invalid_cloud_node_size(self):
         self.make_mocks(1)
@@ -438,7 +438,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
     def test_shutdown_without_arvados_node(self):
         self.make_actor(start_time=0)
         self.shutdowns._set_state(True, 600)
-        self.assertEquals((True, "node state is ('down', 'open', 'boot exceeded', 'idle exceeded')"),
+        self.assertEquals((True, "node state is ('down', 'open', 'boot exceeded', 'not idle')"),
                           self.node_actor.shutdown_eligible().get(self.TIMEOUT))
 
     def test_shutdown_missing(self):
@@ -447,7 +447,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
                                               last_ping_at='1970-01-01T01:02:03.04050607Z')
         self.make_actor(10, arv_node)
         self.shutdowns._set_state(True, 600)
-        self.assertEquals((True, "node state is ('down', 'open', 'boot wait', 'idle exceeded')"),
+        self.assertEquals((True, "node state is ('down', 'open', 'boot wait', 'not idle')"),
                           self.node_actor.shutdown_eligible().get(self.TIMEOUT))
 
     def test_shutdown_running_broken(self):
@@ -456,7 +456,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
         self.make_actor(12, arv_node)
         self.shutdowns._set_state(True, 600)
         self.cloud_client.broken.return_value = True
-        self.assertEquals((True, "node state is ('down', 'open', 'boot wait', 'idle exceeded')"),
+        self.assertEquals((True, "node state is ('down', 'open', 'boot wait', 'not idle')"),
                           self.node_actor.shutdown_eligible().get(self.TIMEOUT))
 
     def test_shutdown_missing_broken(self):
@@ -466,7 +466,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
         self.make_actor(11, arv_node)
         self.shutdowns._set_state(True, 600)
         self.cloud_client.broken.return_value = True
-        self.assertEquals(self.node_actor.shutdown_eligible().get(self.TIMEOUT), (True, "node state is ('down', 'open', 'boot wait', 'idle exceeded')"))
+        self.assertEquals(self.node_actor.shutdown_eligible().get(self.TIMEOUT), (True, "node state is ('down', 'open', 'boot wait', 'not idle')"))
 
     def test_no_shutdown_when_window_closed(self):
         self.make_actor(3, testutil.arvados_node_mock(3, job_uuid=None))
@@ -476,7 +476,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
     def test_no_shutdown_when_node_running_job(self):
         self.make_actor(4, testutil.arvados_node_mock(4, job_uuid=True))
         self.shutdowns._set_state(True, 600)
-        self.assertEquals((False, "node state is ('busy', 'open', 'boot wait', 'idle exceeded')"),
+        self.assertEquals((False, "node state is ('busy', 'open', 'boot wait', 'not idle')"),
                           self.node_actor.shutdown_eligible().get(self.TIMEOUT))
 
     def test_shutdown_when_node_state_unknown(self):
@@ -490,7 +490,7 @@ class ComputeNodeMonitorActorTestCase(testutil.ActorTestMixin,
         self.make_actor(5, testutil.arvados_node_mock(
             5, crunch_worker_state='fail'))
         self.shutdowns._set_state(True, 600)
-        self.assertEquals((True, "node state is ('fail', 'open', 'boot wait', 'idle exceeded')"),
+        self.assertEquals((True, "node state is ('fail', 'open', 'boot wait', 'not idle')"),
                           self.node_actor.shutdown_eligible().get(self.TIMEOUT))
 
     def test_no_shutdown_when_node_state_stale(self):
index d09cbf72359610ac08afa428e39f024d3086835c..1b6e4ca8da4aa24bfb45f8382e7b5d7700cd2bf2 100644 (file)
@@ -620,10 +620,26 @@ class NodeManagerDaemonActorTestCase(testutil.ActorTestMixin,
         monitor = self.monitor_list()[0].proxy()
         self.daemon.node_can_shutdown(monitor).get(self.TIMEOUT)
         self.assertTrue(self.node_shutdown.start.called)
+        getmock = mock.MagicMock()
+        getmock.get.return_value = False
+        self.last_shutdown.cancel_shutdown.return_value = getmock
         self.daemon.update_server_wishlist(
             [testutil.MockSize(6)]).get(self.TIMEOUT)
         self.busywait(lambda: self.node_setup.start.called)
 
+    def test_nodes_shutting_down_cancelled(self):
+        size = testutil.MockSize(6)
+        cloud_node = testutil.cloud_node_mock(6, size=size)
+        self.make_daemon([cloud_node], [testutil.arvados_node_mock(6, crunch_worker_state='down')],
+                         avail_sizes=[(size, {"cores":1})])
+        self.assertEqual(1, self.alive_monitor_count())
+        monitor = self.monitor_list()[0].proxy()
+        self.daemon.node_can_shutdown(monitor).get(self.TIMEOUT)
+        self.assertTrue(self.node_shutdown.start.called)
+        self.daemon.update_server_wishlist(
+            [testutil.MockSize(6)]).get(self.TIMEOUT)
+        self.busywait(lambda: self.last_shutdown.cancel_shutdown.called)
+
     def test_nodes_shutting_down_not_replaced_at_max_nodes(self):
         cloud_node = testutil.cloud_node_mock(7)
         self.make_daemon([cloud_node], [testutil.arvados_node_mock(7)],
index f18d4e464cdf34ed86c0be1a4631aadc598179df..aa6b2d773dfb1e47969794dd816a81b179539163 100644 (file)
                        "revision": "7a0fa49edf48165190530c675167e2f319a05268",
                        "revisionTime": "2018-06-25T08:58:08Z"
                },
+               {
+                       "checksumSHA1": "8UEp6v0Dczw/SlasE0DivB0mAHA=",
+                       "path": "github.com/gogo/protobuf/jsonpb",
+                       "revision": "30cf7ac33676b5786e78c746683f0d4cd64fa75b",
+                       "revisionTime": "2018-05-09T16:24:41Z"
+               },
                {
                        "checksumSHA1": "wn2shNJMwRZpvuvkf1s7h0wvqHI=",
                        "path": "github.com/gogo/protobuf/proto",
                        "revisionTime": "2018-01-04T10:21:28Z"
                },
                {
-                       "checksumSHA1": "iVfdaLxIDjfk2KLP8dCMIbsxZZM=",
-                       "path": "github.com/golang/protobuf/jsonpb",
-                       "revision": "1e59b77b52bf8e4b449a57e6f79f21226d571845",
-                       "revisionTime": "2017-11-13T18:07:20Z"
+                       "checksumSHA1": "HPVQZu059/Rfw2bAWM538bVTcUc=",
+                       "path": "github.com/gogo/protobuf/sortkeys",
+                       "revision": "30cf7ac33676b5786e78c746683f0d4cd64fa75b",
+                       "revisionTime": "2018-05-09T16:24:41Z"
                },
                {
-                       "checksumSHA1": "yqF125xVSkmfLpIVGrLlfE05IUk=",
-                       "path": "github.com/golang/protobuf/proto",
-                       "revision": "1e59b77b52bf8e4b449a57e6f79f21226d571845",
-                       "revisionTime": "2017-11-13T18:07:20Z"
+                       "checksumSHA1": "SkxU1+wPGUJyLyQENrZtr2/OUBs=",
+                       "path": "github.com/gogo/protobuf/types",
+                       "revision": "30cf7ac33676b5786e78c746683f0d4cd64fa75b",
+                       "revisionTime": "2018-05-09T16:24:41Z"
                },
                {
-                       "checksumSHA1": "Ylq6kq3KWBy6mu68oyEwenhNMdg=",
-                       "path": "github.com/golang/protobuf/ptypes/struct",
+                       "checksumSHA1": "yqF125xVSkmfLpIVGrLlfE05IUk=",
+                       "path": "github.com/golang/protobuf/proto",
                        "revision": "1e59b77b52bf8e4b449a57e6f79f21226d571845",
                        "revisionTime": "2017-11-13T18:07:20Z"
                },