16267: Merge branch 'master' into 16267-change-arvbox-deps
authorWard Vandewege <ward@curii.com>
Mon, 28 Sep 2020 15:58:54 +0000 (11:58 -0400)
committerWard Vandewege <ward@curii.com>
Mon, 28 Sep 2020 15:59:10 +0000 (11:59 -0400)
Arvados-DCO-1.1-Signed-off-by: Ward Vandewege <ward@curii.com>

78 files changed:
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/controllers/projects_controller.rb
apps/workbench/app/views/work_units/_show_component.html.erb
build/run-tests.sh
doc/_includes/_install_ruby_and_bundler.liquid
doc/admin/upgrading.html.textile.liquid
doc/admin/user-management-cli.html.textile.liquid
doc/api/methods/links.html.textile.liquid
doc/user/tutorials/wgs-tutorial.html.textile.liquid
lib/cloud/cloudtest/tester.go
lib/cloud/ec2/ec2.go
lib/config/config.default.yml
lib/config/export.go
lib/config/generated_config.go
lib/controller/federation/conn.go
lib/controller/localdb/login_oidc.go
lib/crunchrun/crunchrun_test.go
lib/crunchrun/logging.go
lib/dispatchcloud/dispatcher.go
lib/dispatchcloud/dispatcher_test.go
lib/dispatchcloud/sshexecutor/executor.go [moved from lib/dispatchcloud/ssh_executor/executor.go with 98% similarity]
lib/dispatchcloud/sshexecutor/executor_test.go [moved from lib/dispatchcloud/ssh_executor/executor_test.go with 99% similarity]
lib/dispatchcloud/worker/pool.go
lib/dispatchcloud/worker/worker.go
lib/dispatchcloud/worker/worker_test.go
lib/install/deps.go
sdk/R/DESCRIPTION
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/README.Rmd
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/cwl/arvados_cwl/__init__.py
sdk/cwl/arvados_cwl/arvcontainer.py
sdk/cwl/arvados_cwl/executor.py
sdk/cwl/tests/test_submit.py
sdk/dev-jobs.dockerfile
sdk/go/arvados/config.go
sdk/go/arvados/fs_base.go
sdk/go/arvados/fs_collection.go
sdk/go/auth/salt.go
sdk/go/health/handler_test.go
sdk/go/httpserver/logger.go
sdk/go/keepclient/keepclient.go
sdk/python/arvados/commands/run.py
services/api/app/controllers/arvados/v1/collections_controller.rb
services/api/app/controllers/arvados/v1/users_controller.rb
services/api/app/models/arvados_model.rb
services/api/app/models/database_seeds.rb
services/api/app/views/user_notifier/account_is_setup.text.erb
services/api/db/migrate/20200914203202_public_favorites_project.rb [new file with mode: 0644]
services/api/db/structure.sql
services/api/lib/current_api_client.rb
services/api/test/fixtures/groups.yml
services/api/test/fixtures/links.yml
services/api/test/fixtures/logs.yml
services/api/test/functional/arvados/v1/collections_controller_test.rb
services/api/test/functional/arvados/v1/users_controller_test.rb
services/api/test/unit/log_test.rb
services/api/test/unit/permission_test.rb
services/api/test/unit/user_notifier_test.rb
services/crunch-dispatch-slurm/squeue.go
services/keep-web/s3.go
services/keep-web/s3_test.go
services/keepstore/pull_worker.go
services/keepstore/s3aws_volume.go

index 77ec68bdb06eeb5d9bf124206528e62c491c547e..cf4bfa8c5400b56543e6cfe7174091b489095b74 100644 (file)
@@ -927,7 +927,7 @@ class ApplicationController < ActionController::Base
   helper_method :my_starred_projects
   def my_starred_projects user
     return if defined?(@starred_projects) && @starred_projects
-    links = Link.filter([['owner_uuid', 'in', ["#{Rails.configuration.ClusterID}-j7d0g-fffffffffffffff", user.uuid]],
+    links = Link.filter([['owner_uuid', 'in', ["#{Rails.configuration.ClusterID}-j7d0g-publicfavorites", user.uuid]],
                          ['link_class', '=', 'star'],
                          ['head_uuid', 'is_a', 'arvados#group']]).with_count("none").select(%w(head_uuid))
     uuids = links.collect { |x| x.head_uuid }
index 66dc3dcea2d418b2bbd79e6907d37fac4cbc0fbb..e448e1b4530d78b1cfad3ec124ccc26fcd6e3583 100644 (file)
@@ -133,7 +133,7 @@ class ProjectsController < ApplicationController
   def remove_items
     @removed_uuids = []
     params[:item_uuids].collect { |uuid| ArvadosBase.find uuid }.each do |item|
-      if item.class == Collection or item.class == Group
+      if item.class == Collection or item.class == Group or item.class == Workflow or item.class == ContainerRequest
         # Use delete API on collections and projects/groups
         item.destroy
         @removed_uuids << item.uuid
index cac263d1ec56fd468ba050a94f24fc0fd0d8514d..4cce090a2235c7f7402971634360a2c9b4bde46d 100644 (file)
@@ -45,13 +45,13 @@ SPDX-License-Identifier: AGPL-3.0 %>
       <div class="panel-heading">
         <h4 class="panel-title">
           <a class="component-detail-panel" data-toggle="collapse" href="#errorDetail">
-            <span class="caret"></span> Error: <%= sanitize(wu.runtime_status[:error]) %>
+            <span class="caret"></span> Error: <%= h(wu.runtime_status[:error]) %>
           </a>
         </h4>
       </div>
       <div id="errorDetail" class="panel-body panel-collapse collapse">
         <% if wu.runtime_status[:errorDetail] %>
-          <pre><%= sanitize(wu.runtime_status[:errorDetail]) %></pre>
+          <pre><%= h(wu.runtime_status[:errorDetail]) %></pre>
         <% else %>
           No detailed information available.
         <% end %>
@@ -69,13 +69,13 @@ SPDX-License-Identifier: AGPL-3.0 %>
       <div class="panel-heading">
         <h4 class="panel-title">
           <a class="component-detail-panel" data-toggle="collapse" href="#warningDetail">
-            <span class="caret"></span> Warning: <%= sanitize(wu.runtime_status[:warning]) %>
+            <span class="caret"></span> Warning: <%= h(wu.runtime_status[:warning]) %>
           </a>
         </h4>
       </div>
       <div id="warningDetail" class="panel-body panel-collapse collapse">
         <% if wu.runtime_status[:warningDetail] %>
-          <pre><%= sanitize(wu.runtime_status[:warningDetail]) %></pre>
+          <pre><%= h(wu.runtime_status[:warningDetail]) %></pre>
         <% else %>
           No detailed information available.
         <% end %>
index 32d4a75d2b63bdd04811f78718a60a65de1c74c8..595f721080e99bfc689741a0144770f39236d2cc 100755 (executable)
@@ -88,7 +88,7 @@ lib/cloud/cloudtest
 lib/dispatchcloud
 lib/dispatchcloud/container
 lib/dispatchcloud/scheduler
-lib/dispatchcloud/ssh_executor
+lib/dispatchcloud/sshexecutor
 lib/dispatchcloud/worker
 lib/mount
 lib/pam
@@ -709,7 +709,7 @@ do_test() {
             stop_services
             check_arvados_config "$1"
             ;;
-        gofmt | doc | lib/cli | lib/cloud/azure | lib/cloud/ec2 | lib/cloud/cloudtest | lib/cmd | lib/dispatchcloud/ssh_executor | lib/dispatchcloud/worker)
+        gofmt | doc | lib/cli | lib/cloud/azure | lib/cloud/ec2 | lib/cloud/cloudtest | lib/cmd | lib/dispatchcloud/sshexecutor | lib/dispatchcloud/worker)
             check_arvados_config "$1"
             # don't care whether services are running
             ;;
index d14e555f89bcdbe35a93ecc7e859a98cea60587c..d1d33cbbe3e567a610768cbbe790560b2e953d7d 100644 (file)
@@ -4,7 +4,7 @@ Copyright (C) The Arvados Authors. All rights reserved.
 SPDX-License-Identifier: CC-BY-SA-3.0
 {% endcomment %}
 
-Minimum of Ruby 2.3 is required.  Ruby 2.5 is recommended.
+Ruby 2.5 or newer is required.
 
 * "Option 1: Install from packages":#packages
 * "Option 2: Install with RVM":#rvm
@@ -13,16 +13,18 @@ Minimum of Ruby 2.3 is required.  Ruby 2.5 is recommended.
 h2(#packages). Option 1: Install from packages
 
 {% include 'notebox_begin' %}
-Future versions of Arvados may require a newer version of Ruby than is packaged with your OS.  Using OS packages simplifies initial install, but may complicate upgrades that rely on a newer Ruby.  If this is a concern, we recommend using "RVM.":#rvm
+Future versions of Arvados may require a newer version of Ruby than is packaged with your OS.  Using OS packages simplifies initial install, but may complicate upgrades that rely on a newer Ruby.  If this is a concern, we recommend using "RVM":#rvm.
 {% include 'notebox_end' %}
 
 h3. Centos 7
 
-The Ruby version shipped with Centos 7 is too old.  Use "RVM.":#rvm
+The Ruby version shipped with Centos 7 is too old.  Use "RVM":#rvm to install Ruby 2.5 or later.
 
 h3. Debian and Ubuntu
 
-Debian 9 (stretch) and Ubuntu 16.04 (xenial) ship Ruby 2.3, which is sufficient to run Arvados.  Later releases have newer versions of Ruby that can also run Arvados.
+Debian 9 (stretch) and Ubuntu 16.04 (xenial) ship Ruby 2.3, which is not supported by Arvados.  Use "RVM":#rvm to install Ruby 2.5 or later.
+
+Debian 10 (buster) and Ubuntu 18.04 (bionic) and later ship with Ruby 2.5, which is supported by Arvados.
 
 <notextile>
 <pre><code># <span class="userinput">apt-get --no-install-recommends install ruby ruby-dev bundler</span></code></pre>
index 061b68fa5d27b766e7d45bd0c08750fed210f5dd..1eb2468c321c058298acc7316b23ca23d243f2f8 100644 (file)
@@ -16,6 +16,7 @@ h2. General process
 
 # Consult upgrade notes below to see if any manual configuration updates are necessary.
 # Wait for the cluster to be idle and stop Arvados services.
+# Make a backup of your database, as a precaution.
 # Install new packages using @apt-get upgrade@ or @yum upgrade@.
 # Wait for package installation scripts as they perform any necessary data migrations.
 # Restart Arvados services.
@@ -34,10 +35,14 @@ TODO: extract this information based on git commit messages and generate changel
 <div class="releasenotes">
 </notextile>
 
-h2(#master). development master (as of 2020-06-17)
+h2(#master). development master (as of 2020-09-22)
 
 "Upgrading from 2.0.0":#v2_0_0
 
+h3. Minimum supported Ruby version is now 2.5
+
+The minimum supported Ruby version is now 2.5.  If you are running Arvados on Debian 9 or Ubuntu 16.04, you may need to switch to using RVM or upgrade your OS.  See "Install Ruby and Bundler":../install/ruby.html for more information.
+
 h3. Removing libpam-arvados, replaced with libpam-arvados-go
 
 The Python-based PAM package has been replaced with a version written in Go. See "using PAM for authentication":{{site.baseurl}}/install/setup-login.html#pam for details.
@@ -87,6 +92,10 @@ for uuid in $(arv link list --filters '[["link_class", "=", "permission"], ["tai
 done
 </pre>
 
+h4. "Public favorites" moved to their own project
+
+As a side effect of new permission system constraints, "star" links (indicating shortcuts in Workbench) that were previously owned by "All users" (which is now a "role" and cannot own things) will be migrated to a new system project called "Public favorites" which is readable by the "Anonymous users" role.
+
 h2(#v2_0_0). v2.0.0 (2020-02-07)
 
 "Upgrading from 1.4":#v1_4_1
index 6892176604a91346fc64eea037820f0c1262e3e6..8cebf02cdc10d85df1387cc2a1a7d86c6fb1ce4c 100644 (file)
@@ -85,6 +85,52 @@ To get the token string, combine the values of @uuid@ and @api_token@ in the for
 ARVADOS_API_TOKEN=v2/zzzzz-gj3su-yyyyyyyyyyyyyyy/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 </pre>
 
+h3(#delete-token). Delete a token
+
+If you need to revoke a token, for example the token is leaked to an unauthorized party, you can delete the token at the command line.
+
+1. First, determine the token UUID.  If it is a "v2" format token (starts with "v2/") then the token UUID is middle section between the two slashes.   For example:
+
+<pre>
+v2/zzzzz-gj3su-yyyyyyyyyyyyyyy/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+</pre>
+
+the UUID is "zzzzz-gj3su-yyyyyyyyyyyyyyy" and you can skip to the next step.
+
+If you have a "bare" token (only the secret part) then, as an admin, you need to query the token to get the uuid:
+
+<pre>
+$ ARVADOS_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx arv api_client_authorization current
+{
+ "href":"/api_client_authorizations/x33hz-gj3su-fk8nbj4byptz6ma",
+ "kind":"arvados#apiClientAuthorization",
+ "etag":"77wktnitqeelbgb4riv84zi2q",
+ "uuid":"zzzzz-gj3su-yyyyyyyyyyyyyyy",
+ "owner_uuid":"zzzzz-tpzed-j8w1ymjsn4vf4v4",
+ "created_at":"2020-09-25T15:19:48.606984000Z",
+ "modified_by_client_uuid":null,
+ "modified_by_user_uuid":null,
+ "modified_at":null,
+ "user_id":3,
+ "api_client_id":1,
+ "api_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "created_by_ip_address":null,
+ "default_owner_uuid":null,
+ "expires_at":null,
+ "last_used_at":null,
+ "last_used_by_ip_address":null,
+ "scopes":[
+  "all"
+ ]
+}
+</pre>
+
+2. Now use the token to delete itself:
+
+<pre>
+$ ARVADOS_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx arv api_client_authorization delete --uuid zzzzz-gj3su-yyyyyyyyyyyyyyy
+</pre>
+
 h2. Adding Permissions
 
 h3. VM login
index 2e5de1856dc5f1dd4624c65d1b07369e6d769d24..c71105c74569a88b26c594b32482a696e1ab0165 100644 (file)
@@ -43,28 +43,30 @@ h3. star
 
 A **star** link is a shortcut to a project that is displayed in the user interface (Workbench) as "favorites".  Users can mark their own favorites (implemented by creating or deleting **star** links).
 
-An admin can also create **star** links owned by the "All Users" group, these will be displayed to all users that have permission to read the project that has been favorited.
+An admin can also create **star** links owned by the "Public favorites" project.  These are favorites will be displayed to all users that have permission to read the project that has been favorited.
 
 The schema for a star link is:
 
 table(table table-bordered table-condensed).
 |_. Field|_. Value|_. Description|
-|owner_uuid|user or group uuid|Either the user that owns the favorite, or the "All Users" group for public favorites.|
+|owner_uuid|user or group uuid|Either the user that owns the favorite, or the "Public favorites" group.|
+|tail_uuid|user or group uuid|Should be the same as owner_uuid|
 |head_uuid|project uuid|The project being favorited|
 |link_class|string of value "star"|Indicates this represents a link to a user favorite|
 
-h4. Creating a favorite
+h4. Creating a public favorite
 
-@owner_uuid@ is either an individual user, or the "All Users" group.  The @head_uuid@ is the project being favorited.
+@owner_uuid@ is either an individual user, or the "Public favorites" group.  The @head_uuid@ is the project being favorited.
 
 <pre>
-$ arv link create --link '{
-    "owner_uuid": "zzzzz-j7d0g-fffffffffffffff",
-    "head_uuid":  "zzzzz-j7d0g-theprojectuuid",
-    "link_class": "star"}'
+$ linkuuid=$(arv --format=uuid link create --link '{
+    "link_class": "star",
+    "owner_uuid": "zzzzz-j7d0g-publicfavorites",
+    "tail_uuid": "zzzzz-j7d0g-publicfavorites",
+    "head_uuid":  "zzzzz-j7d0g-theprojectuuid"}')
 </pre>
 
-h4. Deleting a favorite
+h4. Removing a favorite
 
 <pre>
 $ arv link delete --uuid zzzzz-o0j2j-thestarlinkuuid
@@ -77,7 +79,7 @@ To list all 'star' links that will be displayed for a user:
 <pre>
 $ arv link list --filters '[
   ["link_class", "=", "star"],
-  ["owner_uuid", "in", ["zzzzz-j7d0g-fffffffffffffff", "zzzzz-tpzed-currentuseruuid"]]]'
+  ["tail_uuid", "in", ["zzzzz-j7d0g-publicfavorites", "zzzzz-tpzed-currentuseruuid"]]]'
 </pre>
 
 h3. tag
index 2d60f7a3aba34572fda5a445a74a6793687d1a8a..cd4d1cc715e0f8dda3fdbe362ad096173c516f4e 100644 (file)
@@ -125,9 +125,11 @@ h3. 4b. Optional: Setting up to Run a Workflow Using Command Line and an Arvados
 
 Arvados provides a virtual machine which has all the necessary client-side libraries installed to submit to your Arvados cluster using the command line.  Webshell gives you access to an Arvados Virtual Machine (VM) from your browser with no additional setup.  You can access webshell through the Arvados Workbench.  It is the easiest way to try out submitting a workflow to Arvados via the command line.
 
-To get access to webshell on the Arvados Playground, you need to contact a Curii Arvados Playground Administrator to get access to an Arvados shell node by emailing "info@curii.com.":mailto:info@curii.com
+New users are playground are automatically given access to a shell account.
 
-Once you receive an email letting you know your access has been set up and you should be able to access the shell virtual machine.  You can follow the instructions here to access the machine using the browser (also known as using webshell):
+_Note_: the shell accounts are created on an interval and it may take up to two minutes from your initial log in before the shell account is created.
+
+You can follow the instructions here to access the machine using the browser (also known as using webshell):
 * "Accessing an Arvados VM with Webshell":{{ site.baseurl }}/user/getting_started/vm-login-with-webshell.html
 
 Arvados also allows you to ssh into the shell machine and other hosted VMs instead of using the webshell capabilities. However this tutorial does not cover that option in-depth.  If you like to explore it on your own, you can allow the instructions in the documentation here:
index 5288b5c76cd2b3f0d3cd87c78f76f6706889e8f7..9fd7c9e74941f8e12c47ae6bab60f5ea764fa422 100644 (file)
@@ -12,7 +12,7 @@ import (
        "time"
 
        "git.arvados.org/arvados.git/lib/cloud"
-       "git.arvados.org/arvados.git/lib/dispatchcloud/ssh_executor"
+       "git.arvados.org/arvados.git/lib/dispatchcloud/sshexecutor"
        "git.arvados.org/arvados.git/lib/dispatchcloud/worker"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "github.com/sirupsen/logrus"
@@ -48,7 +48,7 @@ type tester struct {
        is              cloud.InstanceSet
        testInstance    *worker.TagVerifier
        secret          string
-       executor        *ssh_executor.Executor
+       executor        *sshexecutor.Executor
        showedLoginInfo bool
 
        failed bool
@@ -150,9 +150,8 @@ func (t *tester) Run() bool {
                        if time.Now().After(bootDeadline) {
                                t.Logger.Error("timed out")
                                return false
-                       } else {
-                               t.sleepSyncInterval()
                        }
+                       t.sleepSyncInterval()
                }
                t.Logger.WithField("Instance", t.testInstance.ID()).Info("new instance appeared")
                t.showLoginInfo()
@@ -308,7 +307,7 @@ func (t *tester) waitForBoot(deadline time.Time) bool {
 // current address.
 func (t *tester) updateExecutor() {
        if t.executor == nil {
-               t.executor = ssh_executor.New(t.testInstance)
+               t.executor = sshexecutor.New(t.testInstance)
                t.executor.SetTargetPort(t.SSHPort)
                t.executor.SetSigners(t.SSHKey)
        } else {
index c329c1f88a4c0b8a2b3c3b49142f3ce60d17e871..29062c491e3467dc31e5782f754d42023217fb2d 100644 (file)
@@ -308,9 +308,8 @@ func (inst *ec2Instance) Destroy() error {
 func (inst *ec2Instance) Address() string {
        if inst.instance.PrivateIpAddress != nil {
                return *inst.instance.PrivateIpAddress
-       } else {
-               return ""
        }
+       return ""
 }
 
 func (inst *ec2Instance) RemoteUser() string {
index 15e7c7c06ce723114cafc86d8e4c6ec0c2b99dff..d0338e8c86636480dc9640c9683039f2a94b1603 100644 (file)
@@ -287,6 +287,20 @@ Clusters:
       # address is used.
       PreferDomainForUsername: ""
 
+      UserSetupMailText: |
+        <% if not @user.full_name.empty? -%>
+        <%= @user.full_name %>,
+        <% else -%>
+        Hi there,
+        <% end -%>
+
+        Your Arvados account has been set up.  You can log in at
+
+        <%= Rails.configuration.Services.Workbench1.ExternalURL %>
+
+        Thanks,
+        Your Arvados administrator.
+
     AuditLogs:
       # Time to keep audit logs, in seconds. (An audit log is a row added
       # to the "logs" table in the PostgreSQL database each time an
index 6ab69d21fe13eaec3dff84a3ef74e8febc88ff1b..81c6767a10996fd684305fcc328b27310f4e1234 100644 (file)
@@ -214,6 +214,7 @@ var whitelist = map[string]bool{
        "Users.PreferDomainForUsername":                false,
        "Users.UserNotifierEmailFrom":                  false,
        "Users.UserProfileNotificationAddress":         false,
+       "Users.UserSetupMailText":                      false,
        "Volumes":                                      true,
        "Volumes.*":                                    true,
        "Volumes.*.*":                                  false,
index 7ed332151b8bbacaa81fa7352e8251058296b8c8..88d71eb0ac83b76c38cbeedc0df8456eba70bf52 100644 (file)
@@ -293,6 +293,20 @@ Clusters:
       # address is used.
       PreferDomainForUsername: ""
 
+      UserSetupMailText: |
+        <% if not @user.full_name.empty? -%>
+        <%= @user.full_name %>,
+        <% else -%>
+        Hi there,
+        <% end -%>
+
+        Your Arvados account has been set up.  You can log in at
+
+        <%= Rails.configuration.Services.Workbench1.ExternalURL %>
+
+        Thanks,
+        Your Arvados administrator.
+
     AuditLogs:
       # Time to keep audit logs, in seconds. (An audit log is a row added
       # to the "logs" table in the PostgreSQL database each time an
index 361c9613dd4e2dec8db1ba58b66a6b5c5fd34817..61cac9bbabcd1d5128417fe0ab91041981afd207 100644 (file)
@@ -203,9 +203,8 @@ func (conn *Conn) Login(ctx context.Context, options arvados.LoginOptions) (arva
                return arvados.LoginResponse{
                        RedirectLocation: target.String(),
                }, nil
-       } else {
-               return conn.local.Login(ctx, options)
        }
+       return conn.local.Login(ctx, options)
 }
 
 func (conn *Conn) Logout(ctx context.Context, options arvados.LogoutOptions) (arvados.LogoutResponse, error) {
index 9274d75d7c9fdc1973cbcad621b306599e571893..e0b01f13ebee8c4f01084d0dc4c8dca76804e696 100644 (file)
@@ -106,34 +106,33 @@ func (ctrl *oidcLoginController) Login(ctx context.Context, opts arvados.LoginOp
                                // one Google account.
                                oauth2.SetAuthURLParam("prompt", "select_account")),
                }, nil
-       } else {
-               // Callback after OIDC sign-in.
-               state := ctrl.parseOAuth2State(opts.State)
-               if !state.verify([]byte(ctrl.Cluster.SystemRootToken)) {
-                       return loginError(errors.New("invalid OAuth2 state"))
-               }
-               oauth2Token, err := ctrl.oauth2conf.Exchange(ctx, opts.Code)
-               if err != nil {
-                       return loginError(fmt.Errorf("error in OAuth2 exchange: %s", err))
-               }
-               rawIDToken, ok := oauth2Token.Extra("id_token").(string)
-               if !ok {
-                       return loginError(errors.New("error in OAuth2 exchange: no ID token in OAuth2 token"))
-               }
-               idToken, err := ctrl.verifier.Verify(ctx, rawIDToken)
-               if err != nil {
-                       return loginError(fmt.Errorf("error verifying ID token: %s", err))
-               }
-               authinfo, err := ctrl.getAuthInfo(ctx, oauth2Token, idToken)
-               if err != nil {
-                       return loginError(err)
-               }
-               ctxRoot := auth.NewContext(ctx, &auth.Credentials{Tokens: []string{ctrl.Cluster.SystemRootToken}})
-               return ctrl.RailsProxy.UserSessionCreate(ctxRoot, rpc.UserSessionCreateOptions{
-                       ReturnTo: state.Remote + "," + state.ReturnTo,
-                       AuthInfo: *authinfo,
-               })
        }
+       // Callback after OIDC sign-in.
+       state := ctrl.parseOAuth2State(opts.State)
+       if !state.verify([]byte(ctrl.Cluster.SystemRootToken)) {
+               return loginError(errors.New("invalid OAuth2 state"))
+       }
+       oauth2Token, err := ctrl.oauth2conf.Exchange(ctx, opts.Code)
+       if err != nil {
+               return loginError(fmt.Errorf("error in OAuth2 exchange: %s", err))
+       }
+       rawIDToken, ok := oauth2Token.Extra("id_token").(string)
+       if !ok {
+               return loginError(errors.New("error in OAuth2 exchange: no ID token in OAuth2 token"))
+       }
+       idToken, err := ctrl.verifier.Verify(ctx, rawIDToken)
+       if err != nil {
+               return loginError(fmt.Errorf("error verifying ID token: %s", err))
+       }
+       authinfo, err := ctrl.getAuthInfo(ctx, oauth2Token, idToken)
+       if err != nil {
+               return loginError(err)
+       }
+       ctxRoot := auth.NewContext(ctx, &auth.Credentials{Tokens: []string{ctrl.Cluster.SystemRootToken}})
+       return ctrl.RailsProxy.UserSessionCreate(ctxRoot, rpc.UserSessionCreateOptions{
+               ReturnTo: state.Remote + "," + state.ReturnTo,
+               AuthInfo: *authinfo,
+       })
 }
 
 func (ctrl *oidcLoginController) UserAuthenticate(ctx context.Context, opts arvados.UserAuthenticateOptions) (arvados.APIClientAuthorization, error) {
@@ -190,9 +189,8 @@ func (ctrl *oidcLoginController) getAuthInfo(ctx context.Context, token *oauth2.
                        // only the "fix config" advice to the user.
                        ctxlog.FromContext(ctx).WithError(err).WithField("email", ret.Email).Error("People API is not enabled")
                        return nil, errors.New("configuration error: Login.GoogleAlternateEmailAddresses is true, but Google People API is not enabled")
-               } else {
-                       return nil, fmt.Errorf("error getting profile info from People API: %s", err)
                }
+               return nil, fmt.Errorf("error getting profile info from People API: %s", err)
        }
 
        // The given/family names returned by the People API and
index e8c7660d1aee39424f88d2d6de0e2b3a213baa36..55cc6ee564be66ed2ecfc0e7713ad0c150a03e9e 100644 (file)
@@ -157,9 +157,8 @@ func (t *TestDockerClient) ContainerStart(ctx context.Context, container string,
        if container == "abcde" {
                // t.fn gets executed in ContainerWait
                return nil
-       } else {
-               return errors.New("Invalid container id")
        }
+       return errors.New("Invalid container id")
 }
 
 func (t *TestDockerClient) ContainerRemove(ctx context.Context, container string, options dockertypes.ContainerRemoveOptions) error {
@@ -196,9 +195,8 @@ func (t *TestDockerClient) ImageInspectWithRaw(ctx context.Context, image string
 
        if t.imageLoaded == image {
                return dockertypes.ImageInspect{}, nil, nil
-       } else {
-               return dockertypes.ImageInspect{}, nil, errors.New("")
        }
+       return dockertypes.ImageInspect{}, nil, errors.New("")
 }
 
 func (t *TestDockerClient) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (dockertypes.ImageLoadResponse, error) {
@@ -208,10 +206,9 @@ func (t *TestDockerClient) ImageLoad(ctx context.Context, input io.Reader, quiet
        _, err := io.Copy(ioutil.Discard, input)
        if err != nil {
                return dockertypes.ImageLoadResponse{}, err
-       } else {
-               t.imageLoaded = hwImageId
-               return dockertypes.ImageLoadResponse{Body: ioutil.NopCloser(input)}, nil
        }
+       t.imageLoaded = hwImageId
+       return dockertypes.ImageLoadResponse{Body: ioutil.NopCloser(input)}, nil
 }
 
 func (*TestDockerClient) ImageRemove(ctx context.Context, image string, options dockertypes.ImageRemoveOptions) ([]dockertypes.ImageDeleteResponseItem, error) {
@@ -260,9 +257,8 @@ func (client *ArvTestClient) Call(method, resourceType, uuid, action string, par
        case method == "GET" && resourceType == "containers" && action == "secret_mounts":
                if client.secretMounts != nil {
                        return json.Unmarshal(client.secretMounts, output)
-               } else {
-                       return json.Unmarshal([]byte(`{"secret_mounts":{}}`), output)
                }
+               return json.Unmarshal([]byte(`{"secret_mounts":{}}`), output)
        default:
                return fmt.Errorf("Not found")
        }
index d5de184e5c41bf8e9dc434fe226d8d5ed17fa1f9..febfb1404d32b4f59776a97c45692d7b5c5ab0a9 100644 (file)
@@ -368,9 +368,8 @@ func (arvlog *ArvLogWriter) rateLimit(line []byte, now time.Time) (bool, []byte)
                // instead of the log message that exceeded the limit.
                message += " A complete log is still being written to Keep, and will be available when the job finishes."
                return true, []byte(message)
-       } else {
-               return arvlog.logThrottleIsOpen, line
        }
+       return arvlog.logThrottleIsOpen, line
 }
 
 // load the rate limit discovery config parameters
index 278bcb66579b7f37c280e0c2bf5c62ca3524694d..7614a143abded97b08757138bd4b152771eb3588 100644 (file)
@@ -17,7 +17,7 @@ import (
        "git.arvados.org/arvados.git/lib/cloud"
        "git.arvados.org/arvados.git/lib/dispatchcloud/container"
        "git.arvados.org/arvados.git/lib/dispatchcloud/scheduler"
-       "git.arvados.org/arvados.git/lib/dispatchcloud/ssh_executor"
+       "git.arvados.org/arvados.git/lib/dispatchcloud/sshexecutor"
        "git.arvados.org/arvados.git/lib/dispatchcloud/worker"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/auth"
@@ -100,7 +100,7 @@ func (disp *dispatcher) Close() {
 
 // Make a worker.Executor for the given instance.
 func (disp *dispatcher) newExecutor(inst cloud.Instance) worker.Executor {
-       exr := ssh_executor.New(inst)
+       exr := sshexecutor.New(inst)
        exr.SetTargetPort(disp.Cluster.Containers.CloudVMs.SSHPort)
        exr.SetSigners(disp.sshKey)
        return exr
index 9f1eb098e01aa029ebe735f2f8a7a956bf56c236..d5d90bf3518b75fb548e810e2ad8a7cc2c9867ba 100644 (file)
@@ -227,6 +227,10 @@ func (s *DispatcherSuite) TestDispatchToStubDriver(c *check.C) {
        c.Check(resp.Body.String(), check.Matches, `(?ms).*time_from_shutdown_request_to_disappearance_seconds_sum [0-9.]*`)
        c.Check(resp.Body.String(), check.Matches, `(?ms).*time_from_queue_to_crunch_run_seconds_count [0-9]*`)
        c.Check(resp.Body.String(), check.Matches, `(?ms).*time_from_queue_to_crunch_run_seconds_sum [0-9e+.]*`)
+       c.Check(resp.Body.String(), check.Matches, `(?ms).*run_probe_duration_seconds_count{outcome="success"} [0-9]*`)
+       c.Check(resp.Body.String(), check.Matches, `(?ms).*run_probe_duration_seconds_sum{outcome="success"} [0-9e+.]*`)
+       c.Check(resp.Body.String(), check.Matches, `(?ms).*run_probe_duration_seconds_count{outcome="fail"} [0-9]*`)
+       c.Check(resp.Body.String(), check.Matches, `(?ms).*run_probe_duration_seconds_sum{outcome="fail"} [0-9e+.]*`)
 }
 
 func (s *DispatcherSuite) TestAPIPermissions(c *check.C) {
similarity index 98%
rename from lib/dispatchcloud/ssh_executor/executor.go
rename to lib/dispatchcloud/sshexecutor/executor.go
index 79b82e6c37a0248cc0db3d33105829ad23c76307..c37169921cf594ac035263ad4c53d4c176c13214 100644 (file)
@@ -2,9 +2,9 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-// Package ssh_executor provides an implementation of pool.Executor
+// Package sshexecutor provides an implementation of pool.Executor
 // using a long-lived multiplexed SSH session.
-package ssh_executor
+package sshexecutor
 
 import (
        "bytes"
similarity index 99%
rename from lib/dispatchcloud/ssh_executor/executor_test.go
rename to lib/dispatchcloud/sshexecutor/executor_test.go
index b7f3aadd8ab268a755aabcbc79543a76bc693d96..b4afeafa82dab3e671f48802646df185d8a64590 100644 (file)
@@ -2,7 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-package ssh_executor
+package sshexecutor
 
 import (
        "bytes"
index c6eaeae2b618b11423512cc2be1cb5cfc454c20c..a25ed60150718f83829a003d6b0e8267a382a430 100644 (file)
@@ -86,9 +86,8 @@ const (
 func duration(conf arvados.Duration, def time.Duration) time.Duration {
        if conf > 0 {
                return time.Duration(conf)
-       } else {
-               return def
        }
+       return def
 }
 
 // NewPool creates a Pool of workers backed by instanceSet.
@@ -184,6 +183,7 @@ type Pool struct {
        mTimeToReadyForContainer  prometheus.Summary
        mTimeFromShutdownToGone   prometheus.Summary
        mTimeFromQueueToCrunchRun prometheus.Summary
+       mRunProbeDuration         *prometheus.SummaryVec
 }
 
 type createCall struct {
@@ -682,6 +682,14 @@ func (wp *Pool) registerMetrics(reg *prometheus.Registry) {
                Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001},
        })
        reg.MustRegister(wp.mTimeFromQueueToCrunchRun)
+       wp.mRunProbeDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{
+               Namespace:  "arvados",
+               Subsystem:  "dispatchcloud",
+               Name:       "instances_run_probe_duration_seconds",
+               Help:       "Number of seconds per runProbe call.",
+               Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001},
+       }, []string{"outcome"})
+       reg.MustRegister(wp.mRunProbeDuration)
 }
 
 func (wp *Pool) runMetrics() {
index 5b145d7c6599b75bb6e8b30f6c65e65d82186d84..9e89d7daafc01d05b770fb065f88049dea231a7e 100644 (file)
@@ -192,7 +192,7 @@ func (wkr *worker) startContainer(ctr arvados.Container) {
 }
 
 // ProbeAndUpdate conducts appropriate boot/running probes (if any)
-// for the worker's curent state. If a previous probe is still
+// for the worker's current state. If a previous probe is still
 // running, it does nothing.
 //
 // It should be called in a new goroutine.
@@ -376,6 +376,7 @@ func (wkr *worker) probeRunning() (running []string, reportsBroken, ok bool) {
        if u := wkr.instance.RemoteUser(); u != "root" {
                cmd = "sudo " + cmd
        }
+       before := time.Now()
        stdout, stderr, err := wkr.executor.Execute(nil, cmd, nil)
        if err != nil {
                wkr.logger.WithFields(logrus.Fields{
@@ -383,8 +384,10 @@ func (wkr *worker) probeRunning() (running []string, reportsBroken, ok bool) {
                        "stdout":  string(stdout),
                        "stderr":  string(stderr),
                }).WithError(err).Warn("probe failed")
+               wkr.wp.mRunProbeDuration.WithLabelValues("fail").Observe(time.Now().Sub(before).Seconds())
                return
        }
+       wkr.wp.mRunProbeDuration.WithLabelValues("success").Observe(time.Now().Sub(before).Seconds())
        ok = true
 
        staleRunLock := false
index a4c2a6370f3d5ce3803484b18ac811abec7e6bc1..cfb7a1bfb7a72b8924d5950deb7fc478f20873b0 100644 (file)
@@ -17,6 +17,7 @@ import (
        "git.arvados.org/arvados.git/lib/dispatchcloud/test"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/ctxlog"
+       "github.com/prometheus/client_golang/prometheus"
        check "gopkg.in/check.v1"
 )
 
@@ -239,6 +240,7 @@ func (suite *WorkerSuite) TestProbeAndUpdate(c *check.C) {
                        runnerData:       trial.deployRunner,
                        runnerMD5:        md5.Sum(trial.deployRunner),
                }
+               wp.registerMetrics(prometheus.NewRegistry())
                if trial.deployRunner != nil {
                        svHash := md5.Sum(trial.deployRunner)
                        wp.runnerCmd = fmt.Sprintf("/var/run/arvados/crunch-run~%x", svHash)
index 93a0ce452bf7c59f0483b1b84eacb6cac3416c8d..4378023158a085d0500b2d88164d0babc21671e7 100644 (file)
@@ -144,6 +144,11 @@ func (installCommand) RunCommand(prog string, args []string, stdin io.Reader, st
                        "python3-dev",
                        "r-base",
                        "r-cran-testthat",
+                       "r-cran-devtools",
+                       "r-cran-knitr",
+                       "r-cran-markdown",
+                       "r-cran-roxygen2",
+                       "r-cran-xml",
                        "sudo",
                        "python3-virtualenv",
                        "python3-venv",
index 878a70901452b47e2710a52be85504179767ea38..75ac892b4ba6680a7af4c91e47f1e770fcd7020c 100644 (file)
@@ -1,9 +1,9 @@
 Package: ArvadosR
 Type: Package
 Title: Arvados R SDK
-Version: 0.0.5
-Authors@R: person("Fuad", "Muhic", role = c("aut", "cre"), email = "fmuhic@capeannenterprises.com")
-Maintainer: Ward Vandewege <wvandewege@veritasgenetics.com>
+Version: 0.0.6
+Authors@R: c(person("Fuad", "Muhic", role = c("aut", "ctr"), email = "fmuhic@capeannenterprises.com"),
+             person("Peter", "Amstutz", role = c("cre"), email = "peter.amstutz@curii.com"))
 Description: This is the Arvados R SDK
 URL: http://doc.arvados.org
 License: Apache-2.0
index 744cb3c296163906be8be5858e0713e8d43aa44e..528a60665043d90cba5c785c45fd20615538499c 100644 (file)
-#' 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.
-#' @name users.get
-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.
-#' @return User object.
-#' @name users.create
-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.
-#' @return User object.
-#' @name users.update
-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.
-#' @name users.delete
-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 
-#' @return User object.
-#' @name users.activate
-NULL
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
 
-#' users.setup
+#' api_clients.get
 #' 
-#' users.setup is a method defined in Arvados class.
+#' api_clients.get 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 
-#' @return User object.
-#' @name users.setup
+#' @usage arv$api_clients.get(uuid)
+#' @param uuid The UUID of the ApiClient in question.
+#' @return ApiClient object.
+#' @name api_clients.get
 NULL
 
-#' users.unsetup
+#' api_clients.create
 #' 
-#' users.unsetup is a method defined in Arvados class.
+#' api_clients.create is a method defined in Arvados class.
 #' 
-#' @usage arv$users.unsetup(uuid)
-#' @param uuid 
-#' @return User object.
-#' @name users.unsetup
+#' @usage arv$api_clients.create(apiclient,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param apiClient ApiClient object.
+#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return ApiClient object.
+#' @name api_clients.create
 NULL
 
-#' users.update_uuid
+#' api_clients.update
 #' 
-#' users.update_uuid is a method defined in Arvados class.
+#' api_clients.update is a method defined in Arvados class.
 #' 
-#' @usage arv$users.update_uuid(uuid, new_uuid)
-#' @param uuid 
-#' @param new_uuid 
-#' @return User object.
-#' @name users.update_uuid
+#' @usage arv$api_clients.update(apiclient,
+#'     uuid)
+#' @param apiClient ApiClient object.
+#' @param uuid The UUID of the ApiClient in question.
+#' @return ApiClient object.
+#' @name api_clients.update
 NULL
 
-#' users.merge
+#' api_clients.delete
 #' 
-#' users.merge is a method defined in Arvados class.
+#' api_clients.delete is a method defined in Arvados class.
 #' 
-#' @usage arv$users.merge(new_owner_uuid,
-#'     new_user_token, redirect_to_new_user = NULL)
-#' @param new_owner_uuid 
-#' @param new_user_token 
-#' @param redirect_to_new_user 
-#' @return User object.
-#' @name users.merge
+#' @usage arv$api_clients.delete(uuid)
+#' @param uuid The UUID of the ApiClient in question.
+#' @return ApiClient object.
+#' @name api_clients.delete
 NULL
 
-#' users.list
+#' api_clients.list
 #' 
-#' users.list is a method defined in Arvados class.
+#' api_clients.list is a method defined in Arvados class.
 #' 
-#' @usage arv$users.list(filters = NULL,
+#' @usage arv$api_clients.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -133,8 +63,10 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return UserList object.
-#' @name users.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return ApiClientList object.
+#' @name api_clients.list
 NULL
 
 #' api_client_authorizations.get
@@ -152,9 +84,10 @@ NULL
 #' api_client_authorizations.create is a method defined in Arvados class.
 #' 
 #' @usage arv$api_client_authorizations.create(apiclientauthorization,
-#'     ensure_unique_name = "false")
+#'     ensure_unique_name = "false", cluster_id = NULL)
 #' @param apiClientAuthorization ApiClientAuthorization object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
 #' @return ApiClientAuthorization object.
 #' @name api_client_authorizations.create
 NULL
@@ -209,7 +142,7 @@ NULL
 #' @usage arv$api_client_authorizations.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -218,111 +151,173 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
 #' @return ApiClientAuthorizationList object.
 #' @name api_client_authorizations.list
 NULL
 
-#' containers.get
+#' authorized_keys.get
 #' 
-#' containers.get is a method defined in Arvados class.
+#' authorized_keys.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.
-#' @name containers.get
+#' @usage arv$authorized_keys.get(uuid)
+#' @param uuid The UUID of the AuthorizedKey in question.
+#' @return AuthorizedKey object.
+#' @name authorized_keys.get
 NULL
 
-#' containers.create
+#' authorized_keys.create
 #' 
-#' containers.create is a method defined in Arvados class.
+#' authorized_keys.create is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.create(container,
-#'     ensure_unique_name = "false")
-#' @param container Container object.
+#' @usage arv$authorized_keys.create(authorizedkey,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param authorizedKey AuthorizedKey object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Container object.
-#' @name containers.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return AuthorizedKey object.
+#' @name authorized_keys.create
 NULL
 
-#' containers.update
+#' authorized_keys.update
 #' 
-#' containers.update is a method defined in Arvados class.
+#' authorized_keys.update is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.update(container,
+#' @usage arv$authorized_keys.update(authorizedkey,
 #'     uuid)
-#' @param container Container object.
-#' @param uuid The UUID of the Container in question.
-#' @return Container object.
-#' @name containers.update
+#' @param authorizedKey AuthorizedKey object.
+#' @param uuid The UUID of the AuthorizedKey in question.
+#' @return AuthorizedKey object.
+#' @name authorized_keys.update
 NULL
 
-#' containers.delete
+#' authorized_keys.delete
 #' 
-#' containers.delete is a method defined in Arvados class.
+#' authorized_keys.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.
-#' @name containers.delete
+#' @usage arv$authorized_keys.delete(uuid)
+#' @param uuid The UUID of the AuthorizedKey in question.
+#' @return AuthorizedKey object.
+#' @name authorized_keys.delete
 NULL
 
-#' containers.auth
+#' authorized_keys.list
 #' 
-#' containers.auth is a method defined in Arvados class.
+#' authorized_keys.list is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.auth(uuid)
-#' @param uuid 
-#' @return Container object.
-#' @name containers.auth
+#' @usage arv$authorized_keys.list(filters = NULL,
+#'     where = NULL, order = NULL, select = NULL,
+#'     distinct = NULL, limit = "100", offset = "0",
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
+#' @param filters 
+#' @param where 
+#' @param order 
+#' @param select 
+#' @param distinct 
+#' @param limit 
+#' @param offset 
+#' @param count 
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return AuthorizedKeyList object.
+#' @name authorized_keys.list
 NULL
 
-#' containers.lock
+#' collections.get
 #' 
-#' containers.lock is a method defined in Arvados class.
+#' collections.get is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.lock(uuid)
-#' @param uuid 
-#' @return Container object.
-#' @name containers.lock
+#' @usage arv$collections.get(uuid)
+#' @param uuid The UUID of the Collection in question.
+#' @return Collection object.
+#' @name collections.get
 NULL
 
-#' containers.unlock
+#' collections.create
 #' 
-#' containers.unlock is a method defined in Arvados class.
+#' collections.create is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.unlock(uuid)
-#' @param uuid 
-#' @return Container object.
-#' @name containers.unlock
+#' @usage arv$collections.create(collection,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param collection Collection object.
+#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Collection object.
+#' @name collections.create
 NULL
 
-#' containers.secret_mounts
+#' collections.update
 #' 
-#' containers.secret_mounts is a method defined in Arvados class.
+#' collections.update is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.secret_mounts(uuid)
-#' @param uuid 
-#' @return Container object.
-#' @name containers.secret_mounts
+#' @usage arv$collections.update(collection,
+#'     uuid)
+#' @param collection Collection object.
+#' @param uuid The UUID of the Collection in question.
+#' @return Collection object.
+#' @name collections.update
 NULL
 
-#' containers.current
+#' collections.delete
 #' 
-#' containers.current is a method defined in Arvados class.
+#' collections.delete is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.current(NULL)
-#' @return Container object.
-#' @name containers.current
+#' @usage arv$collections.delete(uuid)
+#' @param uuid The UUID of the Collection in question.
+#' @return Collection object.
+#' @name collections.delete
 NULL
 
-#' containers.list
+#' collections.provenance
 #' 
-#' containers.list is a method defined in Arvados class.
+#' collections.provenance is a method defined in Arvados class.
 #' 
-#' @usage arv$containers.list(filters = NULL,
+#' @usage arv$collections.provenance(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 
+#' @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 
+#' @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 
+#' @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")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL,
+#'     include_trash = NULL, include_old_versions = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -331,62 +326,116 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return ContainerList object.
-#' @name containers.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @param include_trash Include collections whose is_trashed attribute is true.
+#' @param include_old_versions Include past collection versions.
+#' @return CollectionList object.
+#' @name collections.list
 NULL
 
-#' api_clients.get
+#' containers.get
 #' 
-#' api_clients.get is a method defined in Arvados class.
+#' containers.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.
-#' @name api_clients.get
+#' @usage arv$containers.get(uuid)
+#' @param uuid The UUID of the Container in question.
+#' @return Container object.
+#' @name containers.get
 NULL
 
-#' api_clients.create
+#' containers.create
 #' 
-#' api_clients.create is a method defined in Arvados class.
+#' containers.create is a method defined in Arvados class.
 #' 
-#' @usage arv$api_clients.create(apiclient,
-#'     ensure_unique_name = "false")
-#' @param apiClient ApiClient object.
+#' @usage arv$containers.create(container,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param container Container object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return ApiClient object.
-#' @name api_clients.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Container object.
+#' @name containers.create
 NULL
 
-#' api_clients.update
+#' containers.update
 #' 
-#' api_clients.update is a method defined in Arvados class.
+#' containers.update is a method defined in Arvados class.
 #' 
-#' @usage arv$api_clients.update(apiclient,
+#' @usage arv$containers.update(container,
 #'     uuid)
-#' @param apiClient ApiClient object.
-#' @param uuid The UUID of the ApiClient in question.
-#' @return ApiClient object.
-#' @name api_clients.update
+#' @param container Container object.
+#' @param uuid The UUID of the Container in question.
+#' @return Container object.
+#' @name containers.update
 NULL
 
-#' api_clients.delete
+#' containers.delete
 #' 
-#' api_clients.delete is a method defined in Arvados class.
+#' containers.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.
-#' @name api_clients.delete
+#' @usage arv$containers.delete(uuid)
+#' @param uuid The UUID of the Container in question.
+#' @return Container object.
+#' @name containers.delete
 NULL
 
-#' api_clients.list
+#' containers.auth
 #' 
-#' api_clients.list is a method defined in Arvados class.
+#' containers.auth is a method defined in Arvados class.
 #' 
-#' @usage arv$api_clients.list(filters = NULL,
+#' @usage arv$containers.auth(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 
+#' @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 
+#' @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 
+#' @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")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -395,8 +444,10 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return ApiClientList object.
-#' @name api_clients.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return ContainerList object.
+#' @name containers.list
 NULL
 
 #' container_requests.get
@@ -414,9 +465,10 @@ NULL
 #' container_requests.create is a method defined in Arvados class.
 #' 
 #' @usage arv$container_requests.create(containerrequest,
-#'     ensure_unique_name = "false")
+#'     ensure_unique_name = "false", cluster_id = NULL)
 #' @param containerRequest ContainerRequest object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
 #' @return ContainerRequest object.
 #' @name container_requests.create
 NULL
@@ -450,7 +502,8 @@ NULL
 #' @usage arv$container_requests.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL,
+#'     include_trash = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -459,62 +512,96 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @param include_trash Include container requests whose owner project is trashed.
 #' @return ContainerRequestList object.
 #' @name container_requests.list
 NULL
 
-#' authorized_keys.get
+#' groups.get
 #' 
-#' authorized_keys.get is a method defined in Arvados class.
+#' groups.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.
-#' @name authorized_keys.get
+#' @usage arv$groups.get(uuid)
+#' @param uuid The UUID of the Group in question.
+#' @return Group object.
+#' @name groups.get
 NULL
 
-#' authorized_keys.create
+#' groups.create
 #' 
-#' authorized_keys.create is a method defined in Arvados class.
+#' groups.create is a method defined in Arvados class.
 #' 
-#' @usage arv$authorized_keys.create(authorizedkey,
-#'     ensure_unique_name = "false")
-#' @param authorizedKey AuthorizedKey object.
+#' @usage arv$groups.create(group, ensure_unique_name = "false",
+#'     cluster_id = NULL, async = "false")
+#' @param group Group object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return AuthorizedKey object.
-#' @name authorized_keys.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @param async defer permissions update
+#' @return Group object.
+#' @name groups.create
 NULL
 
-#' authorized_keys.update
+#' groups.update
 #' 
-#' authorized_keys.update is a method defined in Arvados class.
+#' groups.update is a method defined in Arvados class.
 #' 
-#' @usage arv$authorized_keys.update(authorizedkey,
-#'     uuid)
-#' @param authorizedKey AuthorizedKey object.
-#' @param uuid The UUID of the AuthorizedKey in question.
-#' @return AuthorizedKey object.
-#' @name authorized_keys.update
+#' @usage arv$groups.update(group, uuid,
+#'     async = "false")
+#' @param group Group object.
+#' @param uuid The UUID of the Group in question.
+#' @param async defer permissions update
+#' @return Group object.
+#' @name groups.update
 NULL
 
-#' authorized_keys.delete
+#' groups.delete
 #' 
-#' authorized_keys.delete is a method defined in Arvados class.
+#' groups.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.
-#' @name authorized_keys.delete
+#' @usage arv$groups.delete(uuid)
+#' @param uuid The UUID of the Group in question.
+#' @return Group object.
+#' @name groups.delete
 NULL
 
-#' authorized_keys.list
+#' groups.contents
 #' 
-#' authorized_keys.list is a method defined in Arvados class.
+#' groups.contents is a method defined in Arvados class.
 #' 
-#' @usage arv$authorized_keys.list(filters = NULL,
+#' @usage arv$groups.contents(filters = NULL,
+#'     where = NULL, order = NULL, distinct = NULL,
+#'     limit = "100", offset = "0", count = "exact",
+#'     cluster_id = NULL, bypass_federation = NULL,
+#'     include_trash = NULL, uuid = NULL, recursive = NULL,
+#'     include = NULL)
+#' @param filters 
+#' @param where 
+#' @param order 
+#' @param distinct 
+#' @param limit 
+#' @param offset 
+#' @param count 
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @param include_trash Include items whose is_trashed attribute is true.
+#' @param uuid 
+#' @param recursive Include contents from child groups recursively.
+#' @param include Include objects referred to by listed field in "included" (only owner_uuid)
+#' @return Group object.
+#' @name groups.contents
+NULL
+
+#' groups.shared
+#' 
+#' groups.shared is a method defined in Arvados class.
+#' 
+#' @usage arv$groups.shared(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL,
+#'     include_trash = NULL, include = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -523,102 +610,120 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return AuthorizedKeyList object.
-#' @name authorized_keys.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @param include_trash Include items whose is_trashed attribute is true.
+#' @param include 
+#' @return Group object.
+#' @name groups.shared
 NULL
 
-#' collections.get
+#' groups.trash
 #' 
-#' collections.get is a method defined in Arvados class.
+#' groups.trash is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.get(uuid)
-#' @param uuid The UUID of the Collection in question.
-#' @return Collection object.
-#' @name collections.get
+#' @usage arv$groups.trash(uuid)
+#' @param uuid 
+#' @return Group object.
+#' @name groups.trash
 NULL
 
-#' collections.create
+#' groups.untrash
 #' 
-#' collections.create is a method defined in Arvados class.
+#' groups.untrash is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.create(collection,
-#'     ensure_unique_name = "false")
-#' @param collection Collection object.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Collection object.
-#' @name collections.create
+#' @usage arv$groups.untrash(uuid)
+#' @param uuid 
+#' @return Group object.
+#' @name groups.untrash
 NULL
 
-#' collections.update
+#' groups.list
 #' 
-#' collections.update is a method defined in Arvados class.
+#' groups.list is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.update(collection,
-#'     uuid)
-#' @param collection Collection object.
-#' @param uuid The UUID of the Collection in question.
-#' @return Collection object.
-#' @name collections.update
+#' @usage arv$groups.list(filters = NULL,
+#'     where = NULL, order = NULL, select = NULL,
+#'     distinct = NULL, limit = "100", offset = "0",
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL,
+#'     include_trash = NULL)
+#' @param filters 
+#' @param where 
+#' @param order 
+#' @param select 
+#' @param distinct 
+#' @param limit 
+#' @param offset 
+#' @param count 
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @param include_trash Include items whose is_trashed attribute is true.
+#' @return GroupList object.
+#' @name groups.list
 NULL
 
-#' collections.delete
+#' keep_services.get
 #' 
-#' collections.delete is a method defined in Arvados class.
+#' keep_services.get is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.delete(uuid)
-#' @param uuid The UUID of the Collection in question.
-#' @return Collection object.
-#' @name collections.delete
+#' @usage arv$keep_services.get(uuid)
+#' @param uuid The UUID of the KeepService in question.
+#' @return KeepService object.
+#' @name keep_services.get
 NULL
 
-#' collections.provenance
+#' keep_services.create
 #' 
-#' collections.provenance is a method defined in Arvados class.
+#' keep_services.create is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.provenance(uuid)
-#' @param uuid 
-#' @return Collection object.
-#' @name collections.provenance
+#' @usage arv$keep_services.create(keepservice,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param keepService KeepService object.
+#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return KeepService object.
+#' @name keep_services.create
 NULL
 
-#' collections.used_by
+#' keep_services.update
 #' 
-#' collections.used_by is a method defined in Arvados class.
+#' keep_services.update is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.used_by(uuid)
-#' @param uuid 
-#' @return Collection object.
-#' @name collections.used_by
+#' @usage arv$keep_services.update(keepservice,
+#'     uuid)
+#' @param keepService KeepService object.
+#' @param uuid The UUID of the KeepService in question.
+#' @return KeepService object.
+#' @name keep_services.update
 NULL
 
-#' collections.trash
+#' keep_services.delete
 #' 
-#' collections.trash is a method defined in Arvados class.
+#' keep_services.delete is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.trash(uuid)
-#' @param uuid 
-#' @return Collection object.
-#' @name collections.trash
+#' @usage arv$keep_services.delete(uuid)
+#' @param uuid The UUID of the KeepService in question.
+#' @return KeepService object.
+#' @name keep_services.delete
 NULL
 
-#' collections.untrash
+#' keep_services.accessible
 #' 
-#' collections.untrash is a method defined in Arvados class.
+#' keep_services.accessible is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.untrash(uuid)
-#' @param uuid 
-#' @return Collection object.
-#' @name collections.untrash
+#' @usage arv$keep_services.accessible(NULL)
+#' @return KeepService object.
+#' @name keep_services.accessible
 NULL
 
-#' collections.list
+#' keep_services.list
 #' 
-#' collections.list is a method defined in Arvados class.
+#' keep_services.list is a method defined in Arvados class.
 #' 
-#' @usage arv$collections.list(filters = NULL,
+#' @usage arv$keep_services.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact", include_trash = NULL)
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -627,61 +732,64 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @param include_trash Include collections whose is_trashed attribute is true.
-#' @return CollectionList object.
-#' @name collections.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return KeepServiceList object.
+#' @name keep_services.list
 NULL
 
-#' humans.get
+#' links.get
 #' 
-#' humans.get is a method defined in Arvados class.
+#' links.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.
-#' @name humans.get
+#' @usage arv$links.get(uuid)
+#' @param uuid The UUID of the Link in question.
+#' @return Link object.
+#' @name links.get
 NULL
 
-#' humans.create
+#' links.create
 #' 
-#' humans.create is a method defined in Arvados class.
+#' links.create is a method defined in Arvados class.
 #' 
-#' @usage arv$humans.create(human, ensure_unique_name = "false")
-#' @param human Human object.
+#' @usage arv$links.create(link, ensure_unique_name = "false",
+#'     cluster_id = NULL)
+#' @param link Link object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Human object.
-#' @name humans.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Link object.
+#' @name links.create
 NULL
 
-#' humans.update
+#' links.update
 #' 
-#' humans.update is a method defined in Arvados class.
+#' links.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.
-#' @return Human object.
-#' @name humans.update
+#' @usage arv$links.update(link, uuid)
+#' @param link Link object.
+#' @param uuid The UUID of the Link in question.
+#' @return Link object.
+#' @name links.update
 NULL
 
-#' humans.delete
+#' links.delete
 #' 
-#' humans.delete is a method defined in Arvados class.
+#' links.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.
-#' @name humans.delete
+#' @usage arv$links.delete(uuid)
+#' @param uuid The UUID of the Link in question.
+#' @return Link object.
+#' @name links.delete
 NULL
 
-#' humans.list
+#' links.list
 #' 
-#' humans.list is a method defined in Arvados class.
+#' links.list is a method defined in Arvados class.
 #' 
-#' @usage arv$humans.list(filters = NULL,
+#' @usage arv$links.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -690,60 +798,74 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return HumanList object.
-#' @name humans.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @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 
+#' @return Link object.
+#' @name links.get_permissions
 NULL
 
-#' job_tasks.get
+#' logs.get
 #' 
-#' job_tasks.get is a method defined in Arvados class.
+#' logs.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.
-#' @name job_tasks.get
+#' @usage arv$logs.get(uuid)
+#' @param uuid The UUID of the Log in question.
+#' @return Log object.
+#' @name logs.get
 NULL
 
-#' job_tasks.create
+#' logs.create
 #' 
-#' job_tasks.create is a method defined in Arvados class.
+#' logs.create is a method defined in Arvados class.
 #' 
-#' @usage arv$job_tasks.create(jobtask, ensure_unique_name = "false")
-#' @param jobTask JobTask object.
+#' @usage arv$logs.create(log, ensure_unique_name = "false",
+#'     cluster_id = NULL)
+#' @param log Log object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return JobTask object.
-#' @name job_tasks.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Log object.
+#' @name logs.create
 NULL
 
-#' job_tasks.update
+#' logs.update
 #' 
-#' job_tasks.update is a method defined in Arvados class.
+#' logs.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.
-#' @return JobTask object.
-#' @name job_tasks.update
+#' @usage arv$logs.update(log, uuid)
+#' @param log Log object.
+#' @param uuid The UUID of the Log in question.
+#' @return Log object.
+#' @name logs.update
 NULL
 
-#' job_tasks.delete
+#' logs.delete
 #' 
-#' job_tasks.delete is a method defined in Arvados class.
+#' logs.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.
-#' @name job_tasks.delete
+#' @usage arv$logs.delete(uuid)
+#' @param uuid The UUID of the Log in question.
+#' @return Log object.
+#' @name logs.delete
 NULL
 
-#' job_tasks.list
+#' logs.list
 #' 
-#' job_tasks.list is a method defined in Arvados class.
+#' logs.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")
+#' @usage arv$logs.list(filters = NULL, where = NULL,
+#'     order = NULL, select = NULL, distinct = NULL,
+#'     limit = "100", offset = "0", count = "exact",
+#'     cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -752,196 +874,145 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return JobTaskList object.
-#' @name job_tasks.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return LogList object.
+#' @name logs.list
 NULL
 
-#' jobs.get
+#' users.get
 #' 
-#' jobs.get is a method defined in Arvados class.
+#' users.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.
-#' @name jobs.get
+#' @usage arv$users.get(uuid)
+#' @param uuid The UUID of the User in question.
+#' @return User object.
+#' @name users.get
 NULL
 
-#' jobs.create
+#' users.create
 #' 
-#' jobs.create is a method defined in Arvados class.
+#' users.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.
+#' @usage arv$users.create(user, ensure_unique_name = "false",
+#'     cluster_id = NULL)
+#' @param user User 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 
-#' @return Job object.
-#' @name jobs.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return User object.
+#' @name users.create
 NULL
 
-#' jobs.update
+#' users.update
 #' 
-#' jobs.update is a method defined in Arvados class.
+#' users.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.
-#' @return Job object.
-#' @name jobs.update
+#' @usage arv$users.update(user, uuid, bypass_federation = NULL)
+#' @param user User object.
+#' @param uuid The UUID of the User in question.
+#' @param bypass_federation 
+#' @return User object.
+#' @name users.update
 NULL
 
-#' jobs.delete
+#' users.delete
 #' 
-#' jobs.delete is a method defined in Arvados class.
+#' users.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.
-#' @name jobs.delete
+#' @usage arv$users.delete(uuid)
+#' @param uuid The UUID of the User in question.
+#' @return User object.
+#' @name users.delete
 NULL
 
-#' jobs.queue
+#' users.current
 #' 
-#' jobs.queue is a method defined in Arvados class.
+#' users.current 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 
-#' @return Job object.
-#' @name jobs.queue
+#' @usage arv$users.current(NULL)
+#' @return User object.
+#' @name users.current
 NULL
 
-#' jobs.queue_size
+#' users.system
 #' 
-#' jobs.queue_size is a method defined in Arvados class.
+#' users.system is a method defined in Arvados class.
 #' 
-#' @usage arv$jobs.queue_size(NULL)
-#' @return Job object.
-#' @name jobs.queue_size
+#' @usage arv$users.system(NULL)
+#' @return User object.
+#' @name users.system
 NULL
 
-#' jobs.cancel
+#' users.activate
 #' 
-#' jobs.cancel is a method defined in Arvados class.
+#' users.activate is a method defined in Arvados class.
 #' 
-#' @usage arv$jobs.cancel(uuid)
+#' @usage arv$users.activate(uuid)
 #' @param uuid 
-#' @return Job object.
-#' @name jobs.cancel
+#' @return User object.
+#' @name users.activate
 NULL
 
-#' jobs.lock
+#' users.setup
 #' 
-#' jobs.lock is a method defined in Arvados class.
+#' users.setup is a method defined in Arvados class.
 #' 
-#' @usage arv$jobs.lock(uuid)
+#' @usage arv$users.setup(uuid = NULL, user = NULL,
+#'     repo_name = NULL, vm_uuid = NULL, send_notification_email = "false")
 #' @param uuid 
-#' @return Job object.
-#' @name jobs.lock
+#' @param user 
+#' @param repo_name 
+#' @param vm_uuid 
+#' @param send_notification_email 
+#' @return User object.
+#' @name users.setup
 NULL
 
-#' jobs.list
+#' users.unsetup
 #' 
-#' jobs.list is a method defined in Arvados class.
+#' users.unsetup 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 
-#' @return JobList object.
-#' @name jobs.list
+#' @usage arv$users.unsetup(uuid)
+#' @param uuid 
+#' @return User object.
+#' @name users.unsetup
 NULL
 
-#' keep_disks.get
+#' users.update_uuid
 #' 
-#' keep_disks.get is a method defined in Arvados class.
+#' users.update_uuid 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.
-#' @name keep_disks.get
+#' @usage arv$users.update_uuid(uuid, new_uuid)
+#' @param uuid 
+#' @param new_uuid 
+#' @return User object.
+#' @name users.update_uuid
 NULL
 
-#' keep_disks.create
+#' users.merge
 #' 
-#' keep_disks.create is a method defined in Arvados class.
+#' users.merge is a method defined in Arvados class.
 #' 
-#' @usage arv$keep_disks.create(keepdisk,
-#'     ensure_unique_name = "false")
-#' @param keepDisk KeepDisk object.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return KeepDisk object.
-#' @name keep_disks.create
-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.
-#' @param uuid The UUID of the KeepDisk in question.
-#' @return KeepDisk object.
-#' @name keep_disks.update
-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.
-#' @name keep_disks.delete
-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 
-#' @return KeepDisk object.
-#' @name keep_disks.ping
+#' @usage arv$users.merge(new_owner_uuid,
+#'     new_user_token = NULL, redirect_to_new_user = NULL,
+#'     old_user_uuid = NULL, new_user_uuid = NULL)
+#' @param new_owner_uuid 
+#' @param new_user_token 
+#' @param redirect_to_new_user 
+#' @param old_user_uuid 
+#' @param new_user_uuid 
+#' @return User object.
+#' @name users.merge
 NULL
 
-#' keep_disks.list
+#' users.list
 #' 
-#' keep_disks.list is a method defined in Arvados class.
+#' users.list is a method defined in Arvados class.
 #' 
-#' @usage arv$keep_disks.list(filters = NULL,
+#' @usage arv$users.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -950,74 +1021,74 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return KeepDiskList object.
-#' @name keep_disks.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return UserList object.
+#' @name users.list
 NULL
 
-#' nodes.get
+#' repositories.get
 #' 
-#' nodes.get is a method defined in Arvados class.
+#' repositories.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.
-#' @name nodes.get
+#' @usage arv$repositories.get(uuid)
+#' @param uuid The UUID of the Repository in question.
+#' @return Repository object.
+#' @name repositories.get
 NULL
 
-#' nodes.create
+#' repositories.create
 #' 
-#' nodes.create is a method defined in Arvados class.
+#' repositories.create is a method defined in Arvados class.
 #' 
-#' @usage arv$nodes.create(node, ensure_unique_name = "false",
-#'     assign_slot = NULL)
-#' @param node Node object.
+#' @usage arv$repositories.create(repository,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param repository Repository object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @param assign_slot assign slot and hostname
-#' @return Node object.
-#' @name nodes.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Repository object.
+#' @name repositories.create
 NULL
 
-#' nodes.update
+#' repositories.update
 #' 
-#' nodes.update is a method defined in Arvados class.
+#' repositories.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.
-#' @param assign_slot assign slot and hostname
-#' @return Node object.
-#' @name nodes.update
+#' @usage arv$repositories.update(repository,
+#'     uuid)
+#' @param repository Repository object.
+#' @param uuid The UUID of the Repository in question.
+#' @return Repository object.
+#' @name repositories.update
 NULL
 
-#' nodes.delete
+#' repositories.delete
 #' 
-#' nodes.delete is a method defined in Arvados class.
+#' repositories.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.
-#' @name nodes.delete
+#' @usage arv$repositories.delete(uuid)
+#' @param uuid The UUID of the Repository in question.
+#' @return Repository object.
+#' @name repositories.delete
 NULL
 
-#' nodes.ping
+#' repositories.get_all_permissions
 #' 
-#' nodes.ping is a method defined in Arvados class.
+#' repositories.get_all_permissions is a method defined in Arvados class.
 #' 
-#' @usage arv$nodes.ping(uuid, ping_secret)
-#' @param uuid 
-#' @param ping_secret 
-#' @return Node object.
-#' @name nodes.ping
+#' @usage arv$repositories.get_all_permissions(NULL)
+#' @return Repository object.
+#' @name repositories.get_all_permissions
 NULL
 
-#' nodes.list
+#' repositories.list
 #' 
-#' nodes.list is a method defined in Arvados class.
+#' repositories.list is a method defined in Arvados class.
 #' 
-#' @usage arv$nodes.list(filters = NULL,
+#' @usage arv$repositories.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -1026,143 +1097,84 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return NodeList object.
-#' @name nodes.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return RepositoryList object.
+#' @name repositories.list
 NULL
 
-#' links.get
+#' virtual_machines.get
 #' 
-#' links.get is a method defined in Arvados class.
+#' virtual_machines.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.
-#' @name links.get
+#' @usage arv$virtual_machines.get(uuid)
+#' @param uuid The UUID of the VirtualMachine in question.
+#' @return VirtualMachine object.
+#' @name virtual_machines.get
 NULL
 
-#' links.create
+#' virtual_machines.create
 #' 
-#' links.create is a method defined in Arvados class.
+#' virtual_machines.create is a method defined in Arvados class.
 #' 
-#' @usage arv$links.create(link, ensure_unique_name = "false")
-#' @param link Link object.
+#' @usage arv$virtual_machines.create(virtualmachine,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param virtualMachine VirtualMachine object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Link object.
-#' @name links.create
-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.
-#' @return Link object.
-#' @name links.update
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return VirtualMachine object.
+#' @name virtual_machines.create
 NULL
 
-#' links.delete
+#' virtual_machines.update
 #' 
-#' links.delete is a method defined in Arvados class.
+#' virtual_machines.update is a method defined in Arvados class.
 #' 
-#' @usage arv$links.delete(uuid)
-#' @param uuid The UUID of the Link in question.
-#' @return Link object.
-#' @name links.delete
+#' @usage arv$virtual_machines.update(virtualmachine,
+#'     uuid)
+#' @param virtualMachine VirtualMachine object.
+#' @param uuid The UUID of the VirtualMachine in question.
+#' @return VirtualMachine object.
+#' @name virtual_machines.update
 NULL
 
-#' links.list
+#' virtual_machines.delete
 #' 
-#' links.list is a method defined in Arvados class.
+#' virtual_machines.delete 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 
-#' @return LinkList object.
-#' @name links.list
+#' @usage arv$virtual_machines.delete(uuid)
+#' @param uuid The UUID of the VirtualMachine in question.
+#' @return VirtualMachine object.
+#' @name virtual_machines.delete
 NULL
 
-#' links.get_permissions
+#' virtual_machines.logins
 #' 
-#' links.get_permissions is a method defined in Arvados class.
+#' virtual_machines.logins is a method defined in Arvados class.
 #' 
-#' @usage arv$links.get_permissions(uuid)
+#' @usage arv$virtual_machines.logins(uuid)
 #' @param uuid 
-#' @return Link object.
-#' @name links.get_permissions
-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.
-#' @name keep_services.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return KeepService object.
-#' @name keep_services.create
-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.
-#' @param uuid The UUID of the KeepService in question.
-#' @return KeepService object.
-#' @name keep_services.update
-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.
-#' @name keep_services.delete
+#' @return VirtualMachine object.
+#' @name virtual_machines.logins
 NULL
 
-#' keep_services.accessible
+#' virtual_machines.get_all_logins
 #' 
-#' keep_services.accessible is a method defined in Arvados class.
+#' virtual_machines.get_all_logins is a method defined in Arvados class.
 #' 
-#' @usage arv$keep_services.accessible(NULL)
-#' @return KeepService object.
-#' @name keep_services.accessible
+#' @usage arv$virtual_machines.get_all_logins(NULL)
+#' @return VirtualMachine object.
+#' @name virtual_machines.get_all_logins
 NULL
 
-#' keep_services.list
+#' virtual_machines.list
 #' 
-#' keep_services.list is a method defined in Arvados class.
+#' virtual_machines.list is a method defined in Arvados class.
 #' 
-#' @usage arv$keep_services.list(filters = NULL,
+#' @usage arv$virtual_machines.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -1171,62 +1183,65 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return KeepServiceList object.
-#' @name keep_services.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return VirtualMachineList object.
+#' @name virtual_machines.list
 NULL
 
-#' pipeline_templates.get
+#' workflows.get
 #' 
-#' pipeline_templates.get is a method defined in Arvados class.
+#' workflows.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.
-#' @name pipeline_templates.get
+#' @usage arv$workflows.get(uuid)
+#' @param uuid The UUID of the Workflow in question.
+#' @return Workflow object.
+#' @name workflows.get
 NULL
 
-#' pipeline_templates.create
+#' workflows.create
 #' 
-#' pipeline_templates.create is a method defined in Arvados class.
+#' workflows.create is a method defined in Arvados class.
 #' 
-#' @usage arv$pipeline_templates.create(pipelinetemplate,
-#'     ensure_unique_name = "false")
-#' @param pipelineTemplate PipelineTemplate object.
+#' @usage arv$workflows.create(workflow,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param workflow Workflow object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return PipelineTemplate object.
-#' @name pipeline_templates.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return Workflow object.
+#' @name workflows.create
 NULL
 
-#' pipeline_templates.update
+#' workflows.update
 #' 
-#' pipeline_templates.update is a method defined in Arvados class.
+#' workflows.update is a method defined in Arvados class.
 #' 
-#' @usage arv$pipeline_templates.update(pipelinetemplate,
+#' @usage arv$workflows.update(workflow,
 #'     uuid)
-#' @param pipelineTemplate PipelineTemplate object.
-#' @param uuid The UUID of the PipelineTemplate in question.
-#' @return PipelineTemplate object.
-#' @name pipeline_templates.update
+#' @param workflow Workflow object.
+#' @param uuid The UUID of the Workflow in question.
+#' @return Workflow object.
+#' @name workflows.update
 NULL
 
-#' pipeline_templates.delete
+#' workflows.delete
 #' 
-#' pipeline_templates.delete is a method defined in Arvados class.
+#' workflows.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.
-#' @name pipeline_templates.delete
+#' @usage arv$workflows.delete(uuid)
+#' @param uuid The UUID of the Workflow in question.
+#' @return Workflow object.
+#' @name workflows.delete
 NULL
 
-#' pipeline_templates.list
+#' workflows.list
 #' 
-#' pipeline_templates.list is a method defined in Arvados class.
+#' workflows.list is a method defined in Arvados class.
 #' 
-#' @usage arv$pipeline_templates.list(filters = NULL,
+#' @usage arv$workflows.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -1235,209 +1250,83 @@ NULL
 #' @param limit 
 #' @param offset 
 #' @param count 
-#' @return PipelineTemplateList object.
-#' @name pipeline_templates.list
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return WorkflowList object.
+#' @name workflows.list
 NULL
 
-#' pipeline_instances.get
+#' user_agreements.get
 #' 
-#' pipeline_instances.get is a method defined in Arvados class.
+#' user_agreements.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.
-#' @name pipeline_instances.get
+#' @usage arv$user_agreements.get(uuid)
+#' @param uuid The UUID of the UserAgreement in question.
+#' @return UserAgreement object.
+#' @name user_agreements.get
 NULL
 
-#' pipeline_instances.create
+#' user_agreements.create
 #' 
-#' pipeline_instances.create is a method defined in Arvados class.
+#' user_agreements.create is a method defined in Arvados class.
 #' 
-#' @usage arv$pipeline_instances.create(pipelineinstance,
-#'     ensure_unique_name = "false")
-#' @param pipelineInstance PipelineInstance object.
+#' @usage arv$user_agreements.create(useragreement,
+#'     ensure_unique_name = "false", cluster_id = NULL)
+#' @param userAgreement UserAgreement object.
 #' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return PipelineInstance object.
-#' @name pipeline_instances.create
+#' @param cluster_id Create object on a remote federated cluster instead of the current one.
+#' @return UserAgreement object.
+#' @name user_agreements.create
 NULL
 
-#' pipeline_instances.update
+#' user_agreements.update
 #' 
-#' pipeline_instances.update is a method defined in Arvados class.
+#' user_agreements.update is a method defined in Arvados class.
 #' 
-#' @usage arv$pipeline_instances.update(pipelineinstance,
+#' @usage arv$user_agreements.update(useragreement,
 #'     uuid)
-#' @param pipelineInstance PipelineInstance object.
-#' @param uuid The UUID of the PipelineInstance in question.
-#' @return PipelineInstance object.
-#' @name pipeline_instances.update
+#' @param userAgreement UserAgreement object.
+#' @param uuid The UUID of the UserAgreement in question.
+#' @return UserAgreement object.
+#' @name user_agreements.update
 NULL
 
-#' pipeline_instances.delete
+#' user_agreements.delete
 #' 
-#' pipeline_instances.delete is a method defined in Arvados class.
+#' user_agreements.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.
-#' @name pipeline_instances.delete
-NULL
-
-#' pipeline_instances.cancel
-#' 
-#' pipeline_instances.cancel is a method defined in Arvados class.
-#' 
-#' @usage arv$pipeline_instances.cancel(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 
-#' @return PipelineInstanceList object.
-#' @name pipeline_instances.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.
-#' @name repositories.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Repository object.
-#' @name repositories.create
-NULL
-
-#' repositories.update
-#' 
-#' repositories.update is a method defined in Arvados class.
-#' 
-#' @usage arv$repositories.update(repository,
-#'     uuid)
-#' @param repository Repository object.
-#' @param uuid The UUID of the Repository in question.
-#' @return Repository object.
-#' @name repositories.update
-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.
-#' @name repositories.delete
-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 
-#' @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.
-#' @name specimens.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Specimen object.
-#' @name specimens.create
+#' @usage arv$user_agreements.delete(uuid)
+#' @param uuid The UUID of the UserAgreement in question.
+#' @return UserAgreement object.
+#' @name user_agreements.delete
 NULL
 
-#' specimens.update
+#' user_agreements.signatures
 #' 
-#' specimens.update is a method defined in Arvados class.
+#' user_agreements.signatures is a method defined in Arvados class.
 #' 
-#' @usage arv$specimens.update(specimen,
-#'     uuid)
-#' @param specimen Specimen object.
-#' @param uuid The UUID of the Specimen in question.
-#' @return Specimen object.
-#' @name specimens.update
+#' @usage arv$user_agreements.signatures(NULL)
+#' @return UserAgreement object.
+#' @name user_agreements.signatures
 NULL
 
-#' specimens.delete
+#' user_agreements.sign
 #' 
-#' specimens.delete is a method defined in Arvados class.
+#' user_agreements.sign is a method defined in Arvados class.
 #' 
-#' @usage arv$specimens.delete(uuid)
-#' @param uuid The UUID of the Specimen in question.
-#' @return Specimen object.
-#' @name specimens.delete
+#' @usage arv$user_agreements.sign(NULL)
+#' @return UserAgreement object.
+#' @name user_agreements.sign
 NULL
 
-#' specimens.list
+#' user_agreements.list
 #' 
-#' specimens.list is a method defined in Arvados class.
+#' user_agreements.list is a method defined in Arvados class.
 #' 
-#' @usage arv$specimens.list(filters = NULL,
+#' @usage arv$user_agreements.list(filters = NULL,
 #'     where = NULL, order = NULL, select = NULL,
 #'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#'     count = "exact", cluster_id = NULL, bypass_federation = NULL)
 #' @param filters 
 #' @param where 
 #' @param order 
@@ -1446,1774 +1335,312 @@ NULL
 #' @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.
-#' @name logs.get
-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.
-#' @return Log object.
-#' @name logs.create
-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.
-#' @return Log object.
-#' @name logs.update
+#' @param cluster_id List objects on a remote federated cluster instead of the current one.
+#' @param bypass_federation bypass federation behavior, list items from local instance database only
+#' @return UserAgreementList object.
+#' @name user_agreements.list
 NULL
 
-#' logs.delete
+#' user_agreements.new
 #' 
-#' logs.delete is a method defined in Arvados class.
+#' user_agreements.new is a method defined in Arvados class.
 #' 
-#' @usage arv$logs.delete(uuid)
-#' @param uuid The UUID of the Log in question.
-#' @return Log object.
-#' @name logs.delete
+#' @usage arv$user_agreements.new(NULL)
+#' @return UserAgreement object.
+#' @name user_agreements.new
 NULL
 
-#' logs.list
+#' configs.get
 #' 
-#' logs.list is a method defined in Arvados class.
+#' configs.get 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 
-#' @return LogList object.
-#' @name logs.list
+#' @usage arv$configs.get(NULL)
+#' @return  object.
+#' @name configs.get
 NULL
 
-#' traits.get
+#' project.get
 #' 
-#' traits.get is a method defined in Arvados class.
+#' projects.get is equivalent to groups.get method.
 #' 
-#' @usage arv$traits.get(uuid)
-#' @param uuid The UUID of the Trait in question.
-#' @return Trait object.
-#' @name traits.get
+#' @usage arv$projects.get(uuid)
+#' @param uuid The UUID of the Group in question.
+#' @return Group object.
+#' @name projects.get
 NULL
 
-#' traits.create
+#' project.create
 #' 
-#' traits.create is a method defined in Arvados class.
+#' projects.create wrapps groups.create method by setting group_class attribute to "project".
 #' 
-#' @usage arv$traits.create(trait, ensure_unique_name = "false")
-#' @param trait Trait object.
+#' @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.
-#' @return Trait object.
-#' @name traits.create
+#' @return Group object.
+#' @name projects.create
 NULL
 
-#' traits.update
+#' project.update
 #' 
-#' traits.update is a method defined in Arvados class.
+#' projects.update wrapps groups.update method by setting group_class attribute to "project".
 #' 
-#' @usage arv$traits.update(trait, uuid)
-#' @param trait Trait object.
-#' @param uuid The UUID of the Trait in question.
-#' @return Trait object.
-#' @name traits.update
+#' @usage arv$projects.update(group, uuid)
+#' @param group Group object.
+#' @param uuid The UUID of the Group in question.
+#' @return Group object.
+#' @name projects.update
 NULL
 
-#' traits.delete
+#' project.delete
 #' 
-#' traits.delete is a method defined in Arvados class.
+#' projects.delete is equivalent to groups.delete method.
 #' 
-#' @usage arv$traits.delete(uuid)
-#' @param uuid The UUID of the Trait in question.
-#' @return Trait object.
-#' @name traits.delete
+#' @usage arv$project.delete(uuid)
+#' @param uuid The UUID of the Group in question.
+#' @return Group object.
+#' @name projects.delete
 NULL
 
-#' traits.list
+#' project.list
 #' 
-#' traits.list is a method defined in Arvados class.
+#' projects.list wrapps groups.list method by setting group_class attribute to "project".
 #' 
-#' @usage arv$traits.list(filters = NULL,
-#'     where = NULL, order = NULL, select = NULL,
-#'     distinct = NULL, limit = "100", offset = "0",
-#'     count = "exact")
+#' @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 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.
-#' @name virtual_machines.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return VirtualMachine object.
-#' @name virtual_machines.create
-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.
-#' @param uuid The UUID of the VirtualMachine in question.
-#' @return VirtualMachine object.
-#' @name virtual_machines.update
+#' @param include_trash Include items whose is_trashed attribute is true.
+#' @param uuid 
+#' @param recursive Include contents from child groups recursively.
+#' @return Group object.
+#' @name projects.list
 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.
-#' @name virtual_machines.delete
-NULL
-
-#' virtual_machines.logins
-#' 
-#' virtual_machines.logins is a method defined in Arvados class.
-#' 
-#' @usage arv$virtual_machines.logins(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 
-#' @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.
-#' @name workflows.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return Workflow object.
-#' @name workflows.create
-NULL
-
-#' workflows.update
-#' 
-#' workflows.update is a method defined in Arvados class.
-#' 
-#' @usage arv$workflows.update(workflow,
-#'     uuid)
-#' @param workflow Workflow object.
-#' @param uuid The UUID of the Workflow in question.
-#' @return Workflow object.
-#' @name workflows.update
-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.
-#' @name workflows.delete
-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 
-#' @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.
-#' @name groups.get
-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.
-#' @return Group object.
-#' @name groups.create
-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.
-#' @return Group object.
-#' @name groups.update
-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.
-#' @name groups.delete
-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 include_trash Include items whose is_trashed attribute is true.
-#' @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 
-#' @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 
-#' @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 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.
-#' @name user_agreements.get
-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.
-#' @param ensure_unique_name Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.
-#' @return UserAgreement object.
-#' @name user_agreements.create
-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.
-#' @param uuid The UUID of the UserAgreement in question.
-#' @return UserAgreement object.
-#' @name user_agreements.update
-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.
-#' @name user_agreements.delete
-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 
-#' @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.
-#' @name projects.get
-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.
-#' @return Group object.
-#' @name projects.create
-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.
-#' @return Group object.
-#' @name projects.update
-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.
-#' @name projects.delete
-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 include_trash Include items whose is_trashed attribute is true.
-#' @param uuid 
-#' @param recursive Include contents from child groups recursively.
-#' @return Group object.
-#' @name projects.list
-NULL
-
-#' Arvados
-#'
-#' Arvados class gives users ability to access Arvados REST API.
-#'
-#' @section Usage:
-#' \preformatted{arv = Arvados$new(authToken = NULL, hostName = NULL, numRetries = 0)}
-#'
-#' @section Arguments:
-#' \describe{
-#'     \item{authToken}{Authentification token. If not specified ARVADOS_API_TOKEN environment variable will be used.}
-#'     \item{hostName}{Host name. If not specified ARVADOS_API_HOST environment variable will be used.}
-#'     \item{numRetries}{Number which specifies how many times to retry failed service requests.}
-#' }
-#'
-#' @section Methods:
-#' \describe{
-#'     \item{}{\code{\link{api_client_authorizations.create}}}
-#'     \item{}{\code{\link{api_client_authorizations.create_system_auth}}}
-#'     \item{}{\code{\link{api_client_authorizations.current}}}
-#'     \item{}{\code{\link{api_client_authorizations.delete}}}
-#'     \item{}{\code{\link{api_client_authorizations.get}}}
-#'     \item{}{\code{\link{api_client_authorizations.list}}}
-#'     \item{}{\code{\link{api_client_authorizations.update}}}
-#'     \item{}{\code{\link{api_clients.create}}}
-#'     \item{}{\code{\link{api_clients.delete}}}
-#'     \item{}{\code{\link{api_clients.get}}}
-#'     \item{}{\code{\link{api_clients.list}}}
-#'     \item{}{\code{\link{api_clients.update}}}
-#'     \item{}{\code{\link{authorized_keys.create}}}
-#'     \item{}{\code{\link{authorized_keys.delete}}}
-#'     \item{}{\code{\link{authorized_keys.get}}}
-#'     \item{}{\code{\link{authorized_keys.list}}}
-#'     \item{}{\code{\link{authorized_keys.update}}}
-#'     \item{}{\code{\link{collections.create}}}
-#'     \item{}{\code{\link{collections.delete}}}
-#'     \item{}{\code{\link{collections.get}}}
-#'     \item{}{\code{\link{collections.list}}}
-#'     \item{}{\code{\link{collections.provenance}}}
-#'     \item{}{\code{\link{collections.trash}}}
-#'     \item{}{\code{\link{collections.untrash}}}
-#'     \item{}{\code{\link{collections.update}}}
-#'     \item{}{\code{\link{collections.used_by}}}
-#'     \item{}{\code{\link{container_requests.create}}}
-#'     \item{}{\code{\link{container_requests.delete}}}
-#'     \item{}{\code{\link{container_requests.get}}}
-#'     \item{}{\code{\link{container_requests.list}}}
-#'     \item{}{\code{\link{container_requests.update}}}
-#'     \item{}{\code{\link{containers.auth}}}
-#'     \item{}{\code{\link{containers.create}}}
-#'     \item{}{\code{\link{containers.current}}}
-#'     \item{}{\code{\link{containers.delete}}}
-#'     \item{}{\code{\link{containers.get}}}
-#'     \item{}{\code{\link{containers.list}}}
-#'     \item{}{\code{\link{containers.lock}}}
-#'     \item{}{\code{\link{containers.secret_mounts}}}
-#'     \item{}{\code{\link{containers.unlock}}}
-#'     \item{}{\code{\link{containers.update}}}
-#'     \item{}{\code{\link{groups.contents}}}
-#'     \item{}{\code{\link{groups.create}}}
-#'     \item{}{\code{\link{groups.delete}}}
-#'     \item{}{\code{\link{groups.get}}}
-#'     \item{}{\code{\link{groups.list}}}
-#'     \item{}{\code{\link{groups.trash}}}
-#'     \item{}{\code{\link{groups.untrash}}}
-#'     \item{}{\code{\link{groups.update}}}
-#'     \item{}{\code{\link{humans.create}}}
-#'     \item{}{\code{\link{humans.delete}}}
-#'     \item{}{\code{\link{humans.get}}}
-#'     \item{}{\code{\link{humans.list}}}
-#'     \item{}{\code{\link{humans.update}}}
-#'     \item{}{\code{\link{jobs.cancel}}}
-#'     \item{}{\code{\link{jobs.create}}}
-#'     \item{}{\code{\link{jobs.delete}}}
-#'     \item{}{\code{\link{jobs.get}}}
-#'     \item{}{\code{\link{jobs.list}}}
-#'     \item{}{\code{\link{jobs.lock}}}
-#'     \item{}{\code{\link{jobs.queue}}}
-#'     \item{}{\code{\link{jobs.queue_size}}}
-#'     \item{}{\code{\link{jobs.update}}}
-#'     \item{}{\code{\link{job_tasks.create}}}
-#'     \item{}{\code{\link{job_tasks.delete}}}
-#'     \item{}{\code{\link{job_tasks.get}}}
-#'     \item{}{\code{\link{job_tasks.list}}}
-#'     \item{}{\code{\link{job_tasks.update}}}
-#'     \item{}{\code{\link{keep_disks.create}}}
-#'     \item{}{\code{\link{keep_disks.delete}}}
-#'     \item{}{\code{\link{keep_disks.get}}}
-#'     \item{}{\code{\link{keep_disks.list}}}
-#'     \item{}{\code{\link{keep_disks.ping}}}
-#'     \item{}{\code{\link{keep_disks.update}}}
-#'     \item{}{\code{\link{keep_services.accessible}}}
-#'     \item{}{\code{\link{keep_services.create}}}
-#'     \item{}{\code{\link{keep_services.delete}}}
-#'     \item{}{\code{\link{keep_services.get}}}
-#'     \item{}{\code{\link{keep_services.list}}}
-#'     \item{}{\code{\link{keep_services.update}}}
-#'     \item{}{\code{\link{links.create}}}
-#'     \item{}{\code{\link{links.delete}}}
-#'     \item{}{\code{\link{links.get}}}
-#'     \item{}{\code{\link{links.get_permissions}}}
-#'     \item{}{\code{\link{links.list}}}
-#'     \item{}{\code{\link{links.update}}}
-#'     \item{}{\code{\link{logs.create}}}
-#'     \item{}{\code{\link{logs.delete}}}
-#'     \item{}{\code{\link{logs.get}}}
-#'     \item{}{\code{\link{logs.list}}}
-#'     \item{}{\code{\link{logs.update}}}
-#'     \item{}{\code{\link{nodes.create}}}
-#'     \item{}{\code{\link{nodes.delete}}}
-#'     \item{}{\code{\link{nodes.get}}}
-#'     \item{}{\code{\link{nodes.list}}}
-#'     \item{}{\code{\link{nodes.ping}}}
-#'     \item{}{\code{\link{nodes.update}}}
-#'     \item{}{\code{\link{pipeline_instances.cancel}}}
-#'     \item{}{\code{\link{pipeline_instances.create}}}
-#'     \item{}{\code{\link{pipeline_instances.delete}}}
-#'     \item{}{\code{\link{pipeline_instances.get}}}
-#'     \item{}{\code{\link{pipeline_instances.list}}}
-#'     \item{}{\code{\link{pipeline_instances.update}}}
-#'     \item{}{\code{\link{pipeline_templates.create}}}
-#'     \item{}{\code{\link{pipeline_templates.delete}}}
-#'     \item{}{\code{\link{pipeline_templates.get}}}
-#'     \item{}{\code{\link{pipeline_templates.list}}}
-#'     \item{}{\code{\link{pipeline_templates.update}}}
-#'     \item{}{\code{\link{projects.create}}}
-#'     \item{}{\code{\link{projects.delete}}}
-#'     \item{}{\code{\link{projects.get}}}
-#'     \item{}{\code{\link{projects.list}}}
-#'     \item{}{\code{\link{projects.update}}}
-#'     \item{}{\code{\link{repositories.create}}}
-#'     \item{}{\code{\link{repositories.delete}}}
-#'     \item{}{\code{\link{repositories.get}}}
-#'     \item{}{\code{\link{repositories.get_all_permissions}}}
-#'     \item{}{\code{\link{repositories.list}}}
-#'     \item{}{\code{\link{repositories.update}}}
-#'     \item{}{\code{\link{specimens.create}}}
-#'     \item{}{\code{\link{specimens.delete}}}
-#'     \item{}{\code{\link{specimens.get}}}
-#'     \item{}{\code{\link{specimens.list}}}
-#'     \item{}{\code{\link{specimens.update}}}
-#'     \item{}{\code{\link{traits.create}}}
-#'     \item{}{\code{\link{traits.delete}}}
-#'     \item{}{\code{\link{traits.get}}}
-#'     \item{}{\code{\link{traits.list}}}
-#'     \item{}{\code{\link{traits.update}}}
-#'     \item{}{\code{\link{user_agreements.create}}}
-#'     \item{}{\code{\link{user_agreements.delete}}}
-#'     \item{}{\code{\link{user_agreements.get}}}
-#'     \item{}{\code{\link{user_agreements.list}}}
-#'     \item{}{\code{\link{user_agreements.new}}}
-#'     \item{}{\code{\link{user_agreements.sign}}}
-#'     \item{}{\code{\link{user_agreements.signatures}}}
-#'     \item{}{\code{\link{user_agreements.update}}}
-#'     \item{}{\code{\link{users.activate}}}
-#'     \item{}{\code{\link{users.create}}}
-#'     \item{}{\code{\link{users.current}}}
-#'     \item{}{\code{\link{users.delete}}}
-#'     \item{}{\code{\link{users.get}}}
-#'     \item{}{\code{\link{users.list}}}
-#'     \item{}{\code{\link{users.merge}}}
-#'     \item{}{\code{\link{users.setup}}}
-#'     \item{}{\code{\link{users.system}}}
-#'     \item{}{\code{\link{users.unsetup}}}
-#'     \item{}{\code{\link{users.update}}}
-#'     \item{}{\code{\link{users.update_uuid}}}
-#'     \item{}{\code{\link{virtual_machines.create}}}
-#'     \item{}{\code{\link{virtual_machines.delete}}}
-#'     \item{}{\code{\link{virtual_machines.get}}}
-#'     \item{}{\code{\link{virtual_machines.get_all_logins}}}
-#'     \item{}{\code{\link{virtual_machines.list}}}
-#'     \item{}{\code{\link{virtual_machines.logins}}}
-#'     \item{}{\code{\link{virtual_machines.update}}}
-#'     \item{}{\code{\link{workflows.create}}}
-#'     \item{}{\code{\link{workflows.delete}}}
-#'     \item{}{\code{\link{workflows.get}}}
-#'     \item{}{\code{\link{workflows.list}}}
-#'     \item{}{\code{\link{workflows.update}}}
-#' }
-#'
-#' @name Arvados
-#' @examples
-#' \dontrun{
-#' arv <- Arvados$new("your Arvados token", "example.arvadosapi.com")
-#'
-#' collection <- arv$collections.get("uuid")
-#'
-#' collectionList <- arv$collections.list(list(list("name", "like", "Test%")))
-#' collectionList <- listAll(arv$collections.list, list(list("name", "like", "Test%")))
-#'
-#' deletedCollection <- arv$collections.delete("uuid")
-#'
-#' updatedCollection <- arv$collections.update(list(name = "New name", description = "New description"),
-#'                                             "uuid")
-#'
-#' createdCollection <- arv$collections.create(list(name = "Example",
-#'                                                  description = "This is a test collection"))
-#' }
-NULL
-
-#' @export
-Arvados <- R6::R6Class(
-
-       "Arvados",
-
-       public = list(
-
-               initialize = function(authToken = NULL, hostName = NULL, numRetries = 0)
-               {
-                       if(!is.null(hostName))
-                               Sys.setenv(ARVADOS_API_HOST = hostName)
-
-                       if(!is.null(authToken))
-                               Sys.setenv(ARVADOS_API_TOKEN = authToken)
-
-                       hostName <- Sys.getenv("ARVADOS_API_HOST")
-                       token    <- Sys.getenv("ARVADOS_API_TOKEN")
-
-                       if(hostName == "" | token == "")
-                               stop(paste("Please provide host name and authentification token",
-                                                  "or set ARVADOS_API_HOST and ARVADOS_API_TOKEN",
-                                                  "environment variables."))
-
-                       private$token <- token
-                       private$host  <- paste0("https://", hostName, "/arvados/v1/")
-                       private$numRetries <- numRetries
-                       private$REST <- RESTService$new(token, hostName,
-                                                       HttpRequest$new(), HttpParser$new(),
-                                                       numRetries)
-
-               },
-
-               projects.get = function(uuid)
-               {
-                       self$groups.get(uuid)
-               },
-
-               projects.create = function(group, ensure_unique_name = "false")
-               {
-                       group <- c("group_class" = "project", group)
-                       self$groups.create(group, ensure_unique_name)
-               },
-
-               projects.update = function(group, uuid)
-               {
-                       group <- c("group_class" = "project", group)
-                       self$groups.update(group, uuid)
-               },
-
-               projects.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact",
-                       include_trash = NULL)
-               {
-                       filters[[length(filters) + 1]] <- list("group_class", "=", "project")
-                       self$groups.list(filters, where, order, select, distinct,
-                                        limit, offset, count, include_trash)
-               },
-
-               projects.delete = function(uuid)
-               {
-                       self$groups.delete(uuid)
-               },
-
-               users.get = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.create = function(user, ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("users")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
-
-               users.update = function(user, uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(user) > 0)
-                               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
-               },
-
-               users.delete = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.current = function()
-               {
-                       endPoint <- stringr::str_interp("users/current")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.system = function()
-               {
-                       endPoint <- stringr::str_interp("users/system")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.activate = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}/activate")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.setup = function(user = NULL, openid_prefix = NULL,
-                       repo_name = NULL, vm_uuid = NULL, send_notification_email = "false")
-               {
-                       endPoint <- stringr::str_interp("users/setup")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.unsetup = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}/unsetup")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.update_uuid = function(uuid, new_uuid)
-               {
-                       endPoint <- stringr::str_interp("users/${uuid}/update_uuid")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               users.merge = function(new_owner_uuid, new_user_token,
-                       redirect_to_new_user = NULL)
-               {
-                       endPoint <- stringr::str_interp("users/merge")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- list(new_owner_uuid = new_owner_uuid,
-                                                         new_user_token = new_user_token, redirect_to_new_user = redirect_to_new_user)
-                       
-                       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
-               },
-
-               users.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
-               {
-                       endPoint <- stringr::str_interp("users")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_client_authorizations.get = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_client_authorizations.create = function(apiclientauthorization,
-                       ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
-
-               api_client_authorizations.update = function(apiclientauthorization, uuid)
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(apiclientauthorization) > 0)
-                               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
-               },
-
-               api_client_authorizations.delete = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_client_authorizations.create_system_auth = function(api_client_id = NULL, scopes = NULL)
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations/create_system_auth")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_client_authorizations.current = function()
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations/current")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_client_authorizations.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
-               {
-                       endPoint <- stringr::str_interp("api_client_authorizations")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.get = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.create = function(container, ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("containers")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
-
-               containers.update = function(container, uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(container) > 0)
-                               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
-               },
-
-               containers.delete = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.auth = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}/auth")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.lock = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}/lock")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.unlock = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}/unlock")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.secret_mounts = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("containers/${uuid}/secret_mounts")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.current = function()
-               {
-                       endPoint <- stringr::str_interp("containers/current")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               containers.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
-               {
-                       endPoint <- stringr::str_interp("containers")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_clients.get = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("api_clients/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               api_clients.create = function(apiclient, ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("api_clients")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
-
-               api_clients.update = function(apiclient, uuid)
-               {
-                       endPoint <- stringr::str_interp("api_clients/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(apiclient) > 0)
-                               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
-               },
-
-               api_clients.delete = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("api_clients/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
+#' Arvados
+#'
+#' Arvados class gives users ability to access Arvados REST API.
+#'
+#' @section Usage:
+#' \preformatted{arv = Arvados$new(authToken = NULL, hostName = NULL, numRetries = 0)}
+#'
+#' @section Arguments:
+#' \describe{
+#'     \item{authToken}{Authentification token. If not specified ARVADOS_API_TOKEN environment variable will be used.}
+#'     \item{hostName}{Host name. If not specified ARVADOS_API_HOST environment variable will be used.}
+#'     \item{numRetries}{Number which specifies how many times to retry failed service requests.}
+#' }
+#'
+#' @section Methods:
+#' \describe{
+#'     \item{}{\code{\link{api_client_authorizations.create}}}
+#'     \item{}{\code{\link{api_client_authorizations.create_system_auth}}}
+#'     \item{}{\code{\link{api_client_authorizations.current}}}
+#'     \item{}{\code{\link{api_client_authorizations.delete}}}
+#'     \item{}{\code{\link{api_client_authorizations.get}}}
+#'     \item{}{\code{\link{api_client_authorizations.list}}}
+#'     \item{}{\code{\link{api_client_authorizations.update}}}
+#'     \item{}{\code{\link{api_clients.create}}}
+#'     \item{}{\code{\link{api_clients.delete}}}
+#'     \item{}{\code{\link{api_clients.get}}}
+#'     \item{}{\code{\link{api_clients.list}}}
+#'     \item{}{\code{\link{api_clients.update}}}
+#'     \item{}{\code{\link{authorized_keys.create}}}
+#'     \item{}{\code{\link{authorized_keys.delete}}}
+#'     \item{}{\code{\link{authorized_keys.get}}}
+#'     \item{}{\code{\link{authorized_keys.list}}}
+#'     \item{}{\code{\link{authorized_keys.update}}}
+#'     \item{}{\code{\link{collections.create}}}
+#'     \item{}{\code{\link{collections.delete}}}
+#'     \item{}{\code{\link{collections.get}}}
+#'     \item{}{\code{\link{collections.list}}}
+#'     \item{}{\code{\link{collections.provenance}}}
+#'     \item{}{\code{\link{collections.trash}}}
+#'     \item{}{\code{\link{collections.untrash}}}
+#'     \item{}{\code{\link{collections.update}}}
+#'     \item{}{\code{\link{collections.used_by}}}
+#'     \item{}{\code{\link{configs.get}}}
+#'     \item{}{\code{\link{container_requests.create}}}
+#'     \item{}{\code{\link{container_requests.delete}}}
+#'     \item{}{\code{\link{container_requests.get}}}
+#'     \item{}{\code{\link{container_requests.list}}}
+#'     \item{}{\code{\link{container_requests.update}}}
+#'     \item{}{\code{\link{containers.auth}}}
+#'     \item{}{\code{\link{containers.create}}}
+#'     \item{}{\code{\link{containers.current}}}
+#'     \item{}{\code{\link{containers.delete}}}
+#'     \item{}{\code{\link{containers.get}}}
+#'     \item{}{\code{\link{containers.list}}}
+#'     \item{}{\code{\link{containers.lock}}}
+#'     \item{}{\code{\link{containers.secret_mounts}}}
+#'     \item{}{\code{\link{containers.unlock}}}
+#'     \item{}{\code{\link{containers.update}}}
+#'     \item{}{\code{\link{groups.contents}}}
+#'     \item{}{\code{\link{groups.create}}}
+#'     \item{}{\code{\link{groups.delete}}}
+#'     \item{}{\code{\link{groups.get}}}
+#'     \item{}{\code{\link{groups.list}}}
+#'     \item{}{\code{\link{groups.shared}}}
+#'     \item{}{\code{\link{groups.trash}}}
+#'     \item{}{\code{\link{groups.untrash}}}
+#'     \item{}{\code{\link{groups.update}}}
+#'     \item{}{\code{\link{keep_services.accessible}}}
+#'     \item{}{\code{\link{keep_services.create}}}
+#'     \item{}{\code{\link{keep_services.delete}}}
+#'     \item{}{\code{\link{keep_services.get}}}
+#'     \item{}{\code{\link{keep_services.list}}}
+#'     \item{}{\code{\link{keep_services.update}}}
+#'     \item{}{\code{\link{links.create}}}
+#'     \item{}{\code{\link{links.delete}}}
+#'     \item{}{\code{\link{links.get}}}
+#'     \item{}{\code{\link{links.get_permissions}}}
+#'     \item{}{\code{\link{links.list}}}
+#'     \item{}{\code{\link{links.update}}}
+#'     \item{}{\code{\link{logs.create}}}
+#'     \item{}{\code{\link{logs.delete}}}
+#'     \item{}{\code{\link{logs.get}}}
+#'     \item{}{\code{\link{logs.list}}}
+#'     \item{}{\code{\link{logs.update}}}
+#'     \item{}{\code{\link{projects.create}}}
+#'     \item{}{\code{\link{projects.delete}}}
+#'     \item{}{\code{\link{projects.get}}}
+#'     \item{}{\code{\link{projects.list}}}
+#'     \item{}{\code{\link{projects.update}}}
+#'     \item{}{\code{\link{repositories.create}}}
+#'     \item{}{\code{\link{repositories.delete}}}
+#'     \item{}{\code{\link{repositories.get}}}
+#'     \item{}{\code{\link{repositories.get_all_permissions}}}
+#'     \item{}{\code{\link{repositories.list}}}
+#'     \item{}{\code{\link{repositories.update}}}
+#'     \item{}{\code{\link{user_agreements.create}}}
+#'     \item{}{\code{\link{user_agreements.delete}}}
+#'     \item{}{\code{\link{user_agreements.get}}}
+#'     \item{}{\code{\link{user_agreements.list}}}
+#'     \item{}{\code{\link{user_agreements.new}}}
+#'     \item{}{\code{\link{user_agreements.sign}}}
+#'     \item{}{\code{\link{user_agreements.signatures}}}
+#'     \item{}{\code{\link{user_agreements.update}}}
+#'     \item{}{\code{\link{users.activate}}}
+#'     \item{}{\code{\link{users.create}}}
+#'     \item{}{\code{\link{users.current}}}
+#'     \item{}{\code{\link{users.delete}}}
+#'     \item{}{\code{\link{users.get}}}
+#'     \item{}{\code{\link{users.list}}}
+#'     \item{}{\code{\link{users.merge}}}
+#'     \item{}{\code{\link{users.setup}}}
+#'     \item{}{\code{\link{users.system}}}
+#'     \item{}{\code{\link{users.unsetup}}}
+#'     \item{}{\code{\link{users.update}}}
+#'     \item{}{\code{\link{users.update_uuid}}}
+#'     \item{}{\code{\link{virtual_machines.create}}}
+#'     \item{}{\code{\link{virtual_machines.delete}}}
+#'     \item{}{\code{\link{virtual_machines.get}}}
+#'     \item{}{\code{\link{virtual_machines.get_all_logins}}}
+#'     \item{}{\code{\link{virtual_machines.list}}}
+#'     \item{}{\code{\link{virtual_machines.logins}}}
+#'     \item{}{\code{\link{virtual_machines.update}}}
+#'     \item{}{\code{\link{workflows.create}}}
+#'     \item{}{\code{\link{workflows.delete}}}
+#'     \item{}{\code{\link{workflows.get}}}
+#'     \item{}{\code{\link{workflows.list}}}
+#'     \item{}{\code{\link{workflows.update}}}
+#' }
+#'
+#' @name Arvados
+#' @examples
+#' \dontrun{
+#' arv <- Arvados$new("your Arvados token", "example.arvadosapi.com")
+#'
+#' collection <- arv$collections.get("uuid")
+#'
+#' collectionList <- arv$collections.list(list(list("name", "like", "Test%")))
+#' collectionList <- listAll(arv$collections.list, list(list("name", "like", "Test%")))
+#'
+#' deletedCollection <- arv$collections.delete("uuid")
+#'
+#' updatedCollection <- arv$collections.update(list(name = "New name", description = "New description"),
+#'                                             "uuid")
+#'
+#' createdCollection <- arv$collections.create(list(name = "Example",
+#'                                                  description = "This is a test collection"))
+#' }
+NULL
 
-               api_clients.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
-               {
-                       endPoint <- stringr::str_interp("api_clients")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
+#' @export
+Arvados <- R6::R6Class(
 
-               container_requests.get = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("container_requests/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
+       "Arvados",
 
-               container_requests.create = function(containerrequest,
-                       ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("container_requests")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
+       public = list(
 
-               container_requests.update = function(containerrequest, uuid)
+               initialize = function(authToken = NULL, hostName = NULL, numRetries = 0)
                {
-                       endPoint <- stringr::str_interp("container_requests/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(containerrequest) > 0)
-                               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
-               },
+                       if(!is.null(hostName))
+                               Sys.setenv(ARVADOS_API_HOST = hostName)
 
-               container_requests.delete = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("container_requests/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
+                       if(!is.null(authToken))
+                               Sys.setenv(ARVADOS_API_TOKEN = authToken)
+
+                       hostName <- Sys.getenv("ARVADOS_API_HOST")
+                       token    <- Sys.getenv("ARVADOS_API_TOKEN")
+
+                       if(hostName == "" | token == "")
+                               stop(paste("Please provide host name and authentification token",
+                                                  "or set ARVADOS_API_HOST and ARVADOS_API_TOKEN",
+                                                  "environment variables."))
+
+                       private$token <- token
+                       private$host  <- paste0("https://", hostName, "/arvados/v1/")
+                       private$numRetries <- numRetries
+                       private$REST <- RESTService$new(token, hostName,
+                                                       HttpRequest$new(), HttpParser$new(),
+                                                       numRetries)
 
-               container_requests.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
-               {
-                       endPoint <- stringr::str_interp("container_requests")
-                       url <- paste0(private$host, endPoint)
-                       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
                },
 
-               authorized_keys.get = function(uuid)
+               projects.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
+                       self$groups.get(uuid)
                },
 
-               authorized_keys.create = function(authorizedkey,
-                       ensure_unique_name = "false")
+               projects.create = function(group, ensure_unique_name = "false")
                {
-                       endPoint <- stringr::str_interp("authorized_keys")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
+                       group <- c("group_class" = "project", group)
+                       self$groups.create(group, ensure_unique_name)
                },
 
-               authorized_keys.update = function(authorizedkey, uuid)
+               projects.update = function(group, uuid)
                {
-                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(authorizedkey) > 0)
-                               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
+                       group <- c("group_class" = "project", group)
+                       self$groups.update(group, uuid)
                },
 
-               authorized_keys.delete = function(uuid)
+               projects.list = function(filters = NULL, where = NULL,
+                       order = NULL, select = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       include_trash = NULL)
                {
-                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       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
+                       filters[[length(filters) + 1]] <- list("group_class", "=", "project")
+                       self$groups.list(filters, where, order, select, distinct,
+                                        limit, offset, count, include_trash)
                },
 
-               authorized_keys.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
-               {
-                       endPoint <- stringr::str_interp("authorized_keys")
-                       url <- paste0(private$host, endPoint)
-                       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
+               projects.delete = function(uuid)
+               {
+                       self$groups.delete(uuid)
                },
 
-               collections.get = function(uuid)
+               api_clients.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}")
+                       endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3229,16 +1656,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.create = function(collection, ensure_unique_name = "false")
+               api_clients.create = function(apiclient,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("collections")
+                       endPoint <- stringr::str_interp("api_clients")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(collection) > 0)
-                               body <- jsonlite::toJSON(list(collection = collection), 
+                       if(length(apiclient) > 0)
+                               body <- jsonlite::toJSON(list(apiclient = apiclient), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3253,16 +1682,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.update = function(collection, uuid)
+               api_clients.update = function(apiclient, uuid)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}")
+                       endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(collection) > 0)
-                               body <- jsonlite::toJSON(list(collection = collection), 
+                       if(length(apiclient) > 0)
+                               body <- jsonlite::toJSON(list(apiclient = apiclient), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3277,11 +1706,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.delete = function(uuid)
+               api_clients.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}")
+                       endPoint <- stringr::str_interp("api_clients/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3297,13 +1726,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.provenance = function(uuid)
+               api_clients.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}/provenance")
+                       endPoint <- stringr::str_interp("api_clients")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(filters = filters, where = where,
+                                                         order = order, select = select, distinct = distinct,
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -3317,11 +1752,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.used_by = function(uuid)
+               api_client_authorizations.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}/used_by")
+                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3337,15 +1772,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.trash = function(uuid)
+               api_client_authorizations.create = function(apiclientauthorization,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}/trash")
+                       endPoint <- stringr::str_interp("api_client_authorizations")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       body <- NULL
+                       if(length(apiclientauthorization) > 0)
+                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization), 
+                                                        auto_unbox = TRUE)
+                       else
+                               body <- NULL
                        
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
@@ -3357,43 +1798,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               collections.untrash = function(uuid)
+               api_client_authorizations.update = function(apiclientauthorization, uuid)
                {
-                       endPoint <- stringr::str_interp("collections/${uuid}/untrash")
+                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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
-               },
-
-               collections.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact", include_trash = NULL)
-               {
-                       endPoint <- stringr::str_interp("collections")
-                       url <- paste0(private$host, endPoint)
-                       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
+                       if(length(apiclientauthorization) > 0)
+                               body <- jsonlite::toJSON(list(apiclientauthorization = apiclientauthorization), 
+                                                        auto_unbox = TRUE)
+                       else
+                               body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -3403,17 +1822,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               humans.get = function(uuid)
+               api_client_authorizations.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("humans/${uuid}")
+                       endPoint <- stringr::str_interp("api_client_authorizations/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -3423,19 +1842,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               humans.create = function(human, ensure_unique_name = "false")
+               api_client_authorizations.create_system_auth = function(api_client_id = NULL, scopes = NULL)
                {
-                       endPoint <- stringr::str_interp("humans")
+                       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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(api_client_id = api_client_id,
+                                                         scopes = scopes)
                        
-                       if(length(human) > 0)
-                               body <- jsonlite::toJSON(list(human = human), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
@@ -3447,41 +1863,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               humans.update = function(human, uuid)
-               {
-                       endPoint <- stringr::str_interp("humans/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(human) > 0)
-                               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
-               },
-
-               humans.delete = function(uuid)
+               api_client_authorizations.current = function()
                {
-                       endPoint <- stringr::str_interp("humans/${uuid}")
+                       endPoint <- stringr::str_interp("api_client_authorizations/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -3491,17 +1883,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               humans.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               api_client_authorizations.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("humans")
+                       endPoint <- stringr::str_interp("api_client_authorizations")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -3515,11 +1909,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               job_tasks.get = function(uuid)
+               authorized_keys.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("job_tasks/${uuid}")
+                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3535,16 +1929,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               job_tasks.create = function(jobtask, ensure_unique_name = "false")
+               authorized_keys.create = function(authorizedkey,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("job_tasks")
+                       endPoint <- stringr::str_interp("authorized_keys")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(jobtask) > 0)
-                               body <- jsonlite::toJSON(list(jobtask = jobtask), 
+                       if(length(authorizedkey) > 0)
+                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3559,16 +1955,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               job_tasks.update = function(jobtask, uuid)
+               authorized_keys.update = function(authorizedkey, uuid)
                {
-                       endPoint <- stringr::str_interp("job_tasks/${uuid}")
+                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(jobtask) > 0)
-                               body <- jsonlite::toJSON(list(jobtask = jobtask), 
+                       if(length(authorizedkey) > 0)
+                               body <- jsonlite::toJSON(list(authorizedkey = authorizedkey), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3583,11 +1979,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               job_tasks.delete = function(uuid)
+               authorized_keys.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("job_tasks/${uuid}")
+                       endPoint <- stringr::str_interp("authorized_keys/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3603,18 +1999,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               job_tasks.list = function(filters = NULL,
+               authorized_keys.list = function(filters = NULL,
                        where = NULL, order = NULL, select = NULL,
                        distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("job_tasks")
+                       endPoint <- stringr::str_interp("authorized_keys")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -3628,11 +2025,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.get = function(uuid)
+               collections.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/${uuid}")
+                       endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3648,21 +2045,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.create = function(job, ensure_unique_name = "false",
-                       find_or_create = "false", filters = NULL,
-                       minimum_script_version = NULL, exclude_script_versions = NULL)
+               collections.create = function(collection,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("jobs")
+                       endPoint <- stringr::str_interp("collections")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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)
+                                                         cluster_id = cluster_id)
                        
-                       if(length(job) > 0)
-                               body <- jsonlite::toJSON(list(job = job), 
+                       if(length(collection) > 0)
+                               body <- jsonlite::toJSON(list(collection = collection), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3677,16 +2071,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.update = function(job, uuid)
+               collections.update = function(collection, uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/${uuid}")
+                       endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(job) > 0)
-                               body <- jsonlite::toJSON(list(job = job), 
+                       if(length(collection) > 0)
+                               body <- jsonlite::toJSON(list(collection = collection), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3701,11 +2095,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.delete = function(uuid)
+               collections.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/${uuid}")
+                       endPoint <- stringr::str_interp("collections/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3721,17 +2115,13 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.queue = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               collections.provenance = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/queue")
+                       endPoint <- stringr::str_interp("collections/${uuid}/provenance")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
@@ -3745,11 +2135,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.queue_size = function()
+               collections.used_by = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/queue_size")
+                       endPoint <- stringr::str_interp("collections/${uuid}/used_by")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3765,11 +2155,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.cancel = function(uuid)
+               collections.trash = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/${uuid}/cancel")
+                       endPoint <- stringr::str_interp("collections/${uuid}/trash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3785,11 +2175,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.lock = function(uuid)
+               collections.untrash = function(uuid)
                {
-                       endPoint <- stringr::str_interp("jobs/${uuid}/lock")
+                       endPoint <- stringr::str_interp("collections/${uuid}/untrash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3805,17 +2195,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               jobs.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               collections.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL,
+                       include_trash = NULL, include_old_versions = NULL)
                {
-                       endPoint <- stringr::str_interp("jobs")
+                       endPoint <- stringr::str_interp("collections")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation,
+                                                         include_trash = include_trash, include_old_versions = include_old_versions)
                        
                        body <- NULL
                        
@@ -3829,11 +2223,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_disks.get = function(uuid)
+               containers.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("keep_disks/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3849,16 +2243,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_disks.create = function(keepdisk, ensure_unique_name = "false")
+               containers.create = function(container, ensure_unique_name = "false",
+                       cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("keep_disks")
+                       endPoint <- stringr::str_interp("containers")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(keepdisk) > 0)
-                               body <- jsonlite::toJSON(list(keepdisk = keepdisk), 
+                       if(length(container) > 0)
+                               body <- jsonlite::toJSON(list(container = container), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3873,16 +2269,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_disks.update = function(keepdisk, uuid)
+               containers.update = function(container, uuid)
                {
-                       endPoint <- stringr::str_interp("keep_disks/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(keepdisk) > 0)
-                               body <- jsonlite::toJSON(list(keepdisk = keepdisk), 
+                       if(length(container) > 0)
+                               body <- jsonlite::toJSON(list(container = container), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -3897,11 +2293,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_disks.delete = function(uuid)
+               containers.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("keep_disks/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -3917,43 +2313,13 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_disks.ping = function(uuid = NULL, ping_secret,
-                       node_uuid = NULL, filesystem_uuid = NULL,
-                       service_host = NULL, service_port, service_ssl_flag)
-               {
-                       endPoint <- stringr::str_interp("keep_disks/ping")
-                       url <- paste0(private$host, endPoint)
-                       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
-               },
-
-               keep_disks.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+               containers.auth = function(uuid)
                {
-                       endPoint <- stringr::str_interp("keep_disks")
+                       endPoint <- stringr::str_interp("containers/${uuid}/auth")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
@@ -3967,42 +2333,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               nodes.get = function(uuid)
+               containers.lock = function(uuid)
                {
-                       endPoint <- stringr::str_interp("nodes/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}/lock")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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
-               },
-
-               nodes.create = function(node, ensure_unique_name = "false",
-                       assign_slot = NULL)
-               {
-                       endPoint <- stringr::str_interp("nodes")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
-                       
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
@@ -4013,21 +2353,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               nodes.update = function(node, uuid, assign_slot = NULL)
+               containers.unlock = function(uuid)
                {
-                       endPoint <- stringr::str_interp("nodes/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}/unlock")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(assign_slot = assign_slot)
+                       queryArgs <- NULL
                        
-                       if(length(node) > 0)
-                               body <- jsonlite::toJSON(list(node = node), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
-                       response <- private$REST$http$exec("PUT", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4037,17 +2373,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               nodes.delete = function(uuid)
+               containers.secret_mounts = function(uuid)
                {
-                       endPoint <- stringr::str_interp("nodes/${uuid}")
+                       endPoint <- stringr::str_interp("containers/${uuid}/secret_mounts")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4057,17 +2393,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               nodes.ping = function(uuid, ping_secret)
+               containers.current = function()
                {
-                       endPoint <- stringr::str_interp("nodes/${uuid}/ping")
+                       endPoint <- stringr::str_interp("containers/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ping_secret = ping_secret)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("POST", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4077,17 +2413,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               nodes.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               containers.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("nodes")
+                       endPoint <- stringr::str_interp("containers")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -4101,11 +2439,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               links.get = function(uuid)
+               container_requests.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("links/${uuid}")
+                       endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4121,16 +2459,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               links.create = function(link, ensure_unique_name = "false")
+               container_requests.create = function(containerrequest,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("links")
+                       endPoint <- stringr::str_interp("container_requests")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(link) > 0)
-                               body <- jsonlite::toJSON(list(link = link), 
+                       if(length(containerrequest) > 0)
+                               body <- jsonlite::toJSON(list(containerrequest = containerrequest), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4145,16 +2485,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               links.update = function(link, uuid)
+               container_requests.update = function(containerrequest, uuid)
                {
-                       endPoint <- stringr::str_interp("links/${uuid}")
+                       endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(link) > 0)
-                               body <- jsonlite::toJSON(list(link = link), 
+                       if(length(containerrequest) > 0)
+                               body <- jsonlite::toJSON(list(containerrequest = containerrequest), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4169,11 +2509,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               links.delete = function(uuid)
+               container_requests.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("links/${uuid}")
+                       endPoint <- stringr::str_interp("container_requests/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4189,37 +2529,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               links.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               container_requests.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL,
+                       include_trash = NULL)
                {
-                       endPoint <- stringr::str_interp("links")
+                       endPoint <- stringr::str_interp("container_requests")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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
-               },
-
-               links.get_permissions = function(uuid)
-               {
-                       endPoint <- stringr::str_interp("permissions/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation,
+                                                         include_trash = include_trash)
                        
                        body <- NULL
                        
@@ -4233,11 +2557,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.get = function(uuid)
+               groups.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("keep_services/${uuid}")
+                       endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4253,17 +2577,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.create = function(keepservice,
-                       ensure_unique_name = "false")
+               groups.create = function(group, ensure_unique_name = "false",
+                       cluster_id = NULL, async = "false")
                {
-                       endPoint <- stringr::str_interp("keep_services")
+                       endPoint <- stringr::str_interp("groups")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id, async = async)
                        
-                       if(length(keepservice) > 0)
-                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
+                       if(length(group) > 0)
+                               body <- jsonlite::toJSON(list(group = group), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4278,16 +2603,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.update = function(keepservice, uuid)
+               groups.update = function(group, uuid, async = "false")
                {
-                       endPoint <- stringr::str_interp("keep_services/${uuid}")
+                       endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(async = async)
                        
-                       if(length(keepservice) > 0)
-                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
+                       if(length(group) > 0)
+                               body <- jsonlite::toJSON(list(group = group), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4302,11 +2627,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.delete = function(uuid)
+               groups.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("keep_services/${uuid}")
+                       endPoint <- stringr::str_interp("groups/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4322,13 +2647,22 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.accessible = function()
+               groups.contents = function(filters = NULL,
+                       where = NULL, order = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       cluster_id = NULL, bypass_federation = NULL,
+                       include_trash = NULL, uuid = NULL, recursive = NULL,
+                       include = NULL)
                {
-                       endPoint <- stringr::str_interp("keep_services/accessible")
+                       endPoint <- stringr::str_interp("groups/contents")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(filters = filters, where = where,
+                                                         order = order, distinct = distinct, limit = limit,
+                                                         offset = offset, count = count, cluster_id = cluster_id,
+                                                         bypass_federation = bypass_federation, include_trash = include_trash,
+                                                         uuid = uuid, recursive = recursive, include = include)
                        
                        body <- NULL
                        
@@ -4342,18 +2676,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               keep_services.list = function(filters = NULL,
+               groups.shared = function(filters = NULL,
                        where = NULL, order = NULL, select = NULL,
                        distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL,
+                       include_trash = NULL, include = NULL)
                {
-                       endPoint <- stringr::str_interp("keep_services")
+                       endPoint <- stringr::str_interp("groups/shared")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation,
+                                                         include_trash = include_trash, include = include)
                        
                        body <- NULL
                        
@@ -4367,41 +2704,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_templates.get = function(uuid)
+               groups.trash = function(uuid)
                {
-                       endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
+                       endPoint <- stringr::str_interp("groups/${uuid}/trash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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
-               },
-
-               pipeline_templates.create = function(pipelinetemplate,
-                       ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("pipeline_templates")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
-                       
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
@@ -4412,41 +2724,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_templates.update = function(pipelinetemplate, uuid)
-               {
-                       endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
-                       url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
-                                       "Content-Type" = "application/json")
-                       queryArgs <- NULL
-                       
-                       if(length(pipelinetemplate) > 0)
-                               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
-               },
-
-               pipeline_templates.delete = function(uuid)
+               groups.untrash = function(uuid)
                {
-                       endPoint <- stringr::str_interp("pipeline_templates/${uuid}")
+                       endPoint <- stringr::str_interp("groups/${uuid}/untrash")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4456,18 +2744,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_templates.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+               groups.list = function(filters = NULL, where = NULL,
+                       order = NULL, select = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       cluster_id = NULL, bypass_federation = NULL,
+                       include_trash = NULL)
                {
-                       endPoint <- stringr::str_interp("pipeline_templates")
+                       endPoint <- stringr::str_interp("groups")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation,
+                                                         include_trash = include_trash)
                        
                        body <- NULL
                        
@@ -4481,11 +2772,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.get = function(uuid)
+               keep_services.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
+                       endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4501,17 +2792,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.create = function(pipelineinstance,
-                       ensure_unique_name = "false")
+               keep_services.create = function(keepservice,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("pipeline_instances")
+                       endPoint <- stringr::str_interp("keep_services")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(pipelineinstance) > 0)
-                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance), 
+                       if(length(keepservice) > 0)
+                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4526,16 +2818,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.update = function(pipelineinstance, uuid)
+               keep_services.update = function(keepservice, uuid)
                {
-                       endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
+                       endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(pipelineinstance) > 0)
-                               body <- jsonlite::toJSON(list(pipelineinstance = pipelineinstance), 
+                       if(length(keepservice) > 0)
+                               body <- jsonlite::toJSON(list(keepservice = keepservice), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4550,11 +2842,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.delete = function(uuid)
+               keep_services.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("pipeline_instances/${uuid}")
+                       endPoint <- stringr::str_interp("keep_services/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4570,17 +2862,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.cancel = function(uuid)
+               keep_services.accessible = function()
                {
-                       endPoint <- stringr::str_interp("pipeline_instances/${uuid}/cancel")
+                       endPoint <- stringr::str_interp("keep_services/accessible")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("POST", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4590,18 +2882,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               pipeline_instances.list = function(filters = NULL,
+               keep_services.list = function(filters = NULL,
                        where = NULL, order = NULL, select = NULL,
                        distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("pipeline_instances")
+                       endPoint <- stringr::str_interp("keep_services")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -4615,11 +2908,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.get = function(uuid)
+               links.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("repositories/${uuid}")
+                       endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4635,16 +2928,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.create = function(repository, ensure_unique_name = "false")
+               links.create = function(link, ensure_unique_name = "false",
+                       cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("repositories")
+                       endPoint <- stringr::str_interp("links")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(repository) > 0)
-                               body <- jsonlite::toJSON(list(repository = repository), 
+                       if(length(link) > 0)
+                               body <- jsonlite::toJSON(list(link = link), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4659,16 +2954,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.update = function(repository, uuid)
+               links.update = function(link, uuid)
                {
-                       endPoint <- stringr::str_interp("repositories/${uuid}")
+                       endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(repository) > 0)
-                               body <- jsonlite::toJSON(list(repository = repository), 
+                       if(length(link) > 0)
+                               body <- jsonlite::toJSON(list(link = link), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4683,11 +2978,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.delete = function(uuid)
+               links.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("repositories/${uuid}")
+                       endPoint <- stringr::str_interp("links/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4703,13 +2998,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.get_all_permissions = function()
+               links.list = function(filters = NULL, where = NULL,
+                       order = NULL, select = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("repositories/get_all_permissions")
+                       endPoint <- stringr::str_interp("links")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(filters = filters, where = where,
+                                                         order = order, select = select, distinct = distinct,
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -4723,18 +3024,13 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               repositories.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+               links.get_permissions = function(uuid)
                {
-                       endPoint <- stringr::str_interp("repositories")
+                       endPoint <- stringr::str_interp("permissions/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
@@ -4748,11 +3044,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               specimens.get = function(uuid)
+               logs.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("specimens/${uuid}")
+                       endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4768,16 +3064,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               specimens.create = function(specimen, ensure_unique_name = "false")
+               logs.create = function(log, ensure_unique_name = "false",
+                       cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("specimens")
+                       endPoint <- stringr::str_interp("logs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(specimen) > 0)
-                               body <- jsonlite::toJSON(list(specimen = specimen), 
+                       if(length(log) > 0)
+                               body <- jsonlite::toJSON(list(log = log), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4792,16 +3090,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               specimens.update = function(specimen, uuid)
+               logs.update = function(log, uuid)
                {
-                       endPoint <- stringr::str_interp("specimens/${uuid}")
+                       endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(specimen) > 0)
-                               body <- jsonlite::toJSON(list(specimen = specimen), 
+                       if(length(log) > 0)
+                               body <- jsonlite::toJSON(list(log = log), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4816,11 +3114,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               specimens.delete = function(uuid)
+               logs.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("specimens/${uuid}")
+                       endPoint <- stringr::str_interp("logs/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4836,18 +3134,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               specimens.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+               logs.list = function(filters = NULL, where = NULL,
+                       order = NULL, select = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("specimens")
+                       endPoint <- stringr::str_interp("logs")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -4861,11 +3160,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               logs.get = function(uuid)
+               users.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("logs/${uuid}")
+                       endPoint <- stringr::str_interp("users/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -4881,16 +3180,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               logs.create = function(log, ensure_unique_name = "false")
+               users.create = function(user, ensure_unique_name = "false",
+                       cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("logs")
+                       endPoint <- stringr::str_interp("users")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(log) > 0)
-                               body <- jsonlite::toJSON(list(log = log), 
+                       if(length(user) > 0)
+                               body <- jsonlite::toJSON(list(user = user), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -4905,21 +3206,41 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               logs.update = function(log, uuid)
+               users.update = function(user, uuid, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("logs/${uuid}")
+                       endPoint <- stringr::str_interp("users/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(bypass_federation = bypass_federation)
                        
-                       if(length(log) > 0)
-                               body <- jsonlite::toJSON(list(log = log), 
+                       if(length(user) > 0)
+                               body <- jsonlite::toJSON(list(user = user), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
                        
-                       response <- private$REST$http$exec("PUT", url, headers, body,
+                       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
+               },
+
+               users.delete = function(uuid)
+               {
+                       endPoint <- stringr::str_interp("users/${uuid}")
+                       url <- paste0(private$host, endPoint)
+                       headers <- list(Authorization = paste("Bearer", 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)
                        
@@ -4929,17 +3250,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               logs.delete = function(uuid)
+               users.current = function()
                {
-                       endPoint <- stringr::str_interp("logs/${uuid}")
+                       endPoint <- stringr::str_interp("users/current")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4949,17 +3270,13 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               logs.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               users.system = function()
                {
-                       endPoint <- stringr::str_interp("logs")
+                       endPoint <- stringr::str_interp("users/system")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
@@ -4973,17 +3290,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               traits.get = function(uuid)
+               users.activate = function(uuid)
                {
-                       endPoint <- stringr::str_interp("traits/${uuid}")
+                       endPoint <- stringr::str_interp("users/${uuid}/activate")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -4993,19 +3310,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               traits.create = function(trait, ensure_unique_name = "false")
+               users.setup = function(uuid = NULL, user = NULL,
+                       repo_name = NULL, vm_uuid = NULL, send_notification_email = "false")
                {
-                       endPoint <- stringr::str_interp("traits")
+                       endPoint <- stringr::str_interp("users/setup")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(uuid = uuid, user = user,
+                                                         repo_name = repo_name, vm_uuid = vm_uuid,
+                                                         send_notification_email = send_notification_email)
                        
-                       if(length(trait) > 0)
-                               body <- jsonlite::toJSON(list(trait = trait), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
                        response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
@@ -5017,21 +3333,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               traits.update = function(trait, uuid)
+               users.unsetup = function(uuid)
                {
-                       endPoint <- stringr::str_interp("traits/${uuid}")
+                       endPoint <- stringr::str_interp("users/${uuid}/unsetup")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(trait) > 0)
-                               body <- jsonlite::toJSON(list(trait = trait), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
-                       response <- private$REST$http$exec("PUT", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5041,17 +3353,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               traits.delete = function(uuid)
+               users.update_uuid = function(uuid, new_uuid)
                {
-                       endPoint <- stringr::str_interp("traits/${uuid}")
+                       endPoint <- stringr::str_interp("users/${uuid}/update_uuid")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(new_uuid = new_uuid)
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5061,21 +3373,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               traits.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact")
+               users.merge = function(new_owner_uuid, new_user_token = NULL,
+                       redirect_to_new_user = NULL, old_user_uuid = NULL,
+                       new_user_uuid = NULL)
                {
-                       endPoint <- stringr::str_interp("traits")
+                       endPoint <- stringr::str_interp("users/merge")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- list(new_owner_uuid = new_owner_uuid,
+                                                         new_user_token = new_user_token, redirect_to_new_user = redirect_to_new_user,
+                                                         old_user_uuid = old_user_uuid, new_user_uuid = new_user_uuid)
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5085,13 +3397,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.get = function(uuid)
+               users.list = function(filters = NULL, where = NULL,
+                       order = NULL, select = NULL, distinct = NULL,
+                       limit = "100", offset = "0", count = "exact",
+                       cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
+                       endPoint <- stringr::str_interp("users")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(filters = filters, where = where,
+                                                         order = order, select = select, distinct = distinct,
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -5105,22 +3423,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.create = function(virtualmachine,
-                       ensure_unique_name = "false")
+               repositories.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("virtual_machines")
+                       endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- NULL
                        
-                       if(length(virtualmachine) > 0)
-                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
-                       response <- private$REST$http$exec("POST", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5130,21 +3443,23 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.update = function(virtualmachine, uuid)
+               repositories.create = function(repository,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
+                       endPoint <- stringr::str_interp("repositories")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(virtualmachine) > 0)
-                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
+                       if(length(repository) > 0)
+                               body <- jsonlite::toJSON(list(repository = repository), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
                        
-                       response <- private$REST$http$exec("PUT", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5154,17 +3469,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.delete = function(uuid)
+               repositories.update = function(repository, uuid)
                {
-                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
+                       endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       body <- NULL
+                       if(length(repository) > 0)
+                               body <- jsonlite::toJSON(list(repository = repository), 
+                                                        auto_unbox = TRUE)
+                       else
+                               body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5174,17 +3493,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.logins = function(uuid)
+               repositories.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("virtual_machines/${uuid}/logins")
+                       endPoint <- stringr::str_interp("repositories/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5194,11 +3513,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.get_all_logins = function()
+               repositories.get_all_permissions = function()
                {
-                       endPoint <- stringr::str_interp("virtual_machines/get_all_logins")
+                       endPoint <- stringr::str_interp("repositories/get_all_permissions")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5214,18 +3533,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               virtual_machines.list = function(filters = NULL,
+               repositories.list = function(filters = NULL,
                        where = NULL, order = NULL, select = NULL,
                        distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("virtual_machines")
+                       endPoint <- stringr::str_interp("repositories")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -5239,11 +3559,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               workflows.get = function(uuid)
+               virtual_machines.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("workflows/${uuid}")
+                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5259,16 +3579,18 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               workflows.create = function(workflow, ensure_unique_name = "false")
+               virtual_machines.create = function(virtualmachine,
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("workflows")
+                       endPoint <- stringr::str_interp("virtual_machines")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       if(length(workflow) > 0)
-                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                       if(length(virtualmachine) > 0)
+                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -5283,16 +3605,16 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               workflows.update = function(workflow, uuid)
+               virtual_machines.update = function(virtualmachine, uuid)
                {
-                       endPoint <- stringr::str_interp("workflows/${uuid}")
+                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       if(length(workflow) > 0)
-                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                       if(length(virtualmachine) > 0)
+                               body <- jsonlite::toJSON(list(virtualmachine = virtualmachine), 
                                                         auto_unbox = TRUE)
                        else
                                body <- NULL
@@ -5307,11 +3629,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               workflows.delete = function(uuid)
+               virtual_machines.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("workflows/${uuid}")
+                       endPoint <- stringr::str_interp("virtual_machines/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5327,18 +3649,13 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               workflows.list = function(filters = NULL,
-                       where = NULL, order = NULL, select = NULL,
-                       distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+               virtual_machines.logins = function(uuid)
                {
-                       endPoint <- stringr::str_interp("workflows")
+                       endPoint <- stringr::str_interp("virtual_machines/${uuid}/logins")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(filters = filters, where = where,
-                                                         order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                       queryArgs <- NULL
                        
                        body <- NULL
                        
@@ -5352,11 +3669,11 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.get = function(uuid)
+               virtual_machines.get_all_logins = function()
                {
-                       endPoint <- stringr::str_interp("groups/${uuid}")
+                       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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5372,45 +3689,23 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.create = function(group, ensure_unique_name = "false")
-               {
-                       endPoint <- stringr::str_interp("groups")
-                       url <- paste0(private$host, endPoint)
-                       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), 
-                                                        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
-               },
-
-               groups.update = function(group, uuid)
+               virtual_machines.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("groups/${uuid}")
+                       endPoint <- stringr::str_interp("virtual_machines")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- NULL
+                       queryArgs <- list(filters = filters, where = where,
+                                                         order = order, select = select, distinct = distinct,
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
-                       if(length(group) > 0)
-                               body <- jsonlite::toJSON(list(group = group), 
-                                                        auto_unbox = TRUE)
-                       else
-                               body <- NULL
+                       body <- NULL
                        
-                       response <- private$REST$http$exec("PUT", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5420,17 +3715,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.delete = function(uuid)
+               workflows.get = function(uuid)
                {
-                       endPoint <- stringr::str_interp("groups/${uuid}")
+                       endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("DELETE", url, headers, body,
+                       response <- private$REST$http$exec("GET", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5440,23 +3735,23 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.contents = function(filters = NULL,
-                       where = NULL, order = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact",
-                       include_trash = NULL, uuid = NULL, recursive = NULL)
+               workflows.create = function(workflow, ensure_unique_name = "false",
+                       cluster_id = NULL)
                {
-                       endPoint <- stringr::str_interp("groups/contents")
+                       endPoint <- stringr::str_interp("workflows")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
-                       body <- NULL
+                       if(length(workflow) > 0)
+                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                                                        auto_unbox = TRUE)
+                       else
+                               body <- NULL
                        
-                       response <- private$REST$http$exec("GET", url, headers, body,
+                       response <- private$REST$http$exec("POST", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5466,17 +3761,21 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.trash = function(uuid)
+               workflows.update = function(workflow, uuid)
                {
-                       endPoint <- stringr::str_interp("groups/${uuid}/trash")
+                       endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
-                       body <- NULL
+                       if(length(workflow) > 0)
+                               body <- jsonlite::toJSON(list(workflow = workflow), 
+                                                        auto_unbox = TRUE)
+                       else
+                               body <- NULL
                        
-                       response <- private$REST$http$exec("POST", url, headers, body,
+                       response <- private$REST$http$exec("PUT", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5486,17 +3785,17 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.untrash = function(uuid)
+               workflows.delete = function(uuid)
                {
-                       endPoint <- stringr::str_interp("groups/${uuid}/untrash")
+                       endPoint <- stringr::str_interp("workflows/${uuid}")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
                        body <- NULL
                        
-                       response <- private$REST$http$exec("POST", url, headers, body,
+                       response <- private$REST$http$exec("DELETE", url, headers, body,
                                                           queryArgs, private$numRetries)
                        resource <- private$REST$httpParser$parseJSONResponse(response)
                        
@@ -5506,19 +3805,19 @@ Arvados <- R6::R6Class(
                        resource
                },
 
-               groups.list = function(filters = NULL, where = NULL,
-                       order = NULL, select = NULL, distinct = NULL,
-                       limit = "100", offset = "0", count = "exact",
-                       include_trash = NULL)
+               workflows.list = function(filters = NULL,
+                       where = NULL, order = NULL, select = NULL,
+                       distinct = NULL, limit = "100", offset = "0",
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
-                       endPoint <- stringr::str_interp("groups")
+                       endPoint <- stringr::str_interp("workflows")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", 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)
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -5536,7 +3835,7 @@ 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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5553,13 +3852,14 @@ Arvados <- R6::R6Class(
                },
 
                user_agreements.create = function(useragreement,
-                       ensure_unique_name = "false")
+                       ensure_unique_name = "false", cluster_id = NULL)
                {
                        endPoint <- stringr::str_interp("user_agreements")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
-                       queryArgs <- list(ensure_unique_name = ensure_unique_name)
+                       queryArgs <- list(ensure_unique_name = ensure_unique_name,
+                                                         cluster_id = cluster_id)
                        
                        if(length(useragreement) > 0)
                                body <- jsonlite::toJSON(list(useragreement = useragreement), 
@@ -5581,7 +3881,7 @@ 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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5605,7 +3905,7 @@ 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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5625,7 +3925,7 @@ 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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5645,7 +3945,7 @@ 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("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
@@ -5664,15 +3964,16 @@ Arvados <- R6::R6Class(
                user_agreements.list = function(filters = NULL,
                        where = NULL, order = NULL, select = NULL,
                        distinct = NULL, limit = "100", offset = "0",
-                       count = "exact")
+                       count = "exact", cluster_id = NULL, bypass_federation = NULL)
                {
                        endPoint <- stringr::str_interp("user_agreements")
                        url <- paste0(private$host, endPoint)
-                       headers <- list(Authorization = paste("OAuth2", private$token), 
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- list(filters = filters, where = where,
                                                          order = order, select = select, distinct = distinct,
-                                                         limit = limit, offset = offset, count = count)
+                                                         limit = limit, offset = offset, count = count,
+                                                         cluster_id = cluster_id, bypass_federation = bypass_federation)
                        
                        body <- NULL
                        
@@ -5690,7 +3991,27 @@ 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("Bearer", 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
+               },
+
+               configs.get = function()
+               {
+                       endPoint <- stringr::str_interp("config")
+                       url <- paste0(private$host, endPoint)
+                       headers <- list(Authorization = paste("Bearer", private$token), 
                                        "Content-Type" = "application/json")
                        queryArgs <- NULL
                        
index 70bb4450eccca6efd453002dc7a0962c904fb0d0..fb1d3b335cba00df4db898de20b917334b7e4610 100644 (file)
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-source("./R/util.R")
-
 #' ArvadosFile
 #'
 #' ArvadosFile class represents a file inside Arvados collection.
index 8869d7be67846b449200fe2c675936dd1c4133db..1440836547253bc96871c651e666ec8608af243a 100644 (file)
@@ -2,11 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-source("./R/Subcollection.R")
-source("./R/ArvadosFile.R")
-source("./R/RESTService.R")
-source("./R/util.R")
-
 #' Collection
 #'
 #' Collection class provides interface for working with Arvados collections.
index 5f7a29455ae4a58aaae6792f6dd1eb26ae30ae4e..e01e7e8de9dc1f36ac462a0c3730c525926a1555 100644 (file)
@@ -2,10 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-source("./R/Subcollection.R")
-source("./R/ArvadosFile.R")
-source("./R/util.R")
-
 CollectionTree <- R6::R6Class(
     "CollectionTree",
     public = list(
index cd492166a139bf56dccebf732f2533c443440cf7..60bf7828278859e14fefaacebbcb5d762f1dbe99 100644 (file)
@@ -31,14 +31,13 @@ HttpParser <- R6::R6Class(
         {
             text <- rawToChar(response$content)
             doc <- XML::xmlParse(text, asText=TRUE)
-            base <- paste(paste("/", strsplit(uri, "/")[[1]][-1:-3], sep="", collapse=""), "/", sep="")
+            base <- paste("/", strsplit(uri, "/")[[1]][4], "/", sep="")
             result <- unlist(
                 XML::xpathApply(doc, "//D:response/D:href", function(node) {
                     sub(base, "", URLdecode(XML::xmlValue(node)), fixed=TRUE)
                 })
             )
-            result <- result[result != ""]
-            result[-1]
+            result[result != ""]
         },
 
         getFileSizesFromResponse = function(response, uri)
index 07defca90f4c99e8be9f8a73f7412f398ab1a701..18b36f96898c2fa1be1d2e512a2fb158ac94294a 100644 (file)
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-source("./R/util.R")
-
 HttpRequest <- R6::R6Class(
 
     "HttrRequest",
@@ -54,7 +52,7 @@ HttpRequest <- R6::R6Class(
             {
                 query <- paste0(names(query), "=", query, collapse = "&")
 
-                return(paste0("/?", query))
+                return(paste0("?", query))
             }
 
             return("")
index 78b2c35e32fa117190f033075e1ea5ee2a3805e3..9c65e72861f41513936e431afda50f6ab443f983 100644 (file)
@@ -36,16 +36,13 @@ RESTService <- R6::R6Class(
         {
             if(is.null(private$webDavHostName))
             {
-                discoveryDocumentURL <- paste0("https://", private$rawHostName,
-                                               "/discovery/v1/apis/arvados/v1/rest")
+                publicConfigURL <- paste0("https://", private$rawHostName,
+                                               "/arvados/v1/config")
 
-                headers <- list(Authorization = paste("OAuth2", self$token))
-
-                serverResponse <- self$http$exec("GET", discoveryDocumentURL, headers,
-                                                 retryTimes = self$numRetries)
+                serverResponse <- self$http$exec("GET", publicConfigURL, retryTimes = self$numRetries)
 
-                discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
-                private$webDavHostName <- discoveryDocument$keepWebServiceUrl
+                configDocument <- self$httpParser$parseJSONResponse(serverResponse)
+                private$webDavHostName <- configDocument$Services$WebDAVDownload$ExternalURL
 
                 if(is.null(private$webDavHostName))
                     stop("Unable to find WebDAV server.")
@@ -118,7 +115,7 @@ RESTService <- R6::R6Class(
             collectionURL <- URLencode(paste0(self$getWebDavHostName(),
                                               "c=", uuid))
 
-            headers <- list("Authorization" = paste("OAuth2", self$token))
+            headers <- list("Authorization" = paste("Bearer", self$token))
 
             response <- self$http$exec("PROPFIND", collectionURL, headers,
                                        retryTimes = self$numRetries)
index 17a9ef3ee3ba6180546763da637a8824905d66dc..981bd687a2fbcb68f8eb0deafa7caed619dd3628 100644 (file)
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-source("./R/util.R")
-
 #' Subcollection
 #'
 #' Subcollection class represents a folder inside Arvados collection.
index 1aef20b6cb90fe11d7440219bbe24d464af988c2..c86684f8b0a13ab62f53eddc23884a16e2504ffc 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 getAPIDocument <- function(){
-    url <- "https://4xphq.arvadosapi.com/discovery/v1/apis/arvados/v1/rest"
+    url <- "https://jutro.arvadosapi.com/discovery/v1/apis/arvados/v1/rest"
     serverResponse <- httr::RETRY("GET", url = url)
 
     httr::content(serverResponse, as = "parsed", type = "application/json")
@@ -17,6 +17,10 @@ generateAPI <- function()
     discoveryDocument <- getAPIDocument()
 
     methodResources <- discoveryDocument$resources
+
+    # Don't emit deprecated APIs
+    methodResources <- methodResources[!(names(methodResources) %in% c("jobs", "job_tasks", "pipeline_templates", "pipeline_instances",
+                           "keep_disks", "nodes", "humans", "traits", "specimens"))]
     resourceNames   <- names(methodResources)
 
     methodDoc <- genMethodsDoc(methodResources, resourceNames)
@@ -34,6 +38,10 @@ generateAPI <- function()
                       arvadosAPIFooter)
 
     fileConn <- file("./R/Arvados.R", "w")
+    writeLines(c(
+    "# Copyright (C) The Arvados Authors. All rights reserved.",
+    "#",
+    "# SPDX-License-Identifier: Apache-2.0", ""), fileConn)
     writeLines(unlist(arvadosClass), fileConn)
     close(fileConn)
     NULL
@@ -252,7 +260,7 @@ getRequestURL <- function(methodMetaData)
 
 getRequestHeaders <- function()
 {
-    c("headers <- list(Authorization = paste(\"OAuth2\", private$token), ",
+    c("headers <- list(Authorization = paste(\"Bearer\", private$token), ",
       "                \"Content-Type\" = \"application/json\")")
 }
 
index c1d6c7cf4f01eebaae55764630e8e1c68d6f1def..63bf55373d17a163522d1f2fdcf0ee4d640361d5 100644 (file)
@@ -14,7 +14,7 @@ knitr::opts_chunk$set(eval=FALSE)
 ```
 
 ```{r}
-install.packages("ArvadosR", repos=c("http://r.arvados.org", getOption("repos")["CRAN"]), dependencies=TRUE)
+install.packages("ArvadosR", repos=c("https://r.arvados.org", getOption("repos")["CRAN"]), dependencies=TRUE)
 ```
 
 Note: on Linux, you may have to install supporting packages.
index e3457c993f7c88cee4a963ca7006a90c6078f478..da7d52c67d63697bc81aefbcbe16e7713add3891 100644 (file)
@@ -23,7 +23,7 @@ test_that("get always returns NULL", {
     dog <- ArvadosFile$new("dog")
 
     responseIsNull <- is.null(dog$get("something"))
-    expect_that(responseIsNull, is_true())
+    expect_true(responseIsNull)
 })
 
 test_that("getFirst always returns NULL", {
@@ -31,7 +31,7 @@ test_that("getFirst always returns NULL", {
     dog <- ArvadosFile$new("dog")
 
     responseIsNull <- is.null(dog$getFirst())
-    expect_that(responseIsNull, is_true())
+    expect_true(responseIsNull)
 })
 
 test_that(paste("getSizeInBytes returns zero if arvadosFile",
@@ -266,8 +266,8 @@ test_that("move moves arvados file inside collection tree", {
     dogIsNullOnOldLocation <- is.null(collection$get("animal/dog"))
     dogExistsOnNewLocation <- !is.null(collection$get("dog"))
 
-    expect_that(dogIsNullOnOldLocation, is_true())
-    expect_that(dogExistsOnNewLocation, is_true())
+    expect_true(dogIsNullOnOldLocation)
+    expect_true(dogExistsOnNewLocation)
 })
 
 test_that(paste("copy raises exception if arvados file",
@@ -339,8 +339,8 @@ test_that("copy copies arvados file inside collection tree", {
     dogExistsOnOldLocation <- !is.null(collection$get("animal/dog"))
     dogExistsOnNewLocation <- !is.null(collection$get("dog"))
 
-    expect_that(dogExistsOnOldLocation, is_true())
-    expect_that(dogExistsOnNewLocation, is_true())
+    expect_true(dogExistsOnOldLocation)
+    expect_true(dogExistsOnNewLocation)
 })
 
 test_that("duplicate performs deep cloning of Arvados file", {
index 636359ae21a7b196d406ec2b16ee8839e0921f9e..20a2ecf05b120bb769d7f0b8d01c007099638516 100644 (file)
@@ -86,7 +86,7 @@ test_that(paste("add adds ArvadosFile or Subcollection",
     dog <- collection$get("animal/dog")
     dogExistsInCollection <- !is.null(dog) && dog$getName() == "dog"
 
-    expect_that(dogExistsInCollection, is_true())
+    expect_true(dogExistsInCollection)
     expect_that(fakeREST$createCallCount, equals(1))
 })
 
@@ -119,8 +119,8 @@ test_that(paste("create adds files specified by fileNames",
     dogExistsInCollection <- !is.null(dog) && dog$getName() == "dog"
     catExistsInCollection <- !is.null(cat) && cat$getName() == "cat"
 
-    expect_that(dogExistsInCollection, is_true())
-    expect_that(catExistsInCollection, is_true())
+    expect_true(dogExistsInCollection)
+    expect_true(catExistsInCollection)
     expect_that(fakeREST$createCallCount, equals(2))
 })
 
@@ -168,8 +168,8 @@ test_that(paste("remove removes files specified by paths",
     dogExistsInCollection <- !is.null(dog) && dog$getName() == "dog"
     catExistsInCollection <- !is.null(cat) && cat$getName() == "cat"
 
-    expect_that(dogExistsInCollection, is_false())
-    expect_that(catExistsInCollection, is_false())
+    expect_false(dogExistsInCollection)
+    expect_false(catExistsInCollection)
     expect_that(fakeREST$deleteCallCount, equals(2))
 })
 
@@ -188,8 +188,8 @@ test_that(paste("move moves content to a new location inside file tree",
     dogIsNullOnOldLocation <- is.null(collection$get("animal/dog"))
     dogExistsOnNewLocation <- !is.null(collection$get("dog"))
 
-    expect_that(dogIsNullOnOldLocation, is_true())
-    expect_that(dogExistsOnNewLocation, is_true())
+    expect_true(dogIsNullOnOldLocation)
+    expect_true(dogExistsOnNewLocation)
     expect_that(fakeREST$moveCallCount, equals(1))
 })
 
@@ -219,7 +219,7 @@ test_that("getFileListing returns sorted collection content received from REST s
     contentMatchExpected <- all(collection$getFileListing() ==
                                 c("animal", "animal/fish", "ball"))
 
-    expect_that(contentMatchExpected, is_true())
+    expect_true(contentMatchExpected)
     #2 calls because Collection$new calls getFileListing once
     expect_that(fakeREST$getCollectionContentCallCount, equals(2))
 
@@ -237,7 +237,7 @@ test_that("get returns arvados file or subcollection from internal tree structur
     fish <- collection$get("animal/fish")
     fishIsNotNull <- !is.null(fish)
 
-    expect_that(fishIsNotNull, is_true())
+    expect_true(fishIsNotNull)
     expect_that(fish$getName(), equals("fish"))
 })
 
@@ -256,8 +256,8 @@ test_that(paste("copy copies content to a new location inside file tree",
     dogExistsOnOldLocation <- !is.null(collection$get("animal/dog"))
     dogExistsOnNewLocation <- !is.null(collection$get("dog"))
 
-    expect_that(dogExistsOnOldLocation, is_true())
-    expect_that(dogExistsOnNewLocation, is_true())
+    expect_true(dogExistsOnOldLocation)
+    expect_true(dogExistsOnNewLocation)
     expect_that(fakeREST$copyCallCount, equals(1))
 })
 
index 1a3aefecd012325658ad408ee2a699682907dbaf..c4bf9a1da7ff639d62c1bbb135ea77f4326ed4d6 100644 (file)
@@ -34,16 +34,16 @@ test_that("constructor creates file tree from character array properly", {
                                          boat$getCollection()   == "myCollection"
 
     expect_that(root$getName(), equals(""))
-    expect_that(rootIsOfTypeSubcollection, is_true())
-    expect_that(rootHasNoParent, is_true())
-    expect_that(animalIsOfTypeSubcollection, is_true())
-    expect_that(animalsParentIsRoot, is_true())
-    expect_that(animalContainsDog, is_true())
-    expect_that(dogIsOfTypeArvadosFile, is_true())
-    expect_that(dogsParentIsAnimal, is_true())
-    expect_that(boatIsOfTypeArvadosFile, is_true())
-    expect_that(boatsParentIsRoot, is_true())
-    expect_that(allElementsBelongToSameCollection, is_true())
+    expect_true(rootIsOfTypeSubcollection)
+    expect_true(rootHasNoParent)
+    expect_true(animalIsOfTypeSubcollection)
+    expect_true(animalsParentIsRoot)
+    expect_true(animalContainsDog)
+    expect_true(dogIsOfTypeArvadosFile)
+    expect_true(dogsParentIsAnimal)
+    expect_true(boatIsOfTypeArvadosFile)
+    expect_true(boatsParentIsRoot)
+    expect_true(allElementsBelongToSameCollection)
 })
 
 test_that("getElement returns element from tree if element exists on specified path", {
@@ -72,7 +72,7 @@ test_that("getElement returns NULL from tree if element doesn't exists on specif
     fish <- collectionTree$getElement("animal/fish")
     fishIsNULL <- is.null(fish)
 
-    expect_that(fishIsNULL, is_true())
+    expect_true(fishIsNULL)
 })
 
 test_that("getElement trims ./ from start of relativePath", {
index 82c0fb0dd2fed88598e8fd14a8dd88a11d065b71..fb9f379b3623099b1171456b4f4a2b849713773b 100644 (file)
@@ -18,7 +18,7 @@ test_that("parseJSONResponse generates and returns JSON object from server respo
     result <- parser$parseJSONResponse(serverResponse)
     barExists <- !is.null(result$bar)
 
-    expect_that(barExists, is_true())
+    expect_true(barExists)
     expect_that(unlist(result$bar$foo), equals(10))
 })
 
@@ -40,7 +40,7 @@ test_that(paste("parseResponse generates and returns character vector",
 
 webDAVResponseSample =
     paste0("<?xml version=\"1.0\" encoding=\"UTF-8\"?><D:multistatus xmlns:",
-           "D=\"DAV:\"><D:response><D:href>/c=aaaaa-bbbbb-ccccccccccccccc</D",
+           "D=\"DAV:\"><D:response><D:href>/c=aaaaa-bbbbb-ccccccccccccccc/</D",
            ":href><D:propstat><D:prop><D:resourcetype><D:collection xmlns:D=",
            "\"DAV:\"/></D:resourcetype><D:getlastmodified>Fri, 11 Jan 2018 1",
            "1:11:11 GMT</D:getlastmodified><D:displayname></D:displayname><D",
@@ -75,7 +75,7 @@ test_that(paste("getFileNamesFromResponse returns file names belonging to specif
     expectedResult <- "myFile.exe"
     resultMatchExpected <- all.equal(result, expectedResult)
 
-    expect_that(resultMatchExpected, is_true())
+    expect_true(resultMatchExpected)
 })
 
 test_that(paste("getFileSizesFromResponse returns file sizes",
@@ -92,5 +92,5 @@ test_that(paste("getFileSizesFromResponse returns file sizes",
     result <- parser$getFileSizesFromResponse(serverResponse, url)
     resultMatchExpected <- result == expectedResult
 
-    expect_that(resultMatchExpected, is_true())
+    expect_true(resultMatchExpected)
 })
index f12463c805dda10e67325adb2a892d5223600932..c1b6f1039cfc28e0e7b4f62087f3919acaa7c0b3 100644 (file)
@@ -20,7 +20,7 @@ test_that("createQuery generates and encodes query portion of http", {
     queryParams$limit <- 20
     queryParams$offset <- 50
     expect_that(http$createQuery(queryParams),
-                equals(paste0("/?filters=%5B%5B%22color%22%2C%22%3D%22%2C%22red",
+                equals(paste0("?filters=%5B%5B%22color%22%2C%22%3D%22%2C%22red",
                               "%22%5D%5D&limit=20&offset=50")))
 })
 
@@ -59,8 +59,8 @@ test_that("exec calls httr functions correctly", {
     http <- HttpRequest$new()
     http$exec("GET", "url")
 
-    expect_that(add_headersCalled, is_true())
-    expect_that(retryCalled, is_true())
+    expect_true(add_headersCalled)
+    expect_true(retryCalled)
     expect_that(expectedConfig$options, equals(list(ssl_verifypeer = 0L)))
 })
 
@@ -101,8 +101,8 @@ test_that("getConnection calls curl functions correctly", {
     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())
+    expect_true(new_handleCalled)
+    expect_true(handle_setheadersCalled)
+    expect_true(handle_setoptCalled)
+    expect_true(curlCalled)
 })
index 64988e33db2c3c4614112d2eb993687d6e169199..8885ed3de2f5caa906b9d5223878b2fe5d52ccb3 100644 (file)
@@ -10,8 +10,8 @@ context("REST service")
 
 test_that("getWebDavHostName calls REST service properly", {
 
-    expectedURL <- "https://host/discovery/v1/apis/arvados/v1/rest"
-    serverResponse <- list(keepWebServiceUrl = "https://myWebDavServer.com")
+    expectedURL <- "https://host/arvados/v1/config"
+    serverResponse <- list(Services = list(WebDAVDownload = list(ExternalURL = "https://myWebDavServer.com")))
     httpRequest <- FakeHttpRequest$new(expectedURL, serverResponse)
 
     REST <- RESTService$new("token", "host",
@@ -19,14 +19,14 @@ test_that("getWebDavHostName calls REST service properly", {
 
     REST$getWebDavHostName()
 
-    expect_that(httpRequest$URLIsProperlyConfigured, is_true())
-    expect_that(httpRequest$requestHeaderContainsAuthorizationField, is_true())
+    expect_true(httpRequest$URLIsProperlyConfigured)
+    expect_false(httpRequest$requestHeaderContainsAuthorizationField)
     expect_that(httpRequest$numberOfGETRequests, equals(1))
 })
 
 test_that("getWebDavHostName returns webDAV host name properly", {
 
-    serverResponse <- list(keepWebServiceUrl = "https://myWebDavServer.com")
+    serverResponse <- list(Services = list(WebDAVDownload = list(ExternalURL = "https://myWebDavServer.com")))
     httpRequest <- FakeHttpRequest$new(expectedURL = NULL, serverResponse)
 
     REST <- RESTService$new("token", "host",
@@ -48,8 +48,8 @@ test_that("create calls REST service properly", {
 
     REST$create("file", uuid)
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
     expect_that(fakeHttp$numberOfPUTRequests, equals(1))
 })
 
@@ -81,8 +81,8 @@ test_that("delete calls REST service properly", {
 
     REST$delete("file", uuid)
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
     expect_that(fakeHttp$numberOfDELETERequests, equals(1))
 })
 
@@ -114,9 +114,9 @@ test_that("move calls REST service properly", {
 
     REST$move("file", "newDestination/file", uuid)
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-    expect_that(fakeHttp$requestHeaderContainsDestinationField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
+    expect_true(fakeHttp$requestHeaderContainsDestinationField)
     expect_that(fakeHttp$numberOfMOVERequests, equals(1))
 })
 
@@ -148,9 +148,9 @@ test_that("copy calls REST service properly", {
 
     REST$copy("file", "newDestination/file", uuid)
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-    expect_that(fakeHttp$requestHeaderContainsDestinationField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
+    expect_true(fakeHttp$requestHeaderContainsDestinationField)
     expect_that(fakeHttp$numberOfCOPYRequests, equals(1))
 })
 
@@ -187,8 +187,8 @@ test_that("getCollectionContent retreives correct content from WebDAV server", {
     returnedContentMatchExpected <- all.equal(returnResult,
                                               c("animal", "animal/dog", "ball"))
 
-    expect_that(returnedContentMatchExpected, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
+    expect_true(returnedContentMatchExpected)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
 })
 
 test_that("getCollectionContent raises exception if server returns empty response", {
@@ -266,9 +266,9 @@ test_that("getResourceSize calls REST service properly", {
     returnedContentMatchExpected <- all.equal(returnResult,
                                               c(6, 2, 931, 12003))
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-    expect_that(returnedContentMatchExpected, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
+    expect_true(returnedContentMatchExpected)
 })
 
 test_that("getResourceSize raises exception if server returns empty response", {
@@ -330,9 +330,9 @@ test_that("read calls REST service properly", {
 
     returnResult <- REST$read("file", uuid, "text", 1024, 512)
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-    expect_that(fakeHttp$requestHeaderContainsRangeField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
+    expect_true(fakeHttp$requestHeaderContainsRangeField)
     expect_that(returnResult, equals("file content"))
 })
 
@@ -390,10 +390,10 @@ test_that("write calls REST service properly", {
 
     REST$write("file", uuid, fileContent, "text/html")
 
-    expect_that(fakeHttp$URLIsProperlyConfigured, is_true())
-    expect_that(fakeHttp$requestBodyIsProvided, is_true())
-    expect_that(fakeHttp$requestHeaderContainsAuthorizationField, is_true())
-    expect_that(fakeHttp$requestHeaderContainsContentTypeField, is_true())
+    expect_true(fakeHttp$URLIsProperlyConfigured)
+    expect_true(fakeHttp$requestBodyIsProvided)
+    expect_true(fakeHttp$requestHeaderContainsAuthorizationField)
+    expect_true(fakeHttp$requestHeaderContainsContentTypeField)
 })
 
 test_that("write raises exception if server response code is not between 200 and 300", {
index a6e420962bce9777d56d69c4ded58c015986b288..a95247f77c7d457d9f368ef321a027a980652e85 100644 (file)
@@ -37,7 +37,7 @@ test_that(paste("getFileListing by default returns sorted path of all files",
     resultsMatch <- length(expectedResult) == length(result) &&
                     all(expectedResult == result)
 
-    expect_that(resultsMatch, is_true())
+    expect_true(resultsMatch)
 })
 
 test_that(paste("getFileListing returns sorted names of all direct children",
@@ -58,7 +58,7 @@ test_that(paste("getFileListing returns sorted names of all direct children",
     resultsMatch <- length(expectedResult) == length(result) &&
                     all(expectedResult == result)
 
-    expect_that(resultsMatch, is_true())
+    expect_true(resultsMatch)
 })
 
 test_that("add adds content to inside collection tree", {
@@ -73,8 +73,8 @@ test_that("add adds content to inside collection tree", {
     animalContainsFish <- animal$get("fish")$getName() == fish$getName()
     animalContainsDog  <- animal$get("dog")$getName()  == dog$getName()
 
-    expect_that(animalContainsFish, is_true())
-    expect_that(animalContainsDog, is_true())
+    expect_true(animalContainsFish)
+    expect_true(animalContainsDog)
 })
 
 test_that("add raises exception if content name is empty string", {
@@ -143,7 +143,7 @@ test_that("remove removes content from subcollection", {
 
     returnValueAfterRemovalIsNull <- is.null(animal$get("fish"))
 
-    expect_that(returnValueAfterRemovalIsNull, is_true())
+    expect_true(returnValueAfterRemovalIsNull)
 })
 
 test_that(paste("remove raises exception",
@@ -198,10 +198,10 @@ test_that(paste("get returns ArvadosFile or Subcollection",
     returnedFishIsSubcollection <- "Subcollection" %in% class(returnedFish)
     returnedDogIsArvadosFile    <- "ArvadosFile"   %in% class(returnedDog)
 
-    expect_that(returnedFishIsSubcollection, is_true())
+    expect_true(returnedFishIsSubcollection)
     expect_that(returnedFish$getName(), equals("fish"))
 
-    expect_that(returnedDogIsArvadosFile, is_true())
+    expect_true(returnedDogIsArvadosFile)
     expect_that(returnedDog$getName(), equals("dog"))
 })
 
@@ -215,7 +215,7 @@ test_that(paste("get returns NULL if file or folder",
 
     returnedDogIsNull <- is.null(animal$get("dog"))
 
-    expect_that(returnedDogIsNull, is_true())
+    expect_true(returnedDogIsNull)
 })
 
 test_that("getFirst returns first child in the subcollection", {
@@ -234,7 +234,7 @@ test_that("getFirst returns NULL if subcollection contains no children", {
 
     returnedElementIsNull <- is.null(animal$getFirst())
 
-    expect_that(returnedElementIsNull, is_true())
+    expect_true(returnedElementIsNull)
 })
 
 test_that(paste("setCollection by default sets collection",
@@ -261,7 +261,7 @@ test_that(paste("setCollection sets collection filed of subcollection only",
     fishCollectionIsNull <- is.null(fish$getCollection())
 
     expect_that(animal$getCollection(), equals("myCollection"))
-    expect_that(fishCollectionIsNull, is_true())
+    expect_true(fishCollectionIsNull)
 })
 
 test_that(paste("move raises exception if subcollection",
@@ -330,8 +330,8 @@ test_that("move moves subcollection inside collection tree", {
     fishIsNullOnOldLocation <- is.null(collection$get("animal/fish"))
     fishExistsOnNewLocation <- !is.null(collection$get("fish"))
 
-    expect_that(fishIsNullOnOldLocation, is_true())
-    expect_that(fishExistsOnNewLocation, is_true())
+    expect_true(fishIsNullOnOldLocation)
+    expect_true(fishExistsOnNewLocation)
 })
 
 test_that(paste("getSizeInBytes returns zero if subcollection",
@@ -425,8 +425,8 @@ test_that("copy copies subcollection inside collection tree", {
     fishExistsOnOldLocation <- !is.null(collection$get("animal/fish"))
     fishExistsOnNewLocation <- !is.null(collection$get("fish"))
 
-    expect_that(fishExistsOnOldLocation, is_true())
-    expect_that(fishExistsOnNewLocation, is_true())
+    expect_true(fishExistsOnOldLocation)
+    expect_true(fishExistsOnNewLocation)
 })
 
 test_that("duplicate performs deep cloning of Subcollection", {
index dcbe03a057b8cbd7d44643f3064563290e559b07..4bfe272789062018d47e33e1b46394a725f45e97 100644 (file)
@@ -192,6 +192,10 @@ def arg_parser():  # type: () -> argparse.ArgumentParser
                         action="store_false", default=True,
                         help=argparse.SUPPRESS)
 
+    parser.add_argument("--disable-color", dest="enable_color",
+                        action="store_false", default=True,
+                        help=argparse.SUPPRESS)
+
     parser.add_argument("--disable-js-validation",
                         action="store_true", default=False,
                         help=argparse.SUPPRESS)
index fb23c2ccf73df514923f4fd0041814c6e8751833..99d82f3398332d10e0ac0cbf95decb0d5870bd5a 100644 (file)
@@ -325,8 +325,8 @@ class ArvadosContainer(JobBase):
                 logger.info("%s reused container %s", self.arvrunner.label(self), response["container_uuid"])
             else:
                 logger.info("%s %s state is %s", self.arvrunner.label(self), response["uuid"], response["state"])
-        except Exception:
-            logger.exception("%s got an error", self.arvrunner.label(self))
+        except Exception as e:
+            logger.exception("%s error submitting container\n%s", self.arvrunner.label(self), e)
             logger.debug("Container request was %s", container_request)
             self.output_callback({}, "permanentFail")
 
@@ -475,6 +475,7 @@ class RunnerContainer(Runner):
                    "--api=containers",
                    "--no-log-timestamps",
                    "--disable-validate",
+                   "--disable-color",
                    "--eval-timeout=%s" % self.arvrunner.eval_timeout,
                    "--thread-count=%s" % self.arvrunner.thread_count,
                    "--enable-reuse" if self.enable_reuse else "--disable-reuse",
index 9ba798ec640f3d0caaecdaf114bafbdb36a1b4ad..68141586decdc7f656ca715e14bec1a6c436528a 100644 (file)
@@ -524,6 +524,8 @@ The 'jobs' API is no longer supported.
     def arv_executor(self, updated_tool, job_order, runtimeContext, logger=None):
         self.debug = runtimeContext.debug
 
+        logger.info("Using cluster %s (%s)", self.api.config()["ClusterID"], self.api.config()["Services"]["Controller"]["ExternalURL"])
+
         updated_tool.visit(self.check_features)
 
         self.project_uuid = runtimeContext.project_uuid
index 4da545bf36b91c6f96ba3ec8657e3d0a2a4db265..d2dd6e8162e686355b6b4d5b076c54fad11c6637 100644 (file)
@@ -302,7 +302,7 @@ def stubs(func):
             'secret_mounts': {},
             'state': 'Committed',
             'command': ['arvados-cwl-runner', '--local', '--api=containers',
-                        '--no-log-timestamps', '--disable-validate',
+                        '--no-log-timestamps', '--disable-validate', '--disable-color',
                         '--eval-timeout=20', '--thread-count=1',
                         '--enable-reuse', "--collection-cache-size=256", '--debug', '--on-error=continue',
                         '/var/lib/cwl/workflow.json#main', '/var/lib/cwl/cwl.input.json'],
@@ -412,7 +412,7 @@ class TestSubmit(unittest.TestCase):
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = [
             'arvados-cwl-runner', '--local', '--api=containers',
-            '--no-log-timestamps', '--disable-validate',
+            '--no-log-timestamps', '--disable-validate', '--disable-color',
             '--eval-timeout=20', '--thread-count=1',
             '--disable-reuse', "--collection-cache-size=256",
             '--debug', '--on-error=continue',
@@ -436,7 +436,7 @@ class TestSubmit(unittest.TestCase):
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = [
             'arvados-cwl-runner', '--local', '--api=containers',
-            '--no-log-timestamps', '--disable-validate',
+            '--no-log-timestamps', '--disable-validate', '--disable-color',
             '--eval-timeout=20', '--thread-count=1',
             '--disable-reuse', "--collection-cache-size=256", '--debug', '--on-error=continue',
             '/var/lib/cwl/workflow.json#main', '/var/lib/cwl/cwl.input.json']
@@ -468,7 +468,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        '--debug', '--on-error=stop',
@@ -491,7 +491,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        "--output-name="+output_name, '--debug', '--on-error=continue',
@@ -513,7 +513,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256", "--debug",
                                        "--storage-classes=foo", '--on-error=continue',
@@ -576,7 +576,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256", '--debug',
                                        '--on-error=continue',
@@ -599,7 +599,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        '--debug', '--on-error=continue',
@@ -623,7 +623,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        "--output-tags="+output_tags, '--debug', '--on-error=continue',
@@ -700,7 +700,7 @@ class TestSubmit(unittest.TestCase):
             'name': 'expect_arvworkflow.cwl#main',
             'container_image': '999999999999999999999999999999d3+99',
             'command': ['arvados-cwl-runner', '--local', '--api=containers',
-                        '--no-log-timestamps', '--disable-validate',
+                        '--no-log-timestamps', '--disable-validate', '--disable-color',
                         '--eval-timeout=20', '--thread-count=1',
                         '--enable-reuse', "--collection-cache-size=256", '--debug', '--on-error=continue',
                         '/var/lib/cwl/workflow/expect_arvworkflow.cwl#main', '/var/lib/cwl/cwl.input.json'],
@@ -795,7 +795,7 @@ class TestSubmit(unittest.TestCase):
             'name': 'a test workflow',
             'container_image': "999999999999999999999999999999d3+99",
             'command': ['arvados-cwl-runner', '--local', '--api=containers',
-                        '--no-log-timestamps', '--disable-validate',
+                        '--no-log-timestamps', '--disable-validate', '--disable-color',
                         '--eval-timeout=20', '--thread-count=1',
                         '--enable-reuse', "--collection-cache-size=256", '--debug', '--on-error=continue',
                         '/var/lib/cwl/workflow.json#main', '/var/lib/cwl/cwl.input.json'],
@@ -859,7 +859,7 @@ class TestSubmit(unittest.TestCase):
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["owner_uuid"] = project_uuid
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        "--eval-timeout=20", "--thread-count=1",
                                        '--enable-reuse', "--collection-cache-size=256", '--debug',
                                        '--on-error=continue',
@@ -881,7 +881,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=60.0', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        '--debug', '--on-error=continue',
@@ -902,7 +902,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=1',
                                        '--enable-reuse', "--collection-cache-size=500",
                                        '--debug', '--on-error=continue',
@@ -924,7 +924,7 @@ class TestSubmit(unittest.TestCase):
 
         expect_container = copy.deepcopy(stubs.expect_container_spec)
         expect_container["command"] = ['arvados-cwl-runner', '--local', '--api=containers',
-                                       '--no-log-timestamps', '--disable-validate',
+                                       '--no-log-timestamps', '--disable-validate', '--disable-color',
                                        '--eval-timeout=20', '--thread-count=20',
                                        '--enable-reuse', "--collection-cache-size=256",
                                        '--debug', '--on-error=continue',
@@ -994,7 +994,7 @@ class TestSubmit(unittest.TestCase):
             "arv": "http://arvados.org/cwl#",
         }
         expect_container['command'] = ['arvados-cwl-runner', '--local', '--api=containers',
-                        '--no-log-timestamps', '--disable-validate',
+                        '--no-log-timestamps', '--disable-validate', '--disable-color',
                         '--eval-timeout=20', '--thread-count=1',
                         '--enable-reuse', "--collection-cache-size=512", '--debug', '--on-error=continue',
                         '/var/lib/cwl/workflow.json#main', '/var/lib/cwl/cwl.input.json']
@@ -1059,6 +1059,7 @@ class TestSubmit(unittest.TestCase):
                 "--api=containers",
                 "--no-log-timestamps",
                 "--disable-validate",
+                "--disable-color",
                 "--eval-timeout=20",
                 '--thread-count=1',
                 "--enable-reuse",
index dd067e9778c790ee09dcb63c6c8665ac1addfd1d..f7719dbc4335048663e5195edaf791caa05dee8e 100644 (file)
 #  of the docker build root.)
 
 FROM debian:9
-MAINTAINER Ward Vandewege <ward@curoverse.com>
+MAINTAINER Peter Amstutz <peter.amstutz@curii.com>
 
 ENV DEBIAN_FRONTEND noninteractive
 
-ARG pythoncmd=python
-ARG pipcmd=pip
+ARG pythoncmd=python3
+ARG pipcmd=pip3
 
 RUN apt-get update -q && apt-get install -qy --no-install-recommends \
     git ${pythoncmd}-pip ${pythoncmd}-virtualenv ${pythoncmd}-dev libcurl4-gnutls-dev \
index 394e30a737e2aff13128df90d96decfc12428863..00438bf340a36851ff48262d6df998ce9407f112 100644 (file)
@@ -219,6 +219,7 @@ type Cluster struct {
                UserNotifierEmailFrom                 string
                UserProfileNotificationAddress        string
                PreferDomainForUsername               string
+               UserSetupMailText                     string
        }
        Volumes   map[string]Volume
        Workbench struct {
index 5e57fed3beab3281b1d498936edb4eed813398ec..aa75fee7c4d0f5bf47826d12300b51cdcf08a424 100644 (file)
@@ -598,9 +598,8 @@ func (fs *fileSystem) remove(name string, recursive bool) error {
 func (fs *fileSystem) Sync() error {
        if syncer, ok := fs.root.(syncer); ok {
                return syncer.Sync()
-       } else {
-               return ErrInvalidOperation
        }
+       return ErrInvalidOperation
 }
 
 func (fs *fileSystem) Flush(string, bool) error {
index 060b57b493cbf555d4d87d9b71db4f6171ff85b8..d4429f5d72026bbfe9cfb142a9b33e21429ed074 100644 (file)
@@ -109,16 +109,15 @@ func (fs *collectionFileSystem) newNode(name string, perm os.FileMode, modTime t
                                inodes: make(map[string]inode),
                        },
                }, nil
-       } else {
-               return &filenode{
-                       fs: fs,
-                       fileinfo: fileinfo{
-                               name:    name,
-                               mode:    perm & ^os.ModeDir,
-                               modTime: modTime,
-                       },
-               }, nil
        }
+       return &filenode{
+               fs: fs,
+               fileinfo: fileinfo{
+                       name:    name,
+                       mode:    perm & ^os.ModeDir,
+                       modTime: modTime,
+               },
+       }, nil
 }
 
 func (fs *collectionFileSystem) Child(name string, replace func(inode) (inode, error)) (inode, error) {
@@ -802,9 +801,8 @@ func (dn *dirnode) commitBlock(ctx context.Context, refs []fnSegmentRef, bufsize
        }()
        if sync {
                return <-errs
-       } else {
-               return nil
        }
+       return nil
 }
 
 type flushOpts struct {
index 667a30f5ef669ac50c06e0756c4a30ecbde3e025..214021598641a057aafbfa15c0f74f5720878d00 100644 (file)
@@ -26,9 +26,8 @@ func SaltToken(token, remote string) (string, error) {
        if len(parts) < 3 || parts[0] != "v2" {
                if reObsoleteToken.MatchString(token) {
                        return "", ErrObsoleteToken
-               } else {
-                       return "", ErrTokenFormat
                }
+               return "", ErrTokenFormat
        }
        uuid := parts[1]
        secret := parts[2]
index c9f6a0b675b17b6de869198008054793bae7f141..097e292d386bc540b1955d37ce1506afbef3e933 100644 (file)
@@ -81,9 +81,8 @@ func (s *Suite) TestPingOverride(c *check.C) {
                                ok = !ok
                                if ok {
                                        return nil
-                               } else {
-                                       return errors.New("good error")
                                }
+                               return errors.New("good error")
                        },
                },
        }
index 59981e3e55265be4eed1827d3570391533ac3a30..5336488df0508039e968d9434cae343f66b26c63 100644 (file)
@@ -64,9 +64,8 @@ func rewrapResponseWriter(w http.ResponseWriter, wrapped http.ResponseWriter) ht
                        http.ResponseWriter
                        http.Hijacker
                }{w, hijacker}
-       } else {
-               return w
        }
+       return w
 }
 
 func Logger(req *http.Request) logrus.FieldLogger {
index b18d7e046404c34b0f1486aadfb667a2fe1e01d7..13f8f957714e984a4ef1d933cd1b901e64fd7a77 100644 (file)
@@ -290,10 +290,9 @@ func (kc *KeepClient) getOrHead(method string, locator string, header http.Heade
                                        Hash:   md5.New(),
                                        Check:  locator[0:32],
                                }, expectLength, url, resp.Header, nil
-                       } else {
-                               resp.Body.Close()
-                               return nil, expectLength, url, resp.Header, nil
                        }
+                       resp.Body.Close()
+                       return nil, expectLength, url, resp.Header, nil
                }
                serversToTry = retryList
        }
index a45775470a0ca49a731ba839803eb8b5f43be124..1e64eeb1dafd06105a5eef02e0737ddfab3ed597 100644 (file)
@@ -236,7 +236,7 @@ def uploadfiles(files, api, dry_run=False, num_retries=0,
             # empty collection
             pdh = collection.portable_data_hash()
             assert (pdh == config.EMPTY_BLOCK_LOCATOR), "Empty collection portable_data_hash did not have expected locator, was %s" % pdh
-            logger.info("Using empty collection %s", pdh)
+            logger.debug("Using empty collection %s", pdh)
 
     for c in files:
         c.keepref = "%s/%s" % (pdh, c.fn)
index 81b9ca9e5bec3d74c5b524cb351752845017b1e7..656bd37ae6e3cf7e53bae89eac6e1b6086257d33 100644 (file)
@@ -56,11 +56,19 @@ class Arvados::V1::CollectionsController < ApplicationController
   end
 
   def find_object_by_uuid
-    @include_old_versions = true
+    if params[:include_old_versions].nil?
+      @include_old_versions = true
+    else
+      @include_old_versions = params[:include_old_versions]
+    end
 
     if loc = Keep::Locator.parse(params[:id])
       loc.strip_hints!
 
+      opts = {}
+      opts.update({include_trash: true}) if params[:include_trash]
+      opts.update({include_old_versions: @include_old_versions})
+
       # It matters which Collection object we pick because we use it to get signed_manifest_text,
       # the value of which is affected by the value of trash_at.
       #
@@ -72,14 +80,13 @@ class Arvados::V1::CollectionsController < ApplicationController
       # it will select the Collection object with the longest
       # available lifetime.
 
-      if c = Collection.readable_by(*@read_users).where({ portable_data_hash: loc.to_s }).order("trash_at desc").limit(1).first
+      if c = Collection.readable_by(*@read_users, opts).where({ portable_data_hash: loc.to_s }).order("trash_at desc").limit(1).first
         @object = {
           uuid: c.portable_data_hash,
           portable_data_hash: c.portable_data_hash,
           manifest_text: c.signed_manifest_text,
         }
       end
-      true
     else
       super
     end
index cd23706d08140f2176fccb063ed5b4070202536a..76e8da0c72b306c7fc33612f5c345d866624c1fa 100644 (file)
@@ -135,7 +135,7 @@ class Arvados::V1::UsersController < ApplicationController
                               vm_uuid: params[:vm_uuid])
 
     # setup succeeded. send email to user
-    if params[:send_notification_email]
+    if params[:send_notification_email] && !Rails.configuration.Users.UserSetupMailText.empty?
       begin
         UserNotifier.account_is_setup(@object).deliver_now
       rescue => e
index 709b4b4d1c1304e456c494a4079ca2ea0cccc8fb..3966b7c3939edc31cdc4490b27285a565da0a84a 100644 (file)
@@ -627,7 +627,12 @@ class ArvadosModel < ApplicationRecord
   end
 
   def permission_to_destroy
-    permission_to_update
+    if [system_user_uuid, system_group_uuid, anonymous_group_uuid,
+        anonymous_user_uuid, public_project_uuid].include? uuid
+      false
+    else
+      permission_to_update
+    end
   end
 
   def maybe_update_modified_by_fields
index d7c5e04dfd1b82e571a92079e3563523ec065376..67bd3d10d78975cd942a32acc7bb49306d31e0cc 100644 (file)
@@ -7,15 +7,18 @@ require 'update_permissions'
 class DatabaseSeeds
   extend CurrentApiClient
   def self.install
-    system_user
-    system_group
-    all_users_group
-    anonymous_group
-    anonymous_group_read_permission
-    anonymous_user
-    system_root_token_api_client
-    empty_collection
-    refresh_permissions
+    batch_update_permissions do
+      system_user
+      system_group
+      all_users_group
+      anonymous_group
+      anonymous_group_read_permission
+      anonymous_user
+      system_root_token_api_client
+      public_project_group
+      public_project_read_permission
+      empty_collection
+    end
     refresh_trashed
   end
 end
index 50d164bfa1e8493cef0b9d733062f6cfb4c8fbb6..352ee7754e1e6855c1b2ffc946dad5c24d0962fe 100644 (file)
@@ -2,17 +2,4 @@
 
 SPDX-License-Identifier: AGPL-3.0 %>
 
-<% if not @user.full_name.empty? -%>
-<%= @user.full_name %>,
-<% else -%>
-Hi there,
-<% end -%>
-
-Your Arvados shell account has been set up. Please visit the virtual machines page <% if Rails.configuration.Services.Workbench1.ExternalURL %>at
-
-  <%= Rails.configuration.Services.Workbench1.ExternalURL %><%= "/" if !Rails.configuration.Services.Workbench1.ExternalURL.to_s.end_with?("/") %>users/<%= @user.uuid%>/virtual_machines <% else %><% end %>
-
-for connection instructions.
-
-Thanks,
-The Arvados team.
+<%= ERB.new(Rails.configuration.Users.UserSetupMailText, 0, "-").result(binding) %>
diff --git a/services/api/db/migrate/20200914203202_public_favorites_project.rb b/services/api/db/migrate/20200914203202_public_favorites_project.rb
new file mode 100644 (file)
index 0000000..ef139aa
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+class PublicFavoritesProject < ActiveRecord::Migration[5.2]
+  include CurrentApiClient
+  def up
+    act_as_system_user do
+      public_project_group
+      public_project_read_permission
+      Link.where(link_class: "star",
+                 owner_uuid: system_user_uuid,
+                 tail_uuid: all_users_group_uuid).each do |ln|
+        ln.owner_uuid = public_project_uuid
+        ln.tail_uuid = public_project_uuid
+        ln.save!
+      end
+    end
+  end
+
+  def down
+  end
+end
index 83987d051859843a8df981cf539f8514daecc15b..a5740834c7a1c2646a83c59b6da9d40e3ef7684b 100644 (file)
@@ -3197,6 +3197,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('20190809135453'),
 ('20190905151603'),
 ('20200501150153'),
-('20200602141328');
+('20200602141328'),
+('20200914203202');
 
 
index cfdae0bddec58455daf0d791b7a7731dd98e6e8b..dc40f158eeaef6fb4fb21cc7d3d8dad04c28f917 100644 (file)
@@ -9,6 +9,8 @@ $anonymous_user = nil
 $anonymous_group = nil
 $anonymous_group_read_permission = nil
 $empty_collection = nil
+$public_project_group = nil
+$public_project_group_read_permission = nil
 
 module CurrentApiClient
   def current_user
@@ -65,6 +67,12 @@ module CurrentApiClient
      'anonymouspublic'].join('-')
   end
 
+  def public_project_uuid
+    [Rails.configuration.ClusterID,
+     Group.uuid_prefix,
+     'publicfavorites'].join('-')
+  end
+
   def system_user
     $system_user = check_cache $system_user do
       real_current_user = Thread.current[:user]
@@ -189,6 +197,31 @@ module CurrentApiClient
     end
   end
 
+  def public_project_group
+    $public_project_group = check_cache $public_project_group do
+      act_as_system_user do
+        ActiveRecord::Base.transaction do
+          Group.where(uuid: public_project_uuid).
+            first_or_create!(group_class: "project",
+                             name: "Public favorites",
+                             description: "Public favorites")
+        end
+      end
+    end
+  end
+
+  def public_project_read_permission
+    $public_project_group_read_permission =
+        check_cache $public_project_group_read_permission do
+      act_as_system_user do
+        Link.where(tail_uuid: anonymous_group.uuid,
+                   head_uuid: public_project_group.uuid,
+                   link_class: "permission",
+                   name: "can_read").first_or_create!
+      end
+    end
+  end
+
   def system_root_token_api_client
     $system_root_token_api_client = check_cache $system_root_token_api_client do
       act_as_system_user do
index ee0d786bbe2f1537a9ef904df51eba7f221eea75..31a72f17208090a9b210996b4c34379e95116aa1 100644 (file)
@@ -56,6 +56,13 @@ system_group:
   description: System-owned Group
   group_class: role
 
+public_favorites_project:
+  uuid: zzzzz-j7d0g-publicfavorites
+  owner_uuid: zzzzz-tpzed-000000000000000
+  name: Public favorites
+  description: Public favorites
+  group_class: project
+
 empty_lonely_group:
   uuid: zzzzz-j7d0g-jtp06ulmvsezgyu
   owner_uuid: zzzzz-tpzed-000000000000000
index ee5dcd3421a9a0bbfd9e2a72be03fc9304fec21f..b7f1aaa1faff4fdf6897fb964567c75407daa9d3 100644 (file)
@@ -1125,3 +1125,17 @@ active_manages_viewing_group:
   name: can_manage
   head_uuid: zzzzz-j7d0g-futrprojviewgrp
   properties: {}
+
+public_favorites_permission_link:
+  uuid: zzzzz-o0j2j-testpublicfavor
+  owner_uuid: zzzzz-tpzed-000000000000000
+  created_at: 2014-01-24 20:42:26 -0800
+  modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
+  modified_by_user_uuid: zzzzz-tpzed-000000000000000
+  modified_at: 2014-01-24 20:42:26 -0800
+  updated_at: 2014-01-24 20:42:26 -0800
+  tail_uuid: zzzzz-j7d0g-anonymouspublic
+  link_class: permission
+  name: can_read
+  head_uuid: zzzzz-j7d0g-publicfavorites
+  properties: {}
index 0785c12a50884f37a021e0c60582b95bc7b00ae8..25f1efff62c8f71246749a3b3c189d297eb7ed82 100644 (file)
@@ -4,51 +4,56 @@
 
 noop: # nothing happened ...to the 'spectator' user
   id: 1
-  uuid: zzzzz-xxxxx-pshmckwoma9plh7
+  uuid: zzzzz-57u5n-pshmckwoma9plh7
   owner_uuid: zzzzz-tpzed-000000000000000
   object_uuid: zzzzz-tpzed-l1s2piq4t4mps8r
   object_owner_uuid: zzzzz-tpzed-000000000000000
   event_at: <%= 1.minute.ago.to_s(:db) %>
+  created_at: <%= 1.minute.ago.to_s(:db) %>
 
 admin_changes_repository2: # admin changes repository2, which is owned by active user
   id: 2
-  uuid: zzzzz-xxxxx-pshmckwoma00002
+  uuid: zzzzz-57u5n-pshmckwoma00002
   owner_uuid: zzzzz-tpzed-d9tiejq69daie8f # admin user
   object_uuid: zzzzz-2x53u-382brsig8rp3667 # repository foo
   object_owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz # active user
+  created_at: <%= 2.minute.ago.to_s(:db) %>
   event_at: <%= 2.minute.ago.to_s(:db) %>
   event_type: update
 
 admin_changes_specimen: # admin changes specimen owned_by_spectator
   id: 3
-  uuid: zzzzz-xxxxx-pshmckwoma00003
+  uuid: zzzzz-57u5n-pshmckwoma00003
   owner_uuid: zzzzz-tpzed-d9tiejq69daie8f # admin user
   object_uuid: zzzzz-2x53u-3b0xxwzlbzxq5yr # specimen owned_by_spectator
   object_owner_uuid: zzzzz-tpzed-l1s2piq4t4mps8r # spectator user
+  created_at: <%= 3.minute.ago.to_s(:db) %>
   event_at: <%= 3.minute.ago.to_s(:db) %>
   event_type: update
 
 system_adds_foo_file: # foo collection added, readable by active through link
   id: 4
-  uuid: zzzzz-xxxxx-pshmckwoma00004
+  uuid: zzzzz-57u5n-pshmckwoma00004
   owner_uuid: zzzzz-tpzed-000000000000000 # system user
   object_uuid: zzzzz-4zz18-znfnqtbbv4spc3w # foo file
   object_owner_uuid: zzzzz-tpzed-000000000000000 # system user
+  created_at: <%= 4.minute.ago.to_s(:db) %>
   event_at: <%= 4.minute.ago.to_s(:db) %>
   event_type: create
 
 system_adds_baz: # baz collection added, readable by active and spectator through group 'all users' group membership
   id: 5
-  uuid: zzzzz-xxxxx-pshmckwoma00005
+  uuid: zzzzz-57u5n-pshmckwoma00005
   owner_uuid: zzzzz-tpzed-000000000000000 # system user
   object_uuid: zzzzz-4zz18-y9vne9npefyxh8g # baz file
   object_owner_uuid: zzzzz-tpzed-000000000000000 # system user
+  created_at: <%= 5.minute.ago.to_s(:db) %>
   event_at: <%= 5.minute.ago.to_s(:db) %>
   event_type: create
 
 log_owned_by_active:
   id: 6
-  uuid: zzzzz-xxxxx-pshmckwoma12345
+  uuid: zzzzz-57u5n-pshmckwoma12345
   owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz # active user
   object_uuid: zzzzz-2x53u-382brsig8rp3667 # repository foo
   object_owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz # active user
index d8017881d5dd151029485066833ff7ab651eea0c..c025394bc1f33616684be72861862126642d95c4 100644 (file)
@@ -1388,6 +1388,16 @@ EOS
                   json_response['name']
   end
 
+  test 'can get old version collection by PDH' do
+    authorize_with :active
+    get :show, params: {
+      id: collections(:collection_owned_by_active_past_version_1).portable_data_hash,
+    }
+    assert_response :success
+    assert_equal collections(:collection_owned_by_active_past_version_1).portable_data_hash,
+                  json_response['portable_data_hash']
+  end
+
   test 'version and current_version_uuid are ignored at creation time' do
     permit_unsigned_manifests
     authorize_with :active
index ea5d5b1436bd256506cc1c23061dfd81eb8a763f..e0f7b8970dfd34f2a161a75336ef4a3bc964acd1 100644 (file)
@@ -609,6 +609,23 @@ class Arvados::V1::UsersControllerTest < ActionController::TestCase
   test "setup user with send notification param true and verify email" do
     authorize_with :admin
 
+    Rails.configuration.Users.UserSetupMailText = %{
+<% if not @user.full_name.empty? -%>
+<%= @user.full_name %>,
+<% else -%>
+Hi there,
+<% end -%>
+
+Your Arvados shell account has been set up. Please visit the virtual machines page <% if Rails.configuration.Services.Workbench1.ExternalURL %>at
+
+<%= Rails.configuration.Services.Workbench1.ExternalURL %><%= "/" if !Rails.configuration.Services.Workbench1.ExternalURL.to_s.end_with?("/") %>users/<%= @user.uuid%>/virtual_machines <% else %><% end %>
+
+for connection instructions.
+
+Thanks,
+The Arvados team.
+}
+
     post :setup, params: {
       send_notification_email: 'true',
       user: {
index 58f0cddb709064ad2f8af9df6c20aa20f0c77d6a..76d78f9eaa6cf14ebd83b8b7b138e3f94c69dff5 100644 (file)
@@ -319,6 +319,7 @@ class LogTest < ActiveSupport::TestCase
 
   def assert_no_logs_deleted
     logs_before = Log.unscoped.all.count
+    assert logs_before > 0
     yield
     assert_equal logs_before, Log.unscoped.all.count
   end
@@ -350,34 +351,34 @@ class LogTest < ActiveSupport::TestCase
   # but 3 minutes suits our test data better (and is test-worthy in
   # that it's expected to work correctly in production).
   test 'delete old audit logs with production settings' do
-    initial_log_count = Log.unscoped.all.count
+    initial_log_count = remaining_audit_logs.count
+    assert initial_log_count > 0
     AuditLogs.delete_old(max_age: 180, max_batch: 100000)
     assert_operator remaining_audit_logs.count, :<, initial_log_count
   end
 
   test 'delete all audit logs in multiple batches' do
+    assert remaining_audit_logs.count > 2
     AuditLogs.delete_old(max_age: 0.00001, max_batch: 2)
     assert_equal [], remaining_audit_logs.collect(&:uuid)
   end
 
   test 'delete old audit logs in thread' do
-    begin
-      Rails.configuration.AuditLogs.MaxAge = 20
-      Rails.configuration.AuditLogs.MaxDeleteBatch = 100000
-      Rails.cache.delete 'AuditLogs'
-      initial_log_count = Log.unscoped.all.count + 1
-      act_as_system_user do
-        Log.create!()
-        initial_log_count += 1
-      end
-      deadline = Time.now + 10
-      while remaining_audit_logs.count == initial_log_count
-        if Time.now > deadline
-          raise "timed out"
-        end
-        sleep 0.1
+    Rails.configuration.AuditLogs.MaxAge = 20
+    Rails.configuration.AuditLogs.MaxDeleteBatch = 100000
+    Rails.cache.delete 'AuditLogs'
+    initial_audit_log_count = remaining_audit_logs.count
+    assert initial_audit_log_count > 0
+    act_as_system_user do
+      Log.create!()
+    end
+    deadline = Time.now + 10
+    while remaining_audit_logs.count == initial_audit_log_count
+      if Time.now > deadline
+        raise "timed out"
       end
-      assert_operator remaining_audit_logs.count, :<, initial_log_count
+      sleep 0.1
     end
+    assert_operator remaining_audit_logs.count, :<, initial_audit_log_count
   end
 end
index 10664474c68bf219a4cfb521a0431e97a21c5fdc..123031b35feb90b0fc874b0461fff896ca531702 100644 (file)
@@ -579,4 +579,24 @@ class PermissionTest < ActiveSupport::TestCase
     assert users(:active).can?(write: prj.uuid)
     assert users(:active).can?(manage: prj.uuid)
   end
+
+  [system_user_uuid, anonymous_user_uuid].each do |u|
+    test "cannot delete system user #{u}" do
+      act_as_system_user do
+        assert_raises ArvadosModel::PermissionDeniedError do
+          User.find_by_uuid(u).destroy
+        end
+      end
+    end
+  end
+
+  [system_group_uuid, anonymous_group_uuid, public_project_uuid].each do |g|
+    test "cannot delete system group #{g}" do
+      act_as_system_user do
+        assert_raises ArvadosModel::PermissionDeniedError do
+          Group.find_by_uuid(g).destroy
+        end
+      end
+    end
+  end
 end
index da6c7fdb88bc825c9918bb0dd92aa7c53a7b7aea..c288786c1323246c589af91aa53fc3d0aa37c557 100644 (file)
@@ -9,6 +9,24 @@ class UserNotifierTest < ActionMailer::TestCase
   # Send the email, then test that it got queued
   test "account is setup" do
     user = users :active
+
+    Rails.configuration.Users.UserSetupMailText = %{
+<% if not @user.full_name.empty? -%>
+<%= @user.full_name %>,
+<% else -%>
+Hi there,
+<% end -%>
+
+Your Arvados shell account has been set up. Please visit the virtual machines page <% if Rails.configuration.Services.Workbench1.ExternalURL %>at
+
+<%= Rails.configuration.Services.Workbench1.ExternalURL %><%= "/" if !Rails.configuration.Services.Workbench1.ExternalURL.to_s.end_with?("/") %>users/<%= @user.uuid%>/virtual_machines <% else %><% end %>
+
+for connection instructions.
+
+Thanks,
+The Arvados team.
+}
+
     email = UserNotifier.account_is_setup user
 
     assert_not_nil email
index 5aee7e087b2658945b2eebe1f2f309d67c351d16..eae21e62b6c0a72787890fcda9f4b1f29b3d92b5 100644 (file)
@@ -23,8 +23,8 @@ type slurmJob struct {
        hitNiceLimit bool
 }
 
-// Squeue implements asynchronous polling monitor of the SLURM queue using the
-// command 'squeue'.
+// SqueueChecker implements asynchronous polling monitor of the SLURM queue
+// using the command 'squeue'.
 type SqueueChecker struct {
        Logger         logger
        Period         time.Duration
@@ -102,13 +102,12 @@ func (sqc *SqueueChecker) reniceAll() {
        sort.Slice(jobs, func(i, j int) bool {
                if jobs[i].wantPriority != jobs[j].wantPriority {
                        return jobs[i].wantPriority > jobs[j].wantPriority
-               } else {
-                       // break ties with container uuid --
-                       // otherwise, the ordering would change from
-                       // one interval to the next, and we'd do many
-                       // pointless slurm queue rearrangements.
-                       return jobs[i].uuid > jobs[j].uuid
                }
+               // break ties with container uuid --
+               // otherwise, the ordering would change from
+               // one interval to the next, and we'd do many
+               // pointless slurm queue rearrangements.
+               return jobs[i].uuid > jobs[j].uuid
        })
        renice := wantNice(jobs, sqc.PrioritySpread)
        for i, job := range jobs {
index 52cfede46642120dce520868d2d38758fb97cc12..7cd1b1a896e3fa56eaa60db2f5d4851ac9430b39 100644 (file)
@@ -363,6 +363,8 @@ func (h *handler) s3list(w http.ResponseWriter, r *http.Request, fs arvados.Cust
                // github.com/aws/aws-sdk-net never terminates its
                // paging loop).
                NextMarker string `xml:"NextMarker,omitempty"`
+               // ListObjectsV2 has a KeyCount response field.
+               KeyCount int
        }
        resp := listResp{
                ListResp: s3.ListResp{
@@ -459,6 +461,7 @@ func (h *handler) s3list(w http.ResponseWriter, r *http.Request, fs arvados.Cust
                }
                sort.Slice(resp.CommonPrefixes, func(i, j int) bool { return resp.CommonPrefixes[i].Prefix < resp.CommonPrefixes[j].Prefix })
        }
+       resp.KeyCount = len(resp.Contents)
        w.Header().Set("Content-Type", "application/xml")
        io.WriteString(w, xml.Header)
        if err := xml.NewEncoder(w).Encode(resp); err != nil {
index 66f046b13f14674c35bc783351eb9a0bf5f1b64b..33e978c3b7acec6e196e06db884bd6e519eb8964 100644 (file)
@@ -432,6 +432,22 @@ func (s *IntegrationSuite) TestS3ListNoNextMarker(c *check.C) {
        }
 }
 
+// List response should include KeyCount field.
+func (s *IntegrationSuite) TestS3ListKeyCount(c *check.C) {
+       stage := s.s3setup(c)
+       defer stage.teardown(c)
+
+       req, err := http.NewRequest("GET", stage.collbucket.URL("/"), nil)
+       c.Assert(err, check.IsNil)
+       req.Header.Set("Authorization", "AWS "+arvadostest.ActiveTokenV2+":none")
+       req.URL.RawQuery = "prefix=&delimiter=/"
+       resp, err := http.DefaultClient.Do(req)
+       c.Assert(err, check.IsNil)
+       buf, err := ioutil.ReadAll(resp.Body)
+       c.Assert(err, check.IsNil)
+       c.Check(string(buf), check.Matches, `(?ms).*<KeyCount>2</KeyCount>.*`)
+}
+
 func (s *IntegrationSuite) TestS3CollectionList(c *check.C) {
        stage := s.s3setup(c)
        defer stage.teardown(c)
index b4ccd98282a5de1966f9c32a9a0926c92f79bf81..670fa1a4140fc14229279d1ff920d76959679afd 100644 (file)
@@ -80,7 +80,7 @@ func (h *handler) pullItemAndProcess(pullRequest PullRequest) error {
        return writePulledBlock(h.volmgr, vol, readContent, pullRequest.Locator)
 }
 
-// Fetch the content for the given locator using keepclient.
+// GetContent fetches the content for the given locator using keepclient.
 var GetContent = func(signedLocator string, keepClient *keepclient.KeepClient) (io.ReadCloser, int64, string, error) {
        return keepClient.Get(signedLocator)
 }
@@ -88,8 +88,7 @@ var GetContent = func(signedLocator string, keepClient *keepclient.KeepClient) (
 var writePulledBlock = func(volmgr *RRVolumeManager, volume Volume, data []byte, locator string) error {
        if volume != nil {
                return volume.Put(context.Background(), locator, data)
-       } else {
-               _, err := PutBlock(context.Background(), volmgr, data, locator)
-               return err
        }
+       _, err := PutBlock(context.Background(), volmgr, data, locator)
+       return err
 }
index d07d23c3c219c630f61881bf75df1d233f0b67a6..8d999e7472ff14f03985e80a2b774632eebe7346 100644 (file)
@@ -33,7 +33,7 @@ import (
        "github.com/sirupsen/logrus"
 )
 
-// S3Volume implements Volume using an S3 bucket.
+// S3AWSVolume implements Volume using an S3 bucket.
 type S3AWSVolume struct {
        arvados.S3VolumeDriverParameters
        AuthToken      string    // populated automatically when IAMRole is used
@@ -69,10 +69,9 @@ func chooseS3VolumeDriver(cluster *arvados.Cluster, volume arvados.Volume, logge
        if v.UseAWSS3v2Driver {
                logger.Debugln("Using AWS S3 v2 driver")
                return newS3AWSVolume(cluster, volume, logger, metrics)
-       } else {
-               logger.Debugln("Using goamz S3 driver")
-               return newS3Volume(cluster, volume, logger, metrics)
        }
+       logger.Debugln("Using goamz S3 driver")
+       return newS3Volume(cluster, volume, logger, metrics)
 }
 
 const (