[arvados] created: 2.6.0-10-g430ba41e3

git repository hosting git at public.arvados.org
Thu Apr 13 15:12:39 UTC 2023


        at  430ba41e3d979b82630c7aa41f00014439a7bb48 (commit)


commit 430ba41e3d979b82630c7aa41f00014439a7bb48
Author: Brett Smith <brett.smith at curii.com>
Date:   Thu Apr 13 10:51:46 2023 -0400

    18799: Add background to API docstrings
    
    These explanations are intended to help orient users reading this
    documentation module (whether via Pydoc or the web) to understand how it
    relates to the API client object and the dictionaries it returns.
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/discovery2pydoc.py b/sdk/python/discovery2pydoc.py
index 4f74d8836..889ee9329 100755
--- a/sdk/python/discovery2pydoc.py
+++ b/sdk/python/discovery2pydoc.py
@@ -68,6 +68,31 @@ _DEPRECATED_SCHEMAS = frozenset([
     *(f'{name[:-1]}List' for name in _DEPRECATED_RESOURCES),
 ])
 
+_LIST_PYDOC = '''
+
+This is the dictionary object returned when you call `{cls_name}s.list`.
+If you just want to iterate all objects that match your search criteria,
+consider using `arvados.util.keyset_list_all`.
+If you work with this raw object, the keys of the dictionary are documented
+below, along with their types. The `items` key maps to a list of matching
+`{cls_name}` objects.
+'''
+_MODULE_PYDOC = '''Arvados API client documentation skeleton
+
+This module documents the methods and return types provided by the Arvados API
+client. Start with `ArvadosAPIClient`, which documents the methods available
+from the API client objects constructed by `arvados.api`. The implementation is
+generated dynamically at runtime when the client object is built.
+'''
+_SCHEMA_PYDOC = '''
+
+This is the dictionary object that represents a single {cls_name} in Arvados.
+The keys of the dictionary are documented below, along with their types.
+Not every key may appear in every dictionary returned by an API call.
+Refer to the API documentation for details about how to retrieve specific keys
+if you need them.
+'''
+
 _TYPE_MAP = {
     # Map the API's JavaScript-based type names to Python annotations.
     # Some of these may disappear after Arvados issue #19795 is fixed.
@@ -205,6 +230,13 @@ def document_schema(name: str, spec: Mapping[str, Any]) -> str:
     description = spec['description']
     if name in _DEPRECATED_SCHEMAS:
         description += _DEPRECATED_NOTICE
+    if name.endswith('List'):
+        desc_fmt = _LIST_PYDOC
+        cls_name = name[:-4]
+    else:
+        desc_fmt = _SCHEMA_PYDOC
+        cls_name = name
+    description += desc_fmt.format(cls_name=cls_name)
     lines = [
         f"class {name}(TypedDict, total=False):",
         to_docstring(description, 4),
@@ -292,7 +324,11 @@ def main(arglist: Optional[Sequence[str]]=None) -> int:
             )
             return os.EX_IOERR
         discovery_document = json.load(discovery_file)
-    print('''from typing import Any, TypedDict''', file=args.out_file)
+    print(
+        to_docstring(_MODULE_PYDOC, indent=0),
+        '''from typing import Any, TypedDict''',
+        sep='\n\n', end='\n\n', file=args.out_file,
+    )
 
     schemas = sorted(discovery_document['schemas'].items())
     for name, schema_spec in schemas:

commit 06d8ba5b386ebffe6c86762fb7f799325407a6c1
Author: Brett Smith <brett.smith at curii.com>
Date:   Thu Apr 13 10:07:05 2023 -0400

    18799: Build Python SDK before generating web documentation
    
    This gives preprocessing steps like discovery2pydoc a chance to run.
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/doc/Rakefile b/doc/Rakefile
index 1390aa0e9..676f2845c 100644
--- a/doc/Rakefile
+++ b/doc/Rakefile
@@ -56,8 +56,10 @@ file "sdk/python/arvados/index.html" do |t|
   end
   `which pdoc`
   if $? == 0
-    STDERR.puts `pdoc --html -o sdk/python ../sdk/python/arvados/ 2>&1`
-    raise if $? != 0
+    raise unless system("python3", "setup.py", "build",
+                        chdir: "../sdk/python", out: :err)
+    raise unless system("pdoc", "--html", "-o", "sdk/python", "../sdk/python/build/lib/arvados/",
+                        out: :err)
   else
     puts "Warning: pdoc3 not found, Python documentation will not be generated".colorize(:light_red)
   end

commit 903995cd2fdfd506ee8cac2e4eae0c04f56a2b2e
Author: Brett Smith <brett.smith at curii.com>
Date:   Thu Apr 13 09:56:27 2023 -0400

    18799: Run discovery2pydoc as part of SDK build
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/setup.py b/sdk/python/setup.py
index 1c65c4ced..b03b650d6 100644
--- a/sdk/python/setup.py
+++ b/sdk/python/setup.py
@@ -4,10 +4,13 @@
 # SPDX-License-Identifier: Apache-2.0
 
 from __future__ import absolute_import
+import distutils.command.build
 import os
+import setuptools
 import sys
 import re
 
+from pathlib import Path
 from setuptools import setup, find_packages
 
 SETUP_DIR = os.path.dirname(__file__) or '.'
@@ -21,6 +24,77 @@ if '--short-tests-only' in sys.argv:
     short_tests_only = True
     sys.argv.remove('--short-tests-only')
 
+class BuildDiscoveryPydoc(setuptools.Command):
+    """Run discovery2pydoc as part of the build process
+
+    This class implements a setuptools subcommand, so it follows
+    [the SubCommand protocol][1]. Most of these methods are required by that
+    protocol, except `should_run`, which we register as the subcommand
+    predicate.
+
+    [1]: https://setuptools.pypa.io/en/latest/userguide/extension.html#setuptools.command.build.SubCommand
+    """
+    DEFAULT_JSON_PATH = Path(SETUP_DIR, '..', '..', 'doc', 'arvados-v1-discovery.json')
+    DEFAULT_OUTPUT_PATH = Path('arvados', 'api_resources.py')
+    NAME = 'discovery2pydoc'
+    description = "build skeleton Python from the Arvados discovery document"
+    editable_mode = False
+    user_options = [
+        ('discovery-json=', 'J', 'JSON discovery document used to build pydoc'),
+        ('discovery-output=', 'O', 'relative path to write discovery document pydoc'),
+    ]
+
+    def initialize_options(self):
+        self.build_lib = None
+        self.discovery_json = None
+        self.discovery_output = str(self.DEFAULT_OUTPUT_PATH)
+
+    def finalize_options(self):
+        # Set self.build_lib to match whatever the build_py subcommand uses.
+        self.set_undefined_options('build_py', ('build_lib', 'build_lib'))
+        if self.discovery_json is None and self.DEFAULT_JSON_PATH.exists():
+            self.discovery_json = str(self.DEFAULT_JSON_PATH)
+        out_path = Path(self.discovery_output)
+        if out_path.is_absolute():
+            raise Exception("--discovery-output should be a relative path")
+        else:
+            self.out_path = Path(self.build_lib, out_path)
+
+    def run(self):
+        import discovery2pydoc
+        self.mkpath(str(self.out_path.parent))
+        arglist = ['--output-file', str(self.out_path)]
+        if self.discovery_json is None:
+            print(
+                "warning: trying to load a live discovery document from configuration",
+                file=sys.stderr,
+            )
+        else:
+            arglist.append(self.discovery_json)
+        returncode = discovery2pydoc.main(arglist)
+        if returncode != 0:
+            raise Exception(f"discovery2pydoc exited {returncode}")
+
+    def should_run(self):
+        return True
+
+    # The protocol docs say that get_outputs should list *all* outputs, while
+    # get_output_mapping maps get_source_files to output file paths. Since we
+    # are generating files from outside the source tree, we should just return
+    # our output, with the source file list and output mapping both empty.
+    def get_outputs(self):
+        return [str(self.out_path)]
+
+    def get_source_files(self):
+        return []
+
+    def get_output_mapping(self):
+        return {}
+# Run discovery2pydoc as the first subcommand of build.
+distutils.command.build.build.sub_commands.insert(
+    0, (BuildDiscoveryPydoc.NAME, BuildDiscoveryPydoc.should_run),
+)
+
 setup(name='arvados-python-client',
       version=version,
       description='Arvados client library',
@@ -30,6 +104,9 @@ setup(name='arvados-python-client',
       url="https://arvados.org",
       download_url="https://github.com/arvados/arvados.git",
       license='Apache 2.0',
+      cmdclass={
+          BuildDiscoveryPydoc.NAME: BuildDiscoveryPydoc,
+      },
       packages=find_packages(),
       scripts=[
           'bin/arv-copy',

commit 15582540d26d52d72bd363fb75842f3f1019fb20
Author: Brett Smith <brett.smith at curii.com>
Date:   Mon Apr 10 11:54:46 2023 -0400

    18799: Support relative path to discovery document
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/discovery2pydoc.py b/sdk/python/discovery2pydoc.py
index 617d545ac..4f74d8836 100755
--- a/sdk/python/discovery2pydoc.py
+++ b/sdk/python/discovery2pydoc.py
@@ -275,7 +275,7 @@ If not provided, retrieved dynamically from Arvados client configuration.
     else:
         parts = urllib.parse.urlsplit(args.discovery_url)
         if not (parts.scheme or parts.netloc):
-            args.discovery_url = urllib.parse.urlunsplit(parts._replace(scheme='file'))
+            args.discovery_url = pathlib.Path(args.discovery_url).resolve().as_uri()
     if args.output_file == STDSTREAM_PATH:
         args.out_file = sys.stdout
     else:

commit 15ff8739b8ae8c89976a315da0cdfcdc2e302aa5
Author: Brett Smith <brett.smith at curii.com>
Date:   Mon Apr 10 11:51:06 2023 -0400

    18799: Commit canonical discovery document with check
    
    This copy of the discovery document can be used by our build process,
    e.g., to generate documentation. The integration test helps ensure it
    does not fall out of date.
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/doc/arvados-v1-discovery.json b/doc/arvados-v1-discovery.json
new file mode 100644
index 000000000..2fb9678c3
--- /dev/null
+++ b/doc/arvados-v1-discovery.json
@@ -0,0 +1,11395 @@
+{
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://api.arvados.org/auth/arvados": {
+          "description": "View and manage objects"
+        },
+        "https://api.arvados.org/auth/arvados.readonly": {
+          "description": "View objects"
+        }
+      }
+    }
+  },
+  "basePath": "/arvados/v1/",
+  "batchPath": "batch",
+  "description": "The API to interact with Arvados.",
+  "discoveryVersion": "v1",
+  "documentationLink": "http://doc.arvados.org/api/index.html",
+  "id": "arvados:v1",
+  "kind": "discovery#restDescription",
+  "name": "arvados",
+  "parameters": {
+    "alt": {
+      "type": "string",
+      "description": "Data format for the response.",
+      "default": "json",
+      "enum": [
+        "json"
+      ],
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json"
+      ],
+      "location": "query"
+    },
+    "fields": {
+      "type": "string",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "location": "query"
+    },
+    "key": {
+      "type": "string",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "location": "query"
+    },
+    "oauth_token": {
+      "type": "string",
+      "description": "OAuth 2.0 token for the current user.",
+      "location": "query"
+    }
+  },
+  "protocol": "rest",
+  "resources": {
+    "jobs": {
+      "methods": {
+        "get": {
+          "id": "arvados.jobs.get",
+          "path": "jobs/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Job's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Job in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.jobs.list",
+          "path": "jobs",
+          "httpMethod": "GET",
+          "description": "List Jobs.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Jobs. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#jobList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "JobList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.jobs.create",
+          "path": "jobs",
+          "httpMethod": "POST",
+          "description": "Create a new Job.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "find_or_create": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "minimum_script_version": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "exclude_script_versions": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "job": {
+                "$ref": "Job"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.jobs.update",
+          "path": "jobs/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Job.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Job in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "job": {
+                "$ref": "Job"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.jobs.delete",
+          "path": "jobs/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Job.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Job in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "queue": {
+          "id": "arvados.jobs.queue",
+          "path": "jobs/queue",
+          "httpMethod": "GET",
+          "description": "queue jobs",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "queue_size": {
+          "id": "arvados.jobs.queue_size",
+          "path": "jobs/queue_size",
+          "httpMethod": "GET",
+          "description": "queue_size jobs",
+          "parameters": {},
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "cancel": {
+          "id": "arvados.jobs.cancel",
+          "path": "jobs/{uuid}/cancel",
+          "httpMethod": "POST",
+          "description": "cancel jobs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "lock": {
+          "id": "arvados.jobs.lock",
+          "path": "jobs/{uuid}/lock",
+          "httpMethod": "POST",
+          "description": "lock jobs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.jobs.list",
+          "path": "jobs",
+          "httpMethod": "GET",
+          "description": "List Jobs.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Jobs. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#jobList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "JobList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.jobs.show",
+          "path": "jobs/{uuid}",
+          "httpMethod": "GET",
+          "description": "show jobs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.jobs.destroy",
+          "path": "jobs/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy jobs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Job"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "api_clients": {
+      "methods": {
+        "get": {
+          "id": "arvados.api_clients.get",
+          "path": "api_clients/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a ApiClient's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClient in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.api_clients.list",
+          "path": "api_clients",
+          "httpMethod": "GET",
+          "description": "List ApiClients.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ApiClients. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#apiClientList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.api_clients.create",
+          "path": "api_clients",
+          "httpMethod": "POST",
+          "description": "Create a new ApiClient.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "api_client": {
+                "$ref": "ApiClient"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.api_clients.update",
+          "path": "api_clients/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing ApiClient.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClient in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "api_client": {
+                "$ref": "ApiClient"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.api_clients.delete",
+          "path": "api_clients/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing ApiClient.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClient in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.api_clients.list",
+          "path": "api_clients",
+          "httpMethod": "GET",
+          "description": "List ApiClients.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ApiClients. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#apiClientList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.api_clients.show",
+          "path": "api_clients/{uuid}",
+          "httpMethod": "GET",
+          "description": "show api_clients",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.api_clients.destroy",
+          "path": "api_clients/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy api_clients",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ApiClient"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "api_client_authorizations": {
+      "methods": {
+        "get": {
+          "id": "arvados.api_client_authorizations.get",
+          "path": "api_client_authorizations/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a ApiClientAuthorization's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClientAuthorization in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.api_client_authorizations.list",
+          "path": "api_client_authorizations",
+          "httpMethod": "GET",
+          "description": "List ApiClientAuthorizations.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ApiClientAuthorizations. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#apiClientAuthorizationList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorizationList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.api_client_authorizations.create",
+          "path": "api_client_authorizations",
+          "httpMethod": "POST",
+          "description": "Create a new ApiClientAuthorization.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "api_client_authorization": {
+                "$ref": "ApiClientAuthorization"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.api_client_authorizations.update",
+          "path": "api_client_authorizations/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing ApiClientAuthorization.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClientAuthorization in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "api_client_authorization": {
+                "$ref": "ApiClientAuthorization"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.api_client_authorizations.delete",
+          "path": "api_client_authorizations/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing ApiClientAuthorization.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ApiClientAuthorization in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "create_system_auth": {
+          "id": "arvados.api_client_authorizations.create_system_auth",
+          "path": "api_client_authorizations/create_system_auth",
+          "httpMethod": "POST",
+          "description": "create_system_auth api_client_authorizations",
+          "parameters": {
+            "api_client_id": {
+              "type": "integer",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "scopes": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "current": {
+          "id": "arvados.api_client_authorizations.current",
+          "path": "api_client_authorizations/current",
+          "httpMethod": "GET",
+          "description": "current api_client_authorizations",
+          "parameters": {},
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.api_client_authorizations.list",
+          "path": "api_client_authorizations",
+          "httpMethod": "GET",
+          "description": "List ApiClientAuthorizations.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ApiClientAuthorizations. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#apiClientAuthorizationList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorizationList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.api_client_authorizations.show",
+          "path": "api_client_authorizations/{uuid}",
+          "httpMethod": "GET",
+          "description": "show api_client_authorizations",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.api_client_authorizations.destroy",
+          "path": "api_client_authorizations/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy api_client_authorizations",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ApiClientAuthorization"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "authorized_keys": {
+      "methods": {
+        "get": {
+          "id": "arvados.authorized_keys.get",
+          "path": "authorized_keys/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a AuthorizedKey's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the AuthorizedKey in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.authorized_keys.list",
+          "path": "authorized_keys",
+          "httpMethod": "GET",
+          "description": "List AuthorizedKeys.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching AuthorizedKeys. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#authorizedKeyList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKeyList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.authorized_keys.create",
+          "path": "authorized_keys",
+          "httpMethod": "POST",
+          "description": "Create a new AuthorizedKey.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "authorized_key": {
+                "$ref": "AuthorizedKey"
+              }
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.authorized_keys.update",
+          "path": "authorized_keys/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing AuthorizedKey.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the AuthorizedKey in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "authorized_key": {
+                "$ref": "AuthorizedKey"
+              }
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.authorized_keys.delete",
+          "path": "authorized_keys/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing AuthorizedKey.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the AuthorizedKey in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.authorized_keys.list",
+          "path": "authorized_keys",
+          "httpMethod": "GET",
+          "description": "List AuthorizedKeys.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching AuthorizedKeys. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#authorizedKeyList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKeyList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.authorized_keys.show",
+          "path": "authorized_keys/{uuid}",
+          "httpMethod": "GET",
+          "description": "show authorized_keys",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.authorized_keys.destroy",
+          "path": "authorized_keys/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy authorized_keys",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "AuthorizedKey"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "collections": {
+      "methods": {
+        "get": {
+          "id": "arvados.collections.get",
+          "path": "collections/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Collection's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Collection in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.collections.list",
+          "path": "collections",
+          "httpMethod": "GET",
+          "description": "List Collections.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Collections. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#collectionList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include collections whose is_trashed attribute is true.",
+              "location": "query"
+            },
+            "include_old_versions": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include past collection versions.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "CollectionList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.collections.create",
+          "path": "collections",
+          "httpMethod": "POST",
+          "description": "Create a new Collection.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "replace_files": {
+              "type": "object",
+              "description": "Files and directories to initialize/replace with content from other collections.",
+              "required": false,
+              "location": "query",
+              "properties": {},
+              "additionalProperties": {
+                "type": "string"
+              }
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "collection": {
+                "$ref": "Collection"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.collections.update",
+          "path": "collections/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Collection.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Collection in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "replace_files": {
+              "type": "object",
+              "description": "Files and directories to initialize/replace with content from other collections.",
+              "required": false,
+              "location": "query",
+              "properties": {},
+              "additionalProperties": {
+                "type": "string"
+              }
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "collection": {
+                "$ref": "Collection"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.collections.delete",
+          "path": "collections/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Collection.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Collection in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "provenance": {
+          "id": "arvados.collections.provenance",
+          "path": "collections/{uuid}/provenance",
+          "httpMethod": "GET",
+          "description": "provenance collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "used_by": {
+          "id": "arvados.collections.used_by",
+          "path": "collections/{uuid}/used_by",
+          "httpMethod": "GET",
+          "description": "used_by collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "trash": {
+          "id": "arvados.collections.trash",
+          "path": "collections/{uuid}/trash",
+          "httpMethod": "POST",
+          "description": "trash collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "untrash": {
+          "id": "arvados.collections.untrash",
+          "path": "collections/{uuid}/untrash",
+          "httpMethod": "POST",
+          "description": "untrash collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.collections.list",
+          "path": "collections",
+          "httpMethod": "GET",
+          "description": "List Collections.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Collections. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#collectionList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include collections whose is_trashed attribute is true.",
+              "location": "query"
+            },
+            "include_old_versions": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include past collection versions.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "CollectionList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.collections.show",
+          "path": "collections/{uuid}",
+          "httpMethod": "GET",
+          "description": "show collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Show collection even if its is_trashed attribute is true.",
+              "location": "query"
+            },
+            "include_old_versions": {
+              "type": "boolean",
+              "required": false,
+              "default": "true",
+              "description": "Include past collection versions.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.collections.destroy",
+          "path": "collections/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy collections",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Collection"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "containers": {
+      "methods": {
+        "get": {
+          "id": "arvados.containers.get",
+          "path": "containers/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Container's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Container in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.containers.list",
+          "path": "containers",
+          "httpMethod": "GET",
+          "description": "List Containers.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Containers. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#containerList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ContainerList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.containers.create",
+          "path": "containers",
+          "httpMethod": "POST",
+          "description": "Create a new Container.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "container": {
+                "$ref": "Container"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.containers.update",
+          "path": "containers/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Container.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Container in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "container": {
+                "$ref": "Container"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.containers.delete",
+          "path": "containers/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Container.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Container in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "auth": {
+          "id": "arvados.containers.auth",
+          "path": "containers/{uuid}/auth",
+          "httpMethod": "GET",
+          "description": "auth containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "lock": {
+          "id": "arvados.containers.lock",
+          "path": "containers/{uuid}/lock",
+          "httpMethod": "POST",
+          "description": "lock containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "unlock": {
+          "id": "arvados.containers.unlock",
+          "path": "containers/{uuid}/unlock",
+          "httpMethod": "POST",
+          "description": "unlock containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update_priority": {
+          "id": "arvados.containers.update_priority",
+          "path": "containers/{uuid}/update_priority",
+          "httpMethod": "POST",
+          "description": "update_priority containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "secret_mounts": {
+          "id": "arvados.containers.secret_mounts",
+          "path": "containers/{uuid}/secret_mounts",
+          "httpMethod": "GET",
+          "description": "secret_mounts containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "current": {
+          "id": "arvados.containers.current",
+          "path": "containers/current",
+          "httpMethod": "GET",
+          "description": "current containers",
+          "parameters": {},
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.containers.list",
+          "path": "containers",
+          "httpMethod": "GET",
+          "description": "List Containers.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Containers. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#containerList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ContainerList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.containers.show",
+          "path": "containers/{uuid}",
+          "httpMethod": "GET",
+          "description": "show containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.containers.destroy",
+          "path": "containers/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy containers",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Container"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "container_requests": {
+      "methods": {
+        "get": {
+          "id": "arvados.container_requests.get",
+          "path": "container_requests/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a ContainerRequest's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ContainerRequest in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.container_requests.list",
+          "path": "container_requests",
+          "httpMethod": "GET",
+          "description": "List ContainerRequests.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ContainerRequests. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#containerRequestList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include container requests whose owner project is trashed.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequestList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.container_requests.create",
+          "path": "container_requests",
+          "httpMethod": "POST",
+          "description": "Create a new ContainerRequest.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "container_request": {
+                "$ref": "ContainerRequest"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.container_requests.update",
+          "path": "container_requests/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing ContainerRequest.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ContainerRequest in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "container_request": {
+                "$ref": "ContainerRequest"
+              }
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.container_requests.delete",
+          "path": "container_requests/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing ContainerRequest.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the ContainerRequest in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.container_requests.list",
+          "path": "container_requests",
+          "httpMethod": "GET",
+          "description": "List ContainerRequests.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching ContainerRequests. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#containerRequestList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include container requests whose owner project is trashed.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequestList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.container_requests.show",
+          "path": "container_requests/{uuid}",
+          "httpMethod": "GET",
+          "description": "show container_requests",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Show container request even if its owner project is trashed.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.container_requests.destroy",
+          "path": "container_requests/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy container_requests",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "ContainerRequest"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "groups": {
+      "methods": {
+        "get": {
+          "id": "arvados.groups.get",
+          "path": "groups/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Group's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Group in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.groups.list",
+          "path": "groups",
+          "httpMethod": "GET",
+          "description": "List Groups.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Groups. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#groupList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include items whose is_trashed attribute is true.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "GroupList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.groups.create",
+          "path": "groups",
+          "httpMethod": "POST",
+          "description": "Create a new Group.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "async": {
+              "required": false,
+              "type": "boolean",
+              "location": "query",
+              "default": "false",
+              "description": "defer permissions update"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "group": {
+                "$ref": "Group"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.groups.update",
+          "path": "groups/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Group.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Group in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "async": {
+              "required": false,
+              "type": "boolean",
+              "location": "query",
+              "default": "false",
+              "description": "defer permissions update"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "group": {
+                "$ref": "Group"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.groups.delete",
+          "path": "groups/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Group.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Group in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "contents": {
+          "id": "arvados.groups.contents",
+          "path": "groups/contents",
+          "httpMethod": "GET",
+          "description": "contents groups",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include items whose is_trashed attribute is true.",
+              "location": "query"
+            },
+            "uuid": {
+              "type": "string",
+              "required": false,
+              "default": "",
+              "description": "",
+              "location": "query"
+            },
+            "recursive": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include contents from child groups recursively.",
+              "location": "query"
+            },
+            "include": {
+              "type": "string",
+              "required": false,
+              "description": "Include objects referred to by listed field in \"included\" (only owner_uuid).",
+              "location": "query"
+            },
+            "include_old_versions": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include past collection versions.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "shared": {
+          "id": "arvados.groups.shared",
+          "path": "groups/shared",
+          "httpMethod": "GET",
+          "description": "shared groups",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include items whose is_trashed attribute is true.",
+              "location": "query"
+            },
+            "include": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "trash": {
+          "id": "arvados.groups.trash",
+          "path": "groups/{uuid}/trash",
+          "httpMethod": "POST",
+          "description": "trash groups",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "untrash": {
+          "id": "arvados.groups.untrash",
+          "path": "groups/{uuid}/untrash",
+          "httpMethod": "POST",
+          "description": "untrash groups",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.groups.list",
+          "path": "groups",
+          "httpMethod": "GET",
+          "description": "List Groups.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Groups. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#groupList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Include items whose is_trashed attribute is true.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "GroupList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.groups.show",
+          "path": "groups/{uuid}",
+          "httpMethod": "GET",
+          "description": "show groups",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "include_trash": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "Show group/project even if its is_trashed attribute is true.",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.groups.destroy",
+          "path": "groups/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy groups",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Group"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "humans": {
+      "methods": {
+        "get": {
+          "id": "arvados.humans.get",
+          "path": "humans/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Human's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Human in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.humans.list",
+          "path": "humans",
+          "httpMethod": "GET",
+          "description": "List Humans.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Humans. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#humanList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "HumanList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.humans.create",
+          "path": "humans",
+          "httpMethod": "POST",
+          "description": "Create a new Human.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "human": {
+                "$ref": "Human"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.humans.update",
+          "path": "humans/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Human.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Human in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "human": {
+                "$ref": "Human"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.humans.delete",
+          "path": "humans/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Human.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Human in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.humans.list",
+          "path": "humans",
+          "httpMethod": "GET",
+          "description": "List Humans.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Humans. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#humanList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "HumanList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.humans.show",
+          "path": "humans/{uuid}",
+          "httpMethod": "GET",
+          "description": "show humans",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.humans.destroy",
+          "path": "humans/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy humans",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Human"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "job_tasks": {
+      "methods": {
+        "get": {
+          "id": "arvados.job_tasks.get",
+          "path": "job_tasks/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a JobTask's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the JobTask in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.job_tasks.list",
+          "path": "job_tasks",
+          "httpMethod": "GET",
+          "description": "List JobTasks.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching JobTasks. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#jobTaskList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "JobTaskList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.job_tasks.create",
+          "path": "job_tasks",
+          "httpMethod": "POST",
+          "description": "Create a new JobTask.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "job_task": {
+                "$ref": "JobTask"
+              }
+            }
+          },
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.job_tasks.update",
+          "path": "job_tasks/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing JobTask.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the JobTask in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "job_task": {
+                "$ref": "JobTask"
+              }
+            }
+          },
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.job_tasks.delete",
+          "path": "job_tasks/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing JobTask.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the JobTask in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.job_tasks.list",
+          "path": "job_tasks",
+          "httpMethod": "GET",
+          "description": "List JobTasks.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching JobTasks. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#jobTaskList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "JobTaskList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.job_tasks.show",
+          "path": "job_tasks/{uuid}",
+          "httpMethod": "GET",
+          "description": "show job_tasks",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.job_tasks.destroy",
+          "path": "job_tasks/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy job_tasks",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "JobTask"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "keep_disks": {
+      "methods": {
+        "get": {
+          "id": "arvados.keep_disks.get",
+          "path": "keep_disks/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a KeepDisk's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepDisk in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.keep_disks.list",
+          "path": "keep_disks",
+          "httpMethod": "GET",
+          "description": "List KeepDisks.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching KeepDisks. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#keepDiskList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepDiskList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.keep_disks.create",
+          "path": "keep_disks",
+          "httpMethod": "POST",
+          "description": "Create a new KeepDisk.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "keep_disk": {
+                "$ref": "KeepDisk"
+              }
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.keep_disks.update",
+          "path": "keep_disks/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing KeepDisk.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepDisk in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "keep_disk": {
+                "$ref": "KeepDisk"
+              }
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.keep_disks.delete",
+          "path": "keep_disks/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing KeepDisk.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepDisk in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "ping": {
+          "id": "arvados.keep_disks.ping",
+          "path": "keep_disks/ping",
+          "httpMethod": "POST",
+          "description": "ping keep_disks",
+          "parameters": {
+            "uuid": {
+              "required": false,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "ping_secret": {
+              "required": true,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "node_uuid": {
+              "required": false,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "filesystem_uuid": {
+              "required": false,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "service_host": {
+              "required": false,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "service_port": {
+              "required": true,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            },
+            "service_ssl_flag": {
+              "required": true,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.keep_disks.list",
+          "path": "keep_disks",
+          "httpMethod": "GET",
+          "description": "List KeepDisks.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching KeepDisks. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#keepDiskList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepDiskList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.keep_disks.show",
+          "path": "keep_disks/{uuid}",
+          "httpMethod": "GET",
+          "description": "show keep_disks",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.keep_disks.destroy",
+          "path": "keep_disks/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy keep_disks",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "KeepDisk"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "keep_services": {
+      "methods": {
+        "get": {
+          "id": "arvados.keep_services.get",
+          "path": "keep_services/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a KeepService's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepService in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.keep_services.list",
+          "path": "keep_services",
+          "httpMethod": "GET",
+          "description": "List KeepServices.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching KeepServices. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#keepServiceList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepServiceList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.keep_services.create",
+          "path": "keep_services",
+          "httpMethod": "POST",
+          "description": "Create a new KeepService.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "keep_service": {
+                "$ref": "KeepService"
+              }
+            }
+          },
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.keep_services.update",
+          "path": "keep_services/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing KeepService.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepService in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "keep_service": {
+                "$ref": "KeepService"
+              }
+            }
+          },
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.keep_services.delete",
+          "path": "keep_services/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing KeepService.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the KeepService in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "accessible": {
+          "id": "arvados.keep_services.accessible",
+          "path": "keep_services/accessible",
+          "httpMethod": "GET",
+          "description": "accessible keep_services",
+          "parameters": {},
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.keep_services.list",
+          "path": "keep_services",
+          "httpMethod": "GET",
+          "description": "List KeepServices.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching KeepServices. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#keepServiceList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepServiceList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.keep_services.show",
+          "path": "keep_services/{uuid}",
+          "httpMethod": "GET",
+          "description": "show keep_services",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.keep_services.destroy",
+          "path": "keep_services/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy keep_services",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "KeepService"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "links": {
+      "methods": {
+        "get": {
+          "id": "arvados.links.get",
+          "path": "links/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Link's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Link in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.links.list",
+          "path": "links",
+          "httpMethod": "GET",
+          "description": "List Links.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Links. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#linkList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "LinkList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.links.create",
+          "path": "links",
+          "httpMethod": "POST",
+          "description": "Create a new Link.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "link": {
+                "$ref": "Link"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.links.update",
+          "path": "links/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Link.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Link in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "link": {
+                "$ref": "Link"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.links.delete",
+          "path": "links/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Link.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Link in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.links.list",
+          "path": "links",
+          "httpMethod": "GET",
+          "description": "List Links.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Links. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#linkList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "LinkList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.links.show",
+          "path": "links/{uuid}",
+          "httpMethod": "GET",
+          "description": "show links",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.links.destroy",
+          "path": "links/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy links",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "get_permissions": {
+          "id": "arvados.links.get_permissions",
+          "path": "permissions/{uuid}",
+          "httpMethod": "GET",
+          "description": "get_permissions links",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Link"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "logs": {
+      "methods": {
+        "get": {
+          "id": "arvados.logs.get",
+          "path": "logs/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Log's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Log in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.logs.list",
+          "path": "logs",
+          "httpMethod": "GET",
+          "description": "List Logs.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Logs. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#logList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "LogList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.logs.create",
+          "path": "logs",
+          "httpMethod": "POST",
+          "description": "Create a new Log.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "log": {
+                "$ref": "Log"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.logs.update",
+          "path": "logs/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Log.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Log in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "log": {
+                "$ref": "Log"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.logs.delete",
+          "path": "logs/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Log.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Log in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.logs.list",
+          "path": "logs",
+          "httpMethod": "GET",
+          "description": "List Logs.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Logs. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#logList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "LogList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.logs.show",
+          "path": "logs/{uuid}",
+          "httpMethod": "GET",
+          "description": "show logs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.logs.destroy",
+          "path": "logs/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy logs",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Log"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "nodes": {
+      "methods": {
+        "get": {
+          "id": "arvados.nodes.get",
+          "path": "nodes/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Node's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Node in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.nodes.list",
+          "path": "nodes",
+          "httpMethod": "GET",
+          "description": "List Nodes.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Nodes. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#nodeList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "NodeList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.nodes.create",
+          "path": "nodes",
+          "httpMethod": "POST",
+          "description": "Create a new Node.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "assign_slot": {
+              "required": false,
+              "type": "boolean",
+              "description": "assign slot and hostname",
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "node": {
+                "$ref": "Node"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.nodes.update",
+          "path": "nodes/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Node.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Node in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "assign_slot": {
+              "required": false,
+              "type": "boolean",
+              "description": "assign slot and hostname",
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "node": {
+                "$ref": "Node"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.nodes.delete",
+          "path": "nodes/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Node.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Node in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "ping": {
+          "id": "arvados.nodes.ping",
+          "path": "nodes/{uuid}/ping",
+          "httpMethod": "POST",
+          "description": "ping nodes",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "ping_secret": {
+              "required": true,
+              "type": "string",
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.nodes.list",
+          "path": "nodes",
+          "httpMethod": "GET",
+          "description": "List Nodes.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Nodes. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#nodeList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "NodeList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.nodes.show",
+          "path": "nodes/{uuid}",
+          "httpMethod": "GET",
+          "description": "show nodes",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.nodes.destroy",
+          "path": "nodes/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy nodes",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Node"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "users": {
+      "methods": {
+        "get": {
+          "id": "arvados.users.get",
+          "path": "users/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a User's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the User in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.users.list",
+          "path": "users",
+          "httpMethod": "GET",
+          "description": "List Users.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Users. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#userList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "UserList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.users.create",
+          "path": "users",
+          "httpMethod": "POST",
+          "description": "Create a new User.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "user": {
+                "$ref": "User"
+              }
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.users.update",
+          "path": "users/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing User.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the User in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "user": {
+                "$ref": "User"
+              }
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.users.delete",
+          "path": "users/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing User.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the User in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "current": {
+          "id": "arvados.users.current",
+          "path": "users/current",
+          "httpMethod": "GET",
+          "description": "current users",
+          "parameters": {},
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "system": {
+          "id": "arvados.users.system",
+          "path": "users/system",
+          "httpMethod": "GET",
+          "description": "system users",
+          "parameters": {},
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "activate": {
+          "id": "arvados.users.activate",
+          "path": "users/{uuid}/activate",
+          "httpMethod": "POST",
+          "description": "activate users",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "setup": {
+          "id": "arvados.users.setup",
+          "path": "users/setup",
+          "httpMethod": "POST",
+          "description": "setup users",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "user": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "repo_name": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "vm_uuid": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "send_notification_email": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "unsetup": {
+          "id": "arvados.users.unsetup",
+          "path": "users/{uuid}/unsetup",
+          "httpMethod": "POST",
+          "description": "unsetup users",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "merge": {
+          "id": "arvados.users.merge",
+          "path": "users/merge",
+          "httpMethod": "POST",
+          "description": "merge users",
+          "parameters": {
+            "new_owner_uuid": {
+              "type": "string",
+              "required": true,
+              "description": "",
+              "location": "query"
+            },
+            "new_user_token": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "redirect_to_new_user": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "old_user_uuid": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "new_user_uuid": {
+              "type": "string",
+              "required": false,
+              "description": "",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.users.list",
+          "path": "users",
+          "httpMethod": "GET",
+          "description": "List Users.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Users. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#userList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "UserList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.users.show",
+          "path": "users/{uuid}",
+          "httpMethod": "GET",
+          "description": "show users",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.users.destroy",
+          "path": "users/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy users",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "User"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "pipeline_instances": {
+      "methods": {
+        "get": {
+          "id": "arvados.pipeline_instances.get",
+          "path": "pipeline_instances/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a PipelineInstance's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineInstance in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.pipeline_instances.list",
+          "path": "pipeline_instances",
+          "httpMethod": "GET",
+          "description": "List PipelineInstances.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching PipelineInstances. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#pipelineInstanceList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstanceList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.pipeline_instances.create",
+          "path": "pipeline_instances",
+          "httpMethod": "POST",
+          "description": "Create a new PipelineInstance.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "pipeline_instance": {
+                "$ref": "PipelineInstance"
+              }
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.pipeline_instances.update",
+          "path": "pipeline_instances/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing PipelineInstance.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineInstance in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "pipeline_instance": {
+                "$ref": "PipelineInstance"
+              }
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.pipeline_instances.delete",
+          "path": "pipeline_instances/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing PipelineInstance.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineInstance in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "cancel": {
+          "id": "arvados.pipeline_instances.cancel",
+          "path": "pipeline_instances/{uuid}/cancel",
+          "httpMethod": "POST",
+          "description": "cancel pipeline_instances",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.pipeline_instances.list",
+          "path": "pipeline_instances",
+          "httpMethod": "GET",
+          "description": "List PipelineInstances.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching PipelineInstances. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#pipelineInstanceList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstanceList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.pipeline_instances.show",
+          "path": "pipeline_instances/{uuid}",
+          "httpMethod": "GET",
+          "description": "show pipeline_instances",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.pipeline_instances.destroy",
+          "path": "pipeline_instances/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy pipeline_instances",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "PipelineInstance"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "pipeline_templates": {
+      "methods": {
+        "get": {
+          "id": "arvados.pipeline_templates.get",
+          "path": "pipeline_templates/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a PipelineTemplate's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineTemplate in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.pipeline_templates.list",
+          "path": "pipeline_templates",
+          "httpMethod": "GET",
+          "description": "List PipelineTemplates.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching PipelineTemplates. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#pipelineTemplateList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplateList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.pipeline_templates.create",
+          "path": "pipeline_templates",
+          "httpMethod": "POST",
+          "description": "Create a new PipelineTemplate.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "pipeline_template": {
+                "$ref": "PipelineTemplate"
+              }
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.pipeline_templates.update",
+          "path": "pipeline_templates/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing PipelineTemplate.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineTemplate in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "pipeline_template": {
+                "$ref": "PipelineTemplate"
+              }
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.pipeline_templates.delete",
+          "path": "pipeline_templates/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing PipelineTemplate.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the PipelineTemplate in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.pipeline_templates.list",
+          "path": "pipeline_templates",
+          "httpMethod": "GET",
+          "description": "List PipelineTemplates.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching PipelineTemplates. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#pipelineTemplateList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplateList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.pipeline_templates.show",
+          "path": "pipeline_templates/{uuid}",
+          "httpMethod": "GET",
+          "description": "show pipeline_templates",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.pipeline_templates.destroy",
+          "path": "pipeline_templates/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy pipeline_templates",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "PipelineTemplate"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "repositories": {
+      "methods": {
+        "get": {
+          "id": "arvados.repositories.get",
+          "path": "repositories/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Repository's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Repository in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.repositories.list",
+          "path": "repositories",
+          "httpMethod": "GET",
+          "description": "List Repositories.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Repositories. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#repositoryList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "RepositoryList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.repositories.create",
+          "path": "repositories",
+          "httpMethod": "POST",
+          "description": "Create a new Repository.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "repository": {
+                "$ref": "Repository"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.repositories.update",
+          "path": "repositories/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Repository.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Repository in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "repository": {
+                "$ref": "Repository"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.repositories.delete",
+          "path": "repositories/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Repository.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Repository in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "get_all_permissions": {
+          "id": "arvados.repositories.get_all_permissions",
+          "path": "repositories/get_all_permissions",
+          "httpMethod": "GET",
+          "description": "get_all_permissions repositories",
+          "parameters": {},
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.repositories.list",
+          "path": "repositories",
+          "httpMethod": "GET",
+          "description": "List Repositories.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Repositories. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#repositoryList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "RepositoryList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.repositories.show",
+          "path": "repositories/{uuid}",
+          "httpMethod": "GET",
+          "description": "show repositories",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.repositories.destroy",
+          "path": "repositories/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy repositories",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Repository"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "specimens": {
+      "methods": {
+        "get": {
+          "id": "arvados.specimens.get",
+          "path": "specimens/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Specimen's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Specimen in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.specimens.list",
+          "path": "specimens",
+          "httpMethod": "GET",
+          "description": "List Specimens.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Specimens. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#specimenList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "SpecimenList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.specimens.create",
+          "path": "specimens",
+          "httpMethod": "POST",
+          "description": "Create a new Specimen.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "specimen": {
+                "$ref": "Specimen"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.specimens.update",
+          "path": "specimens/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Specimen.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Specimen in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "specimen": {
+                "$ref": "Specimen"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.specimens.delete",
+          "path": "specimens/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Specimen.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Specimen in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.specimens.list",
+          "path": "specimens",
+          "httpMethod": "GET",
+          "description": "List Specimens.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Specimens. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#specimenList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "SpecimenList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.specimens.show",
+          "path": "specimens/{uuid}",
+          "httpMethod": "GET",
+          "description": "show specimens",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.specimens.destroy",
+          "path": "specimens/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy specimens",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Specimen"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "traits": {
+      "methods": {
+        "get": {
+          "id": "arvados.traits.get",
+          "path": "traits/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Trait's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Trait in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.traits.list",
+          "path": "traits",
+          "httpMethod": "GET",
+          "description": "List Traits.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Traits. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#traitList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "TraitList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.traits.create",
+          "path": "traits",
+          "httpMethod": "POST",
+          "description": "Create a new Trait.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "trait": {
+                "$ref": "Trait"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.traits.update",
+          "path": "traits/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Trait.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Trait in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "trait": {
+                "$ref": "Trait"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.traits.delete",
+          "path": "traits/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Trait.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Trait in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.traits.list",
+          "path": "traits",
+          "httpMethod": "GET",
+          "description": "List Traits.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Traits. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#traitList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "TraitList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.traits.show",
+          "path": "traits/{uuid}",
+          "httpMethod": "GET",
+          "description": "show traits",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.traits.destroy",
+          "path": "traits/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy traits",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Trait"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "virtual_machines": {
+      "methods": {
+        "get": {
+          "id": "arvados.virtual_machines.get",
+          "path": "virtual_machines/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a VirtualMachine's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the VirtualMachine in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.virtual_machines.list",
+          "path": "virtual_machines",
+          "httpMethod": "GET",
+          "description": "List VirtualMachines.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching VirtualMachines. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#virtualMachineList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachineList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.virtual_machines.create",
+          "path": "virtual_machines",
+          "httpMethod": "POST",
+          "description": "Create a new VirtualMachine.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "virtual_machine": {
+                "$ref": "VirtualMachine"
+              }
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.virtual_machines.update",
+          "path": "virtual_machines/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing VirtualMachine.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the VirtualMachine in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "virtual_machine": {
+                "$ref": "VirtualMachine"
+              }
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.virtual_machines.delete",
+          "path": "virtual_machines/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing VirtualMachine.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the VirtualMachine in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "logins": {
+          "id": "arvados.virtual_machines.logins",
+          "path": "virtual_machines/{uuid}/logins",
+          "httpMethod": "GET",
+          "description": "logins virtual_machines",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "get_all_logins": {
+          "id": "arvados.virtual_machines.get_all_logins",
+          "path": "virtual_machines/get_all_logins",
+          "httpMethod": "GET",
+          "description": "get_all_logins virtual_machines",
+          "parameters": {},
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.virtual_machines.list",
+          "path": "virtual_machines",
+          "httpMethod": "GET",
+          "description": "List VirtualMachines.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching VirtualMachines. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#virtualMachineList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachineList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.virtual_machines.show",
+          "path": "virtual_machines/{uuid}",
+          "httpMethod": "GET",
+          "description": "show virtual_machines",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.virtual_machines.destroy",
+          "path": "virtual_machines/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy virtual_machines",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "VirtualMachine"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "workflows": {
+      "methods": {
+        "get": {
+          "id": "arvados.workflows.get",
+          "path": "workflows/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a Workflow's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Workflow in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.workflows.list",
+          "path": "workflows",
+          "httpMethod": "GET",
+          "description": "List Workflows.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Workflows. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#workflowList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "WorkflowList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.workflows.create",
+          "path": "workflows",
+          "httpMethod": "POST",
+          "description": "Create a new Workflow.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "workflow": {
+                "$ref": "Workflow"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.workflows.update",
+          "path": "workflows/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing Workflow.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Workflow in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "workflow": {
+                "$ref": "Workflow"
+              }
+            }
+          },
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.workflows.delete",
+          "path": "workflows/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing Workflow.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the Workflow in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.workflows.list",
+          "path": "workflows",
+          "httpMethod": "GET",
+          "description": "List Workflows.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching Workflows. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#workflowList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "WorkflowList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "show": {
+          "id": "arvados.workflows.show",
+          "path": "workflows/{uuid}",
+          "httpMethod": "GET",
+          "description": "show workflows",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.workflows.destroy",
+          "path": "workflows/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy workflows",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "Workflow"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "user_agreements": {
+      "methods": {
+        "get": {
+          "id": "arvados.user_agreements.get",
+          "path": "user_agreements/{uuid}",
+          "httpMethod": "GET",
+          "description": "Gets a UserAgreement's metadata by UUID.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the UserAgreement in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "parameterOrder": [
+            "uuid"
+          ],
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "index": {
+          "id": "arvados.user_agreements.list",
+          "path": "user_agreements",
+          "httpMethod": "GET",
+          "description": "List UserAgreements.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching UserAgreements. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#userAgreementList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "UserAgreementList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "create": {
+          "id": "arvados.user_agreements.create",
+          "path": "user_agreements",
+          "httpMethod": "POST",
+          "description": "Create a new UserAgreement.",
+          "parameters": {
+            "select": {
+              "type": "array",
+              "description": "Attributes of the new object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "ensure_unique_name": {
+              "type": "boolean",
+              "description": "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.",
+              "location": "query",
+              "required": false,
+              "default": "false"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "Create object on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "user_agreement": {
+                "$ref": "UserAgreement"
+              }
+            }
+          },
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "update": {
+          "id": "arvados.user_agreements.update",
+          "path": "user_agreements/{uuid}",
+          "httpMethod": "PUT",
+          "description": "Update attributes of an existing UserAgreement.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the UserAgreement in question.",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the updated object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "request": {
+            "required": true,
+            "properties": {
+              "user_agreement": {
+                "$ref": "UserAgreement"
+              }
+            }
+          },
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "delete": {
+          "id": "arvados.user_agreements.delete",
+          "path": "user_agreements/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "Delete an existing UserAgreement.",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "The UUID of the UserAgreement in question.",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "signatures": {
+          "id": "arvados.user_agreements.signatures",
+          "path": "user_agreements/signatures",
+          "httpMethod": "GET",
+          "description": "signatures user_agreements",
+          "parameters": {},
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "sign": {
+          "id": "arvados.user_agreements.sign",
+          "path": "user_agreements/sign",
+          "httpMethod": "POST",
+          "description": "sign user_agreements",
+          "parameters": {},
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "list": {
+          "id": "arvados.user_agreements.list",
+          "path": "user_agreements",
+          "httpMethod": "GET",
+          "description": "List UserAgreements.\n\n                   The <code>list</code> method returns a\n                   <a href=\"/api/resources.html\">resource list</a> of\n                   matching UserAgreements. For example:\n\n                   <pre>\n                   {\n                    \"kind\":\"arvados#userAgreementList\",\n                    \"etag\":\"\",\n                    \"self_link\":\"\",\n                    \"next_page_token\":\"\",\n                    \"next_link\":\"\",\n                    \"items\":[\n                       ...\n                    ],\n                    \"items_available\":745,\n                    \"_profile\":{\n                     \"request_time\":0.157236317\n                    }\n                    </pre>",
+          "parameters": {
+            "filters": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "where": {
+              "type": "object",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "order": {
+              "type": "array",
+              "required": false,
+              "description": "",
+              "location": "query"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of each object to return in the response.",
+              "required": false,
+              "location": "query"
+            },
+            "distinct": {
+              "type": "boolean",
+              "required": false,
+              "default": "false",
+              "description": "",
+              "location": "query"
+            },
+            "limit": {
+              "type": "integer",
+              "required": false,
+              "default": "100",
+              "description": "",
+              "location": "query"
+            },
+            "offset": {
+              "type": "integer",
+              "required": false,
+              "default": "0",
+              "description": "",
+              "location": "query"
+            },
+            "count": {
+              "type": "string",
+              "required": false,
+              "default": "exact",
+              "description": "",
+              "location": "query"
+            },
+            "cluster_id": {
+              "type": "string",
+              "description": "List objects on a remote federated cluster instead of the current one.",
+              "location": "query",
+              "required": false
+            },
+            "bypass_federation": {
+              "type": "boolean",
+              "required": false,
+              "description": "bypass federation behavior, list items from local instance database only",
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "UserAgreementList"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        },
+        "new": {
+          "id": "arvados.user_agreements.new",
+          "path": "user_agreements/new",
+          "httpMethod": "GET",
+          "description": "new user_agreements",
+          "parameters": {},
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "show": {
+          "id": "arvados.user_agreements.show",
+          "path": "user_agreements/{uuid}",
+          "httpMethod": "GET",
+          "description": "show user_agreements",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            },
+            "select": {
+              "type": "array",
+              "description": "Attributes of the object to return in the response.",
+              "required": false,
+              "location": "query"
+            }
+          },
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        },
+        "destroy": {
+          "id": "arvados.user_agreements.destroy",
+          "path": "user_agreements/{uuid}",
+          "httpMethod": "DELETE",
+          "description": "destroy user_agreements",
+          "parameters": {
+            "uuid": {
+              "type": "string",
+              "description": "",
+              "required": true,
+              "location": "path"
+            }
+          },
+          "response": {
+            "$ref": "UserAgreement"
+          },
+          "scopes": [
+            "https://api.arvados.org/auth/arvados"
+          ]
+        }
+      }
+    },
+    "configs": {
+      "methods": {
+        "get": {
+          "id": "arvados.configs.get",
+          "path": "config",
+          "httpMethod": "GET",
+          "description": "Get public config",
+          "parameters": {},
+          "parameterOrder": [],
+          "response": {},
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        }
+      }
+    },
+    "vocabularies": {
+      "methods": {
+        "get": {
+          "id": "arvados.vocabularies.get",
+          "path": "vocabulary",
+          "httpMethod": "GET",
+          "description": "Get vocabulary definition",
+          "parameters": {},
+          "parameterOrder": [],
+          "response": {},
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        }
+      }
+    },
+    "sys": {
+      "methods": {
+        "get": {
+          "id": "arvados.sys.trash_sweep",
+          "path": "sys/trash_sweep",
+          "httpMethod": "POST",
+          "description": "apply scheduled trash and delete operations",
+          "parameters": {},
+          "parameterOrder": [],
+          "response": {},
+          "scopes": [
+            "https://api.arvados.org/auth/arvados",
+            "https://api.arvados.org/auth/arvados.readonly"
+          ]
+        }
+      }
+    }
+  },
+  "revision": "20220510",
+  "schemas": {
+    "JobList": {
+      "id": "JobList",
+      "description": "Job list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#jobList.",
+          "default": "arvados#jobList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Jobs.",
+          "items": {
+            "$ref": "Job"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Jobs."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Jobs."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Job": {
+      "id": "Job",
+      "description": "Job",
+      "type": "object",
+      "uuidPrefix": "8i9sb",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "submit_id": {
+          "type": "string"
+        },
+        "script": {
+          "type": "string"
+        },
+        "script_version": {
+          "type": "string"
+        },
+        "script_parameters": {
+          "type": "Hash"
+        },
+        "cancelled_by_client_uuid": {
+          "type": "string"
+        },
+        "cancelled_by_user_uuid": {
+          "type": "string"
+        },
+        "cancelled_at": {
+          "type": "datetime"
+        },
+        "started_at": {
+          "type": "datetime"
+        },
+        "finished_at": {
+          "type": "datetime"
+        },
+        "running": {
+          "type": "boolean"
+        },
+        "success": {
+          "type": "boolean"
+        },
+        "output": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "is_locked_by_uuid": {
+          "type": "string"
+        },
+        "log": {
+          "type": "string"
+        },
+        "tasks_summary": {
+          "type": "Hash"
+        },
+        "runtime_constraints": {
+          "type": "Hash"
+        },
+        "nondeterministic": {
+          "type": "boolean"
+        },
+        "repository": {
+          "type": "string"
+        },
+        "supplied_script_version": {
+          "type": "string"
+        },
+        "docker_image_locator": {
+          "type": "string"
+        },
+        "priority": {
+          "type": "integer"
+        },
+        "description": {
+          "type": "string"
+        },
+        "state": {
+          "type": "string"
+        },
+        "arvados_sdk_version": {
+          "type": "string"
+        },
+        "components": {
+          "type": "Hash"
+        },
+        "script_parameters_digest": {
+          "type": "string"
+        }
+      }
+    },
+    "ApiClientList": {
+      "id": "ApiClientList",
+      "description": "ApiClient list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#apiClientList.",
+          "default": "arvados#apiClientList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of ApiClients.",
+          "items": {
+            "$ref": "ApiClient"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of ApiClients."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of ApiClients."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "ApiClient": {
+      "id": "ApiClient",
+      "description": "ApiClient",
+      "type": "object",
+      "uuidPrefix": "ozdt8",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "url_prefix": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "is_trusted": {
+          "type": "boolean"
+        }
+      }
+    },
+    "ApiClientAuthorizationList": {
+      "id": "ApiClientAuthorizationList",
+      "description": "ApiClientAuthorization list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#apiClientAuthorizationList.",
+          "default": "arvados#apiClientAuthorizationList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of ApiClientAuthorizations.",
+          "items": {
+            "$ref": "ApiClientAuthorization"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of ApiClientAuthorizations."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of ApiClientAuthorizations."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "ApiClientAuthorization": {
+      "id": "ApiClientAuthorization",
+      "description": "ApiClientAuthorization",
+      "type": "object",
+      "uuidPrefix": "gj3su",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "api_token": {
+          "type": "string"
+        },
+        "api_client_id": {
+          "type": "integer"
+        },
+        "user_id": {
+          "type": "integer"
+        },
+        "created_by_ip_address": {
+          "type": "string"
+        },
+        "last_used_by_ip_address": {
+          "type": "string"
+        },
+        "last_used_at": {
+          "type": "datetime"
+        },
+        "expires_at": {
+          "type": "datetime"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "default_owner_uuid": {
+          "type": "string"
+        },
+        "scopes": {
+          "type": "Array"
+        }
+      }
+    },
+    "AuthorizedKeyList": {
+      "id": "AuthorizedKeyList",
+      "description": "AuthorizedKey list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#authorizedKeyList.",
+          "default": "arvados#authorizedKeyList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of AuthorizedKeys.",
+          "items": {
+            "$ref": "AuthorizedKey"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of AuthorizedKeys."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of AuthorizedKeys."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "AuthorizedKey": {
+      "id": "AuthorizedKey",
+      "description": "AuthorizedKey",
+      "type": "object",
+      "uuidPrefix": "fngyi",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "key_type": {
+          "type": "string"
+        },
+        "authorized_user_uuid": {
+          "type": "string"
+        },
+        "public_key": {
+          "type": "text"
+        },
+        "expires_at": {
+          "type": "datetime"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "CollectionList": {
+      "id": "CollectionList",
+      "description": "Collection list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#collectionList.",
+          "default": "arvados#collectionList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Collections.",
+          "items": {
+            "$ref": "Collection"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Collections."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Collections."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Collection": {
+      "id": "Collection",
+      "description": "Collection",
+      "type": "object",
+      "uuidPrefix": "4zz18",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "portable_data_hash": {
+          "type": "string"
+        },
+        "replication_desired": {
+          "type": "integer"
+        },
+        "replication_confirmed_at": {
+          "type": "datetime"
+        },
+        "replication_confirmed": {
+          "type": "integer"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "manifest_text": {
+          "type": "text"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "delete_at": {
+          "type": "datetime"
+        },
+        "file_names": {
+          "type": "text"
+        },
+        "trash_at": {
+          "type": "datetime"
+        },
+        "is_trashed": {
+          "type": "boolean"
+        },
+        "storage_classes_desired": {
+          "type": "Array"
+        },
+        "storage_classes_confirmed": {
+          "type": "Array"
+        },
+        "storage_classes_confirmed_at": {
+          "type": "datetime"
+        },
+        "current_version_uuid": {
+          "type": "string"
+        },
+        "version": {
+          "type": "integer"
+        },
+        "preserve_version": {
+          "type": "boolean"
+        },
+        "file_count": {
+          "type": "integer"
+        },
+        "file_size_total": {
+          "type": "integer"
+        }
+      }
+    },
+    "ContainerList": {
+      "id": "ContainerList",
+      "description": "Container list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#containerList.",
+          "default": "arvados#containerList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Containers.",
+          "items": {
+            "$ref": "Container"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Containers."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Containers."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Container": {
+      "id": "Container",
+      "description": "Container",
+      "type": "object",
+      "uuidPrefix": "dz642",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "state": {
+          "type": "string"
+        },
+        "started_at": {
+          "type": "datetime"
+        },
+        "finished_at": {
+          "type": "datetime"
+        },
+        "log": {
+          "type": "string"
+        },
+        "environment": {
+          "type": "Hash"
+        },
+        "cwd": {
+          "type": "string"
+        },
+        "command": {
+          "type": "Array"
+        },
+        "output_path": {
+          "type": "string"
+        },
+        "mounts": {
+          "type": "Hash"
+        },
+        "runtime_constraints": {
+          "type": "Hash"
+        },
+        "output": {
+          "type": "string"
+        },
+        "container_image": {
+          "type": "string"
+        },
+        "progress": {
+          "type": "float"
+        },
+        "priority": {
+          "type": "integer"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "exit_code": {
+          "type": "integer"
+        },
+        "auth_uuid": {
+          "type": "string"
+        },
+        "locked_by_uuid": {
+          "type": "string"
+        },
+        "scheduling_parameters": {
+          "type": "Hash"
+        },
+        "runtime_status": {
+          "type": "Hash"
+        },
+        "runtime_user_uuid": {
+          "type": "text"
+        },
+        "runtime_auth_scopes": {
+          "type": "Array"
+        },
+        "runtime_token": {
+          "type": "text"
+        },
+        "lock_count": {
+          "type": "integer"
+        },
+        "gateway_address": {
+          "type": "string"
+        },
+        "interactive_session_started": {
+          "type": "boolean"
+        },
+        "output_storage_classes": {
+          "type": "Array"
+        },
+        "output_properties": {
+          "type": "Hash"
+        },
+        "cost": {
+          "type": "float"
+        },
+        "subrequests_cost": {
+          "type": "float"
+        }
+      }
+    },
+    "ContainerRequestList": {
+      "id": "ContainerRequestList",
+      "description": "ContainerRequest list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#containerRequestList.",
+          "default": "arvados#containerRequestList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of ContainerRequests.",
+          "items": {
+            "$ref": "ContainerRequest"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of ContainerRequests."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of ContainerRequests."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "ContainerRequest": {
+      "id": "ContainerRequest",
+      "description": "ContainerRequest",
+      "type": "object",
+      "uuidPrefix": "xvhdp",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "text"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "state": {
+          "type": "string"
+        },
+        "requesting_container_uuid": {
+          "type": "string"
+        },
+        "container_uuid": {
+          "type": "string"
+        },
+        "container_count_max": {
+          "type": "integer"
+        },
+        "mounts": {
+          "type": "Hash"
+        },
+        "runtime_constraints": {
+          "type": "Hash"
+        },
+        "container_image": {
+          "type": "string"
+        },
+        "environment": {
+          "type": "Hash"
+        },
+        "cwd": {
+          "type": "string"
+        },
+        "command": {
+          "type": "Array"
+        },
+        "output_path": {
+          "type": "string"
+        },
+        "priority": {
+          "type": "integer"
+        },
+        "expires_at": {
+          "type": "datetime"
+        },
+        "filters": {
+          "type": "text"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "container_count": {
+          "type": "integer"
+        },
+        "use_existing": {
+          "type": "boolean"
+        },
+        "scheduling_parameters": {
+          "type": "Hash"
+        },
+        "output_uuid": {
+          "type": "string"
+        },
+        "log_uuid": {
+          "type": "string"
+        },
+        "output_name": {
+          "type": "string"
+        },
+        "output_ttl": {
+          "type": "integer"
+        },
+        "runtime_token": {
+          "type": "text"
+        },
+        "output_storage_classes": {
+          "type": "Array"
+        },
+        "output_properties": {
+          "type": "Hash"
+        },
+        "cumulative_cost": {
+          "type": "float"
+        }
+      }
+    },
+    "GroupList": {
+      "id": "GroupList",
+      "description": "Group list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#groupList.",
+          "default": "arvados#groupList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Groups.",
+          "items": {
+            "$ref": "Group"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Groups."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Groups."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Group": {
+      "id": "Group",
+      "description": "Group",
+      "type": "object",
+      "uuidPrefix": "j7d0g",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "group_class": {
+          "type": "string"
+        },
+        "trash_at": {
+          "type": "datetime"
+        },
+        "is_trashed": {
+          "type": "boolean"
+        },
+        "delete_at": {
+          "type": "datetime"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "frozen_by_uuid": {
+          "type": "string"
+        }
+      }
+    },
+    "HumanList": {
+      "id": "HumanList",
+      "description": "Human list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#humanList.",
+          "default": "arvados#humanList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Humans.",
+          "items": {
+            "$ref": "Human"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Humans."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Humans."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Human": {
+      "id": "Human",
+      "description": "Human",
+      "type": "object",
+      "uuidPrefix": "7a9it",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "JobTaskList": {
+      "id": "JobTaskList",
+      "description": "JobTask list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#jobTaskList.",
+          "default": "arvados#jobTaskList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of JobTasks.",
+          "items": {
+            "$ref": "JobTask"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of JobTasks."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of JobTasks."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "JobTask": {
+      "id": "JobTask",
+      "description": "JobTask",
+      "type": "object",
+      "uuidPrefix": "ot0gb",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "job_uuid": {
+          "type": "string"
+        },
+        "sequence": {
+          "type": "integer"
+        },
+        "parameters": {
+          "type": "Hash"
+        },
+        "output": {
+          "type": "text"
+        },
+        "progress": {
+          "type": "float"
+        },
+        "success": {
+          "type": "boolean"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "created_by_job_task_uuid": {
+          "type": "string"
+        },
+        "qsequence": {
+          "type": "integer"
+        },
+        "started_at": {
+          "type": "datetime"
+        },
+        "finished_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "KeepDiskList": {
+      "id": "KeepDiskList",
+      "description": "KeepDisk list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#keepDiskList.",
+          "default": "arvados#keepDiskList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of KeepDisks.",
+          "items": {
+            "$ref": "KeepDisk"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of KeepDisks."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of KeepDisks."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "KeepDisk": {
+      "id": "KeepDisk",
+      "description": "KeepDisk",
+      "type": "object",
+      "uuidPrefix": "penuu",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "ping_secret": {
+          "type": "string"
+        },
+        "node_uuid": {
+          "type": "string"
+        },
+        "filesystem_uuid": {
+          "type": "string"
+        },
+        "bytes_total": {
+          "type": "integer"
+        },
+        "bytes_free": {
+          "type": "integer"
+        },
+        "is_readable": {
+          "type": "boolean"
+        },
+        "is_writable": {
+          "type": "boolean"
+        },
+        "last_read_at": {
+          "type": "datetime"
+        },
+        "last_write_at": {
+          "type": "datetime"
+        },
+        "last_ping_at": {
+          "type": "datetime"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "keep_service_uuid": {
+          "type": "string"
+        }
+      }
+    },
+    "KeepServiceList": {
+      "id": "KeepServiceList",
+      "description": "KeepService list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#keepServiceList.",
+          "default": "arvados#keepServiceList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of KeepServices.",
+          "items": {
+            "$ref": "KeepService"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of KeepServices."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of KeepServices."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "KeepService": {
+      "id": "KeepService",
+      "description": "KeepService",
+      "type": "object",
+      "uuidPrefix": "bi6l4",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "service_host": {
+          "type": "string"
+        },
+        "service_port": {
+          "type": "integer"
+        },
+        "service_ssl_flag": {
+          "type": "boolean"
+        },
+        "service_type": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "read_only": {
+          "type": "boolean"
+        }
+      }
+    },
+    "LinkList": {
+      "id": "LinkList",
+      "description": "Link list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#linkList.",
+          "default": "arvados#linkList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Links.",
+          "items": {
+            "$ref": "Link"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Links."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Links."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Link": {
+      "id": "Link",
+      "description": "Link",
+      "type": "object",
+      "uuidPrefix": "o0j2j",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "tail_uuid": {
+          "type": "string"
+        },
+        "link_class": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "head_uuid": {
+          "type": "string"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "LogList": {
+      "id": "LogList",
+      "description": "Log list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#logList.",
+          "default": "arvados#logList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Logs.",
+          "items": {
+            "$ref": "Log"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Logs."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Logs."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Log": {
+      "id": "Log",
+      "description": "Log",
+      "type": "object",
+      "uuidPrefix": "57u5n",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "object_uuid": {
+          "type": "string"
+        },
+        "event_at": {
+          "type": "datetime"
+        },
+        "event_type": {
+          "type": "string"
+        },
+        "summary": {
+          "type": "text"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "object_owner_uuid": {
+          "type": "string"
+        }
+      }
+    },
+    "NodeList": {
+      "id": "NodeList",
+      "description": "Node list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#nodeList.",
+          "default": "arvados#nodeList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Nodes.",
+          "items": {
+            "$ref": "Node"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Nodes."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Nodes."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Node": {
+      "id": "Node",
+      "description": "Node",
+      "type": "object",
+      "uuidPrefix": "7ekkf",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "slot_number": {
+          "type": "integer"
+        },
+        "hostname": {
+          "type": "string"
+        },
+        "domain": {
+          "type": "string"
+        },
+        "ip_address": {
+          "type": "string"
+        },
+        "first_ping_at": {
+          "type": "datetime"
+        },
+        "last_ping_at": {
+          "type": "datetime"
+        },
+        "info": {
+          "type": "Hash"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "job_uuid": {
+          "type": "string"
+        }
+      }
+    },
+    "UserList": {
+      "id": "UserList",
+      "description": "User list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#userList.",
+          "default": "arvados#userList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Users.",
+          "items": {
+            "$ref": "User"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Users."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Users."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "User": {
+      "id": "User",
+      "description": "User",
+      "type": "object",
+      "uuidPrefix": "tpzed",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "email": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "identity_url": {
+          "type": "string"
+        },
+        "is_admin": {
+          "type": "boolean"
+        },
+        "prefs": {
+          "type": "Hash"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "default_owner_uuid": {
+          "type": "string"
+        },
+        "is_active": {
+          "type": "boolean"
+        },
+        "username": {
+          "type": "string"
+        },
+        "redirect_to_user_uuid": {
+          "type": "string"
+        }
+      }
+    },
+    "PipelineInstanceList": {
+      "id": "PipelineInstanceList",
+      "description": "PipelineInstance list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#pipelineInstanceList.",
+          "default": "arvados#pipelineInstanceList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of PipelineInstances.",
+          "items": {
+            "$ref": "PipelineInstance"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of PipelineInstances."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of PipelineInstances."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "PipelineInstance": {
+      "id": "PipelineInstance",
+      "description": "PipelineInstance",
+      "type": "object",
+      "uuidPrefix": "d1hrv",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "pipeline_template_uuid": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "components": {
+          "type": "Hash"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "state": {
+          "type": "string"
+        },
+        "components_summary": {
+          "type": "Hash"
+        },
+        "started_at": {
+          "type": "datetime"
+        },
+        "finished_at": {
+          "type": "datetime"
+        },
+        "description": {
+          "type": "string"
+        }
+      }
+    },
+    "PipelineTemplateList": {
+      "id": "PipelineTemplateList",
+      "description": "PipelineTemplate list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#pipelineTemplateList.",
+          "default": "arvados#pipelineTemplateList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of PipelineTemplates.",
+          "items": {
+            "$ref": "PipelineTemplate"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of PipelineTemplates."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of PipelineTemplates."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "PipelineTemplate": {
+      "id": "PipelineTemplate",
+      "description": "PipelineTemplate",
+      "type": "object",
+      "uuidPrefix": "p5p6p",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "components": {
+          "type": "Hash"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "description": {
+          "type": "string"
+        }
+      }
+    },
+    "RepositoryList": {
+      "id": "RepositoryList",
+      "description": "Repository list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#repositoryList.",
+          "default": "arvados#repositoryList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Repositories.",
+          "items": {
+            "$ref": "Repository"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Repositories."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Repositories."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Repository": {
+      "id": "Repository",
+      "description": "Repository",
+      "type": "object",
+      "uuidPrefix": "s0uqq",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "SpecimenList": {
+      "id": "SpecimenList",
+      "description": "Specimen list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#specimenList.",
+          "default": "arvados#specimenList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Specimens.",
+          "items": {
+            "$ref": "Specimen"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Specimens."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Specimens."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Specimen": {
+      "id": "Specimen",
+      "description": "Specimen",
+      "type": "object",
+      "uuidPrefix": "j58dm",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "material": {
+          "type": "string"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "properties": {
+          "type": "Hash"
+        }
+      }
+    },
+    "TraitList": {
+      "id": "TraitList",
+      "description": "Trait list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#traitList.",
+          "default": "arvados#traitList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Traits.",
+          "items": {
+            "$ref": "Trait"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Traits."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Traits."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Trait": {
+      "id": "Trait",
+      "description": "Trait",
+      "type": "object",
+      "uuidPrefix": "q1cn2",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "name": {
+          "type": "string"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "VirtualMachineList": {
+      "id": "VirtualMachineList",
+      "description": "VirtualMachine list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#virtualMachineList.",
+          "default": "arvados#virtualMachineList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of VirtualMachines.",
+          "items": {
+            "$ref": "VirtualMachine"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of VirtualMachines."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of VirtualMachines."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "VirtualMachine": {
+      "id": "VirtualMachine",
+      "description": "VirtualMachine",
+      "type": "object",
+      "uuidPrefix": "2x53u",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "hostname": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "WorkflowList": {
+      "id": "WorkflowList",
+      "description": "Workflow list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#workflowList.",
+          "default": "arvados#workflowList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of Workflows.",
+          "items": {
+            "$ref": "Workflow"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of Workflows."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of Workflows."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "Workflow": {
+      "id": "Workflow",
+      "description": "Workflow",
+      "type": "object",
+      "uuidPrefix": "7fd4e",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "text"
+        },
+        "definition": {
+          "type": "text"
+        },
+        "updated_at": {
+          "type": "datetime"
+        }
+      }
+    },
+    "UserAgreementList": {
+      "id": "UserAgreementList",
+      "description": "UserAgreement list",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "type": "string",
+          "description": "Object type. Always arvados#userAgreementList.",
+          "default": "arvados#userAgreementList"
+        },
+        "etag": {
+          "type": "string",
+          "description": "List version."
+        },
+        "items": {
+          "type": "array",
+          "description": "The list of UserAgreements.",
+          "items": {
+            "$ref": "UserAgreement"
+          }
+        },
+        "next_link": {
+          "type": "string",
+          "description": "A link to the next page of UserAgreements."
+        },
+        "next_page_token": {
+          "type": "string",
+          "description": "The page token for the next page of UserAgreements."
+        },
+        "selfLink": {
+          "type": "string",
+          "description": "A link back to this list."
+        }
+      }
+    },
+    "UserAgreement": {
+      "id": "UserAgreement",
+      "description": "UserAgreement",
+      "type": "object",
+      "uuidPrefix": "gv0sa",
+      "properties": {
+        "uuid": {
+          "type": "string"
+        },
+        "etag": {
+          "type": "string",
+          "description": "Object version."
+        },
+        "owner_uuid": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "datetime"
+        },
+        "modified_by_client_uuid": {
+          "type": "string"
+        },
+        "modified_by_user_uuid": {
+          "type": "string"
+        },
+        "modified_at": {
+          "type": "datetime"
+        },
+        "portable_data_hash": {
+          "type": "string"
+        },
+        "replication_desired": {
+          "type": "integer"
+        },
+        "replication_confirmed_at": {
+          "type": "datetime"
+        },
+        "replication_confirmed": {
+          "type": "integer"
+        },
+        "updated_at": {
+          "type": "datetime"
+        },
+        "manifest_text": {
+          "type": "text"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "properties": {
+          "type": "Hash"
+        },
+        "delete_at": {
+          "type": "datetime"
+        },
+        "file_names": {
+          "type": "text"
+        },
+        "trash_at": {
+          "type": "datetime"
+        },
+        "is_trashed": {
+          "type": "boolean"
+        },
+        "storage_classes_desired": {
+          "type": "Array"
+        },
+        "storage_classes_confirmed": {
+          "type": "Array"
+        },
+        "storage_classes_confirmed_at": {
+          "type": "datetime"
+        },
+        "current_version_uuid": {
+          "type": "string"
+        },
+        "version": {
+          "type": "integer"
+        },
+        "preserve_version": {
+          "type": "boolean"
+        },
+        "file_count": {
+          "type": "integer"
+        },
+        "file_size_total": {
+          "type": "integer"
+        }
+      }
+    }
+  },
+  "servicePath": "arvados/v1/",
+  "title": "Arvados API",
+  "version": "v1"
+}
\ No newline at end of file
diff --git a/services/api/test/integration/discovery_document_test.rb b/services/api/test/integration/discovery_document_test.rb
new file mode 100644
index 000000000..672f52f7d
--- /dev/null
+++ b/services/api/test/integration/discovery_document_test.rb
@@ -0,0 +1,53 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+require 'test_helper'
+
+class DiscoveryDocumentTest < ActionDispatch::IntegrationTest
+  CANONICAL_FIELDS = [
+    "auth",
+    "basePath",
+    "batchPath",
+    "description",
+    "discoveryVersion",
+    "documentationLink",
+    "id",
+    "kind",
+    "name",
+    "parameters",
+    "protocol",
+    "resources",
+    "revision",
+    "schemas",
+    "servicePath",
+    "title",
+    "version",
+  ]
+
+  test "canonical discovery document is saved to checkout" do
+    get "/discovery/v1/apis/arvados/v1/rest"
+    assert_response :success
+    canonical = Hash[CANONICAL_FIELDS.map { |key| [key, json_response[key]] }]
+    missing = canonical.select { |key| canonical[key].nil? }
+    assert(missing.empty?, "discovery document missing required fields")
+
+    expected = JSON.pretty_generate(canonical)
+    src_path = Rails.root.join("../../doc/arvados-v1-discovery.json")
+    begin
+      actual = File.open(src_path) { |f| f.read }
+    rescue Errno::ENOENT
+      actual = "(#{src_path} not found)"
+    end
+
+    out_path = Rails.root.join("tmp", "test-arvados-v1-discovery.json")
+    if expected != actual
+      File.open(out_path, "w") { |f| f.write(expected) }
+    end
+    assert_equal(expected, actual, [
+                   "#{src_path} did not match the live discovery document",
+                   "Current live version saved to #{out_path}",
+                   "Commit that to #{src_path} to regenerate documentation",
+                 ].join(". "))
+  end
+end

commit 09a0297320055e02a9928344dd12482940fa3e89
Author: Brett Smith <brett.smith at curii.com>
Date:   Mon Apr 10 10:53:16 2023 -0400

    18799: Remove old API documentation scripts
    
    These are no longer used.
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/doc/gen_api_method_docs.py b/doc/gen_api_method_docs.py
deleted file mode 100755
index 9a29d4616..000000000
--- a/doc/gen_api_method_docs.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#! /usr/bin/env python
-# Copyright (C) The Arvados Authors. All rights reserved.
-#
-# SPDX-License-Identifier: CC-BY-SA-3.0
-
-# gen_api_method_docs.py
-#
-# Generate docs for Arvados methods.
-#
-# This script will retrieve the discovery document at
-# https://localhost:9900/discovery/v1/apis/arvados/v1/rest
-# and will generate Textile documentation files in the current
-# directory.
-
-import argparse
-import pprint
-import re
-import requests
-import os
-import sys #debugging
-
-p = argparse.ArgumentParser(description='Generate Arvados API method documentation.')
-
-p.add_argument('--host',
-               type=str,
-               default='localhost',
-               help="The hostname or IP address of the API server")
-
-p.add_argument('--port',
-               type=int,
-               default=9900,
-               help="The port of the API server")
-
-p.add_argument('--output-dir',
-               type=str,
-               default='.',
-               help="Directory in which to write output files.")
-
-args = p.parse_args()
-
-api_url = 'https://{host}:{port}/discovery/v1/apis/arvados/v1/rest'.format(**vars(args))
-
-r = requests.get(api_url, verify=False)
-if r.status_code != 200:
-    raise Exception('Bad status code %d: %s' % (r.status_code, r.text))
-
-if 'application/json' not in r.headers.get('content-type', ''):
-    raise Exception('Unexpected content type: %s: %s' %
-                    (r.headers.get('content-type', ''), r.text))
-
-api = r.json()
-
-resource_num = 0
-for resource in sorted(api[u'resources']):
-    resource_num = resource_num + 1
-    out_fname = os.path.join(args.output_dir, resource + '.textile')
-    if os.path.exists(out_fname):
-        backup_name = out_fname + '.old'
-        try:
-            os.rename(out_fname, backup_name)
-        except OSError as e:
-            print "WARNING: could not back up {0} as {1}: {2}".format(
-                out_fname, backup_name, e)
-    outf = open(out_fname, 'w')
-    outf.write(
-"""---
-navsection: api
-navmenu: API Methods
-title: "{resource}"
-navorder: {resource_num}
----
-
-h1. {resource}
-
-Required arguments are displayed in %{{background:#ccffcc}}green%.
-
-""".format(resource_num=resource_num, resource=resource))
-
-    methods = api['resources'][resource]['methods']
-    for method in sorted(methods.keys()):
-        methodinfo = methods[method]
-        outf.write(
-"""
-h2. {method}
-
-{description}
-
-Arguments:
-
-table(table table-bordered table-condensed).
-|_. Argument |_. Type |_. Description |_. Location |_. Example |
-""".format(
-    method=method, description=methodinfo['description']))
-
-        required = []
-        notrequired = []
-        for param, paraminfo in methodinfo['parameters'].iteritems():
-            paraminfo.setdefault(u'description', '')
-            paraminfo.setdefault(u'location', '')
-            limit = ''
-            if paraminfo.get('minimum', '') or paraminfo.get('maximum', ''):
-                limit = "range {0}-{1}".format(
-                    paraminfo.get('minimum', ''),
-                    paraminfo.get('maximum', 'unlimited'))
-            if paraminfo.get('default', ''):
-                if limit:
-                    limit = limit + '; '
-                limit = limit + 'default %d' % paraminfo['default']
-            if limit:
-                paraminfo['type'] = '{0} ({1})'.format(
-                    paraminfo['type'], limit)
-
-            row = "|{param}|{type}|{description}|{location}||\n".format(
-                param=param, **paraminfo)
-            if paraminfo.get('required', False):
-                required.append(row)
-            else:
-                notrequired.append(row)
-
-        for row in sorted(required):
-            outf.write("{background:#ccffcc}." + row)
-        for row in sorted(notrequired):
-            outf.write(row)
-
-        # pprint.pprint(methodinfo)
-
-    outf.close()
-    print "wrote ", out_fname
-
-
diff --git a/doc/gen_api_schema_docs.py b/doc/gen_api_schema_docs.py
deleted file mode 100755
index 3c3ab2ead..000000000
--- a/doc/gen_api_schema_docs.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#! /usr/bin/env python
-# Copyright (C) The Arvados Authors. All rights reserved.
-#
-# SPDX-License-Identifier: CC-BY-SA-3.0
-
-# gen_api_schema_docs.py
-#
-# Generate Textile documentation pages for Arvados schema resources.
-
-import requests
-import re
-import os
-
-r = requests.get('https://localhost:9900/arvados/v1/schema',
-                 verify=False)
-if r.status_code != 200:
-    raise Exception('Bad status code %d: %s' % (r.status_code, r.text))
-
-if 'application/json' not in r.headers.get('content-type', ''):
-    raise Exception('Unexpected content type: %s: %s' %
-                    (r.headers.get('content-type', ''), r.text))
-
-schema = r.json()
-navorder = 0
-for resource in sorted(schema.keys()):
-    navorder = navorder + 1
-    properties = schema[resource]
-    res_api_endpoint = re.sub(r'([a-z])([A-Z])', r'\1_\2', resource).lower()
-    outfile = "{}.textile".format(resource)
-    if os.path.exists(outfile):
-        outfile = "{}_new.textile".format(resource)
-    print outfile, "..."
-    with open(outfile, "w") as f:
-        f.write("""---
-layout: default
-navsection: api
-navmenu: Schema
-title: {resource}
----
-
-h1. {resource}
-
-A **{resource}** represents...
-
-h2. Methods
-
-        See "REST methods for working with Arvados resources":{{{{site.baseurl}}}}/api/methods.html
-
-API endpoint base: @https://{{{{ site.arvados_api_host }}}}/arvados/v1/{res_api_endpoint}@
-
-h2. Creation
-
-h3. Prerequisites
-
-Prerequisites for creating a {resource}.
-
-h3. Side effects
-
-Side effects of creating a {resource}.
-
-h2. Resources
-
-Each {resource} has, in addition to the usual "attributes of Arvados resources":resources.html:
-
-table(table table-bordered table-condensed).
-|_. Attribute|_. Type|_. Description|_. Example|
-""".format(
-    resource=resource,
-    navorder=navorder,
-    res_api_endpoint=res_api_endpoint))
-
-        for prop in properties:
-            if prop not in ['id', 'uuid', 'href', 'kind', 'etag', 'self_link',
-                            'owner_uuid', 'created_at',
-                            'modified_by_client_uuid',
-                            'modified_by_user_uuid',
-                            'modified_at']:
-                f.write('|{name}|{type}|||\n'.format(**prop))
-

commit 8b979548c070a93eda006b45f99e256b8a61fb8d
Author: Brett Smith <brett.smith at curii.com>
Date:   Fri Mar 31 17:38:33 2023 -0400

    18799: Add deprecation notices to API pydoc
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/discovery2pydoc.py b/sdk/python/discovery2pydoc.py
index 8f3c512ad..617d545ac 100755
--- a/sdk/python/discovery2pydoc.py
+++ b/sdk/python/discovery2pydoc.py
@@ -42,6 +42,32 @@ NAME_KEY = operator.attrgetter('name')
 STDSTREAM_PATH = pathlib.Path('-')
 TITLECASE = operator.methodcaller('title')
 
+_ALIASED_METHODS = frozenset([
+    'destroy',
+    'index',
+    'show',
+])
+_DEPRECATED_NOTICE = '''
+
+!!! deprecated
+    This resource is deprecated in the Arvados API.
+'''
+_DEPRECATED_RESOURCES = frozenset([
+    'Humans',
+    'JobTasks',
+    'Jobs',
+    'KeepDisks',
+    'Nodes',
+    'PipelineInstances',
+    'PipelineTemplates',
+    'Specimens'
+    'Traits',
+])
+_DEPRECATED_SCHEMAS = frozenset([
+    *(name[:-1] for name in _DEPRECATED_RESOURCES),
+    *(f'{name[:-1]}List' for name in _DEPRECATED_RESOURCES),
+])
+
 _TYPE_MAP = {
     # Map the API's JavaScript-based type names to Python annotations.
     # Some of these may disappear after Arvados issue #19795 is fixed.
@@ -159,24 +185,29 @@ class Method:
             returns = 'dict[str, Any]'
         return inspect.Signature(parameters, return_annotation=returns)
 
-    def doc(self) -> str:
-        doc_lines = [self._spec['description'].splitlines()[0], '\n']
+    def doc(self, doc_slice: slice=slice(None)) -> str:
+        doc_lines = self._spec['description'].splitlines(keepends=True)[doc_slice]
+        if not doc_lines[-1].endswith('\n'):
+            doc_lines.append('\n')
         if self._required_params:
             doc_lines.append("\nRequired parameters:\n")
             doc_lines.extend(param.doc() for param in self._required_params)
         if self._optional_params:
             doc_lines.append("\nOptional parameters:\n")
             doc_lines.extend(param.doc() for param in self._optional_params)
-        return re.sub(r'\n{3,}', '\n\n', f'''
+        return f'''
     def {self.name}{self.signature()}:
 {to_docstring(''.join(doc_lines), 8)}
-''')
+'''
 
 
 def document_schema(name: str, spec: Mapping[str, Any]) -> str:
+    description = spec['description']
+    if name in _DEPRECATED_SCHEMAS:
+        description += _DEPRECATED_NOTICE
     lines = [
         f"class {name}(TypedDict, total=False):",
-        to_docstring(spec['description'], 4),
+        to_docstring(description, 4),
     ]
     for field_name, field_spec in spec['properties'].items():
         field_type = get_type_annotation(field_spec['type'])
@@ -203,10 +234,18 @@ def document_schema(name: str, spec: Mapping[str, Any]) -> str:
     return '\n'.join(lines)
 
 def document_resource(name: str, spec: Mapping[str, Any]) -> str:
-    methods = [Method(key, meth_spec) for key, meth_spec in spec['methods'].items()]
-    return f'''class {classify_name(name)}:
-    """Methods to query and manipulate Arvados {humanize_name(name)}"""
-{''.join(method.doc() for method in sorted(methods, key=NAME_KEY))}
+    class_name = classify_name(name)
+    docstring = f"Methods to query and manipulate Arvados {humanize_name(name)}"
+    if class_name in _DEPRECATED_RESOURCES:
+        docstring += _DEPRECATED_NOTICE
+    methods = [
+        Method(key, meth_spec)
+        for key, meth_spec in spec['methods'].items()
+        if key not in _ALIASED_METHODS
+    ]
+    return f'''class {class_name}:
+{to_docstring(docstring, 4)}
+{''.join(method.doc(slice(1)) for method in sorted(methods, key=NAME_KEY))}
 '''
 
 def parse_arguments(arglist: Optional[Sequence[str]]) -> argparse.Namespace:
@@ -266,8 +305,11 @@ def main(arglist: Optional[Sequence[str]]=None) -> int:
     print('''class ArvadosAPIClient:''', file=args.out_file)
     for name, _ in resources:
         class_name = classify_name(name)
+        docstring = f"Return an instance of `{class_name}` to call methods via this client"
+        if class_name in _DEPRECATED_RESOURCES:
+            docstring += _DEPRECATED_NOTICE
         method_spec = {
-            'description': f"Return an instance of `{class_name}` to call methods via this client",
+            'description': docstring,
             'parameters': {},
             'response': {
                 '$ref': class_name,

commit b21a5b18225f1e333f83b5ec9a79b5ac937567d5
Author: Brett Smith <brett.smith at curii.com>
Date:   Fri Mar 31 16:36:47 2023 -0400

    18799: Include schemas in API pydoc
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/discovery2pydoc.py b/sdk/python/discovery2pydoc.py
index 19636da8f..8f3c512ad 100755
--- a/sdk/python/discovery2pydoc.py
+++ b/sdk/python/discovery2pydoc.py
@@ -42,6 +42,34 @@ NAME_KEY = operator.attrgetter('name')
 STDSTREAM_PATH = pathlib.Path('-')
 TITLECASE = operator.methodcaller('title')
 
+_TYPE_MAP = {
+    # Map the API's JavaScript-based type names to Python annotations.
+    # Some of these may disappear after Arvados issue #19795 is fixed.
+    'Array': 'list',
+    'array': 'list',
+    'boolean': 'bool',
+    # datetime fields are strings in ISO 8601 format.
+    'datetime': 'str',
+    'Hash': 'dict[str, Any]',
+    'integer': 'int',
+    'object': 'dict[str, Any]',
+    'string': 'str',
+    'text': 'str',
+}
+
+def get_type_annotation(name: str) -> str:
+    return _TYPE_MAP.get(name, name)
+
+def to_docstring(s: str, indent: int) -> str:
+    prefix = ' ' * indent
+    s = s.replace('"""', '""\"')
+    s = re.sub(r'(\n+)', r'\1' + prefix, s)
+    s = s.strip()
+    if '\n' in s:
+        return f'{prefix}"""{s}\n{prefix}"""'
+    else:
+        return f'{prefix}"""{s}"""'
+
 def transform_name(s: str, sep: str, fix_part: Callable[[str], str]) -> str:
     return sep.join(fix_part(part) for part in s.split('_'))
 
@@ -52,15 +80,6 @@ def humanize_name(s: str) -> str:
     return transform_name(s, ' ', LOWERCASE)
 
 class Parameter(inspect.Parameter):
-    _TYPE_MAP = {
-        # Map the API's JavaScript-based type names to Python annotations
-        'array': 'list',
-        'boolean': 'bool',
-        'integer': 'int',
-        'object': 'dict[str, Any]',
-        'string': 'str',
-    }
-
     def __init__(self, name: str, spec: Mapping[str, Any]) -> None:
         self.api_name = name
         self._spec = spec
@@ -69,7 +88,7 @@ class Parameter(inspect.Parameter):
         super().__init__(
             name,
             inspect.Parameter.KEYWORD_ONLY,
-            annotation=self.annotation_from_type(),
+            annotation=get_type_annotation(self._spec['type']),
             # In normal Python the presence of a default tells you whether or
             # not an argument is required. In the API the `required` flag tells
             # us that, and defaults are specified inconsistently. Don't show
@@ -80,10 +99,6 @@ class Parameter(inspect.Parameter):
             default=inspect.Parameter.empty,
         )
 
-    def annotation_from_type(self) -> str:
-        src_type = self._spec['type']
-        return self._TYPE_MAP.get(src_type, src_type)
-
     def default_value(self) -> object:
         try:
             src_value: str = self._spec['default']
@@ -111,8 +126,8 @@ class Parameter(inspect.Parameter):
         # parsers retain the definition list structure.
         description = self._spec['description'] or '\u200b'
         return f'''
-        {self.api_name}: {self.annotation}
-        : {description}{default_doc}
+{self.api_name}: {self.annotation}
+: {description}{default_doc}
 '''
 
 
@@ -138,23 +153,54 @@ class Method:
             *self._required_params,
             *self._optional_params,
         ]
-        return inspect.Signature(parameters, return_annotation='dict[str, Any]')
+        try:
+            returns = get_type_annotation(self._spec['response']['$ref'])
+        except KeyError:
+            returns = 'dict[str, Any]'
+        return inspect.Signature(parameters, return_annotation=returns)
 
     def doc(self) -> str:
+        doc_lines = [self._spec['description'].splitlines()[0], '\n']
+        if self._required_params:
+            doc_lines.append("\nRequired parameters:\n")
+            doc_lines.extend(param.doc() for param in self._required_params)
+        if self._optional_params:
+            doc_lines.append("\nOptional parameters:\n")
+            doc_lines.extend(param.doc() for param in self._optional_params)
         return re.sub(r'\n{3,}', '\n\n', f'''
     def {self.name}{self.signature()}:
-        """{self._spec['description'].splitlines()[0]}
-
-{"        Required parameters:" if self._required_params else ""}
+{to_docstring(''.join(doc_lines), 8)}
+''')
 
-{''.join(param.doc() for param in self._required_params)}
 
-{"        Optional parameters:" if self._optional_params else ""}
+def document_schema(name: str, spec: Mapping[str, Any]) -> str:
+    lines = [
+        f"class {name}(TypedDict, total=False):",
+        to_docstring(spec['description'], 4),
+    ]
+    for field_name, field_spec in spec['properties'].items():
+        field_type = get_type_annotation(field_spec['type'])
+        try:
+            subtype = field_spec['items']['$ref']
+        except KeyError:
+            pass
+        else:
+            field_type += f"[{get_type_annotation(subtype)}]"
 
-{''.join(param.doc() for param in self._optional_params)}
-        """
-''')
+        field_line = f"    {field_name}: {field_type!r}"
+        try:
+            field_line += f" = {field_spec['default']!r}"
+        except KeyError:
+            pass
+        lines.append(field_line)
 
+        field_doc: str = field_spec.get('description', '')
+        if field_spec['type'] == 'datetime':
+            field_doc += "\n\nString in ISO 8601 datetime format. Pass it to `ciso8601.parse_datetime` to build a `datetime.datetime`."
+        if field_doc:
+            lines.append(to_docstring(field_doc, 4))
+    lines.append('\n')
+    return '\n'.join(lines)
 
 def document_resource(name: str, spec: Mapping[str, Any]) -> str:
     methods = [Method(key, meth_spec) for key, meth_spec in spec['methods'].items()]
@@ -207,16 +253,25 @@ def main(arglist: Optional[Sequence[str]]=None) -> int:
             )
             return os.EX_IOERR
         discovery_document = json.load(discovery_file)
-    resources = sorted(discovery_document['resources'].items())
+    print('''from typing import Any, TypedDict''', file=args.out_file)
 
+    schemas = sorted(discovery_document['schemas'].items())
+    for name, schema_spec in schemas:
+        print(document_schema(name, schema_spec), file=args.out_file)
+
+    resources = sorted(discovery_document['resources'].items())
     for name, resource_spec in resources:
         print(document_resource(name, resource_spec), file=args.out_file)
 
     print('''class ArvadosAPIClient:''', file=args.out_file)
     for name, _ in resources:
+        class_name = classify_name(name)
         method_spec = {
-            'description': f"Return an instance of `{classify_name(name)}` to call methods via this client",
+            'description': f"Return an instance of `{class_name}` to call methods via this client",
             'parameters': {},
+            'response': {
+                '$ref': class_name,
+            },
         }
         print(Method(name, method_spec).doc(), file=args.out_file)
 

commit 4109c502bc67c82479ddaf95f1754e0769c012d4
Author: Brett Smith <brett.smith at curii.com>
Date:   Fri Mar 31 14:32:34 2023 -0400

    18799: Initial prototype of API pydoc generator
    
    See the script docstring for rationale.
    
    Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith at curii.com>

diff --git a/sdk/python/discovery2pydoc.py b/sdk/python/discovery2pydoc.py
new file mode 100755
index 000000000..19636da8f
--- /dev/null
+++ b/sdk/python/discovery2pydoc.py
@@ -0,0 +1,226 @@
+#!/usr/bin/env python3
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+"""discovery2pydoc - Build skeleton Python from the Arvados discovery document
+
+This tool reads the Arvados discovery document and writes a Python source file
+with classes and methods that correspond to the resources that
+google-api-python-client builds dynamically. This source does not include any
+implementation, but it does include real method signatures and documentation
+strings, so it's useful as documentation for tools that read Python source,
+including pydoc and pdoc.
+
+If you run this tool with the path to a discovery document, it uses no
+dependencies outside the Python standard library. If it needs to read
+configuration to find the discovery document dynamically, it'll load the
+`arvados` module to do that.
+"""
+
+import argparse
+import inspect
+import json
+import keyword
+import operator
+import os
+import pathlib
+import re
+import sys
+import urllib.parse
+import urllib.request
+
+from typing import (
+    Any,
+    Callable,
+    Mapping,
+    Optional,
+    Sequence,
+)
+
+LOWERCASE = operator.methodcaller('lower')
+NAME_KEY = operator.attrgetter('name')
+STDSTREAM_PATH = pathlib.Path('-')
+TITLECASE = operator.methodcaller('title')
+
+def transform_name(s: str, sep: str, fix_part: Callable[[str], str]) -> str:
+    return sep.join(fix_part(part) for part in s.split('_'))
+
+def classify_name(s: str) -> str:
+    return transform_name(s, '', TITLECASE)
+
+def humanize_name(s: str) -> str:
+    return transform_name(s, ' ', LOWERCASE)
+
+class Parameter(inspect.Parameter):
+    _TYPE_MAP = {
+        # Map the API's JavaScript-based type names to Python annotations
+        'array': 'list',
+        'boolean': 'bool',
+        'integer': 'int',
+        'object': 'dict[str, Any]',
+        'string': 'str',
+    }
+
+    def __init__(self, name: str, spec: Mapping[str, Any]) -> None:
+        self.api_name = name
+        self._spec = spec
+        if keyword.iskeyword(name):
+            name += '_'
+        super().__init__(
+            name,
+            inspect.Parameter.KEYWORD_ONLY,
+            annotation=self.annotation_from_type(),
+            # In normal Python the presence of a default tells you whether or
+            # not an argument is required. In the API the `required` flag tells
+            # us that, and defaults are specified inconsistently. Don't show
+            # defaults in the signature: it adds noise and makes things more
+            # confusing for the reader about what's required and what's
+            # optional. The docstring can explain in better detail, including
+            # the default value.
+            default=inspect.Parameter.empty,
+        )
+
+    def annotation_from_type(self) -> str:
+        src_type = self._spec['type']
+        return self._TYPE_MAP.get(src_type, src_type)
+
+    def default_value(self) -> object:
+        try:
+            src_value: str = self._spec['default']
+        except KeyError:
+            return None
+        if src_value == 'true':
+            return True
+        elif src_value == 'false':
+            return False
+        elif src_value.isdigit():
+            return int(src_value)
+        else:
+            return src_value
+
+    def is_required(self) -> bool:
+        return self._spec['required']
+
+    def doc(self) -> str:
+        default_value = self.default_value()
+        if default_value is None:
+            default_doc = ''
+        else:
+            default_doc = f" Default {default_value!r}."
+        # If there is no description, use a zero-width space to help Markdown
+        # parsers retain the definition list structure.
+        description = self._spec['description'] or '\u200b'
+        return f'''
+        {self.api_name}: {self.annotation}
+        : {description}{default_doc}
+'''
+
+
+class Method:
+    def __init__(self, name: str, spec: Mapping[str, Any]) -> None:
+        self.name = name
+        self._spec = spec
+        self._required_params = []
+        self._optional_params = []
+        for param_name, param_spec in spec['parameters'].items():
+            param = Parameter(param_name, param_spec)
+            if param.is_required():
+                param_list = self._required_params
+            else:
+                param_list = self._optional_params
+            param_list.append(param)
+        self._required_params.sort(key=NAME_KEY)
+        self._optional_params.sort(key=NAME_KEY)
+
+    def signature(self) -> inspect.Signature:
+        parameters = [
+            inspect.Parameter('self', inspect.Parameter.POSITIONAL_ONLY),
+            *self._required_params,
+            *self._optional_params,
+        ]
+        return inspect.Signature(parameters, return_annotation='dict[str, Any]')
+
+    def doc(self) -> str:
+        return re.sub(r'\n{3,}', '\n\n', f'''
+    def {self.name}{self.signature()}:
+        """{self._spec['description'].splitlines()[0]}
+
+{"        Required parameters:" if self._required_params else ""}
+
+{''.join(param.doc() for param in self._required_params)}
+
+{"        Optional parameters:" if self._optional_params else ""}
+
+{''.join(param.doc() for param in self._optional_params)}
+        """
+''')
+
+
+def document_resource(name: str, spec: Mapping[str, Any]) -> str:
+    methods = [Method(key, meth_spec) for key, meth_spec in spec['methods'].items()]
+    return f'''class {classify_name(name)}:
+    """Methods to query and manipulate Arvados {humanize_name(name)}"""
+{''.join(method.doc() for method in sorted(methods, key=NAME_KEY))}
+'''
+
+def parse_arguments(arglist: Optional[Sequence[str]]) -> argparse.Namespace:
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--output-file', '-O',
+        type=pathlib.Path,
+        metavar='PATH',
+        default=STDSTREAM_PATH,
+        help="""Path to write output. Specify `-` to use stdout (the default)
+""")
+    parser.add_argument(
+        'discovery_url',
+        nargs=argparse.OPTIONAL,
+        metavar='URL',
+        help="""URL or file path of a discovery document to load.
+Specify `-` to use stdin.
+If not provided, retrieved dynamically from Arvados client configuration.
+""")
+    args = parser.parse_args(arglist)
+    if args.discovery_url is None:
+        from arvados.api import api_kwargs_from_config
+        discovery_fmt = api_kwargs_from_config('v1')['discoveryServiceUrl']
+        args.discovery_url = discovery_fmt.format(api='arvados', apiVersion='v1')
+    elif args.discovery_url == '-':
+        args.discovery_url = 'file:///dev/stdin'
+    else:
+        parts = urllib.parse.urlsplit(args.discovery_url)
+        if not (parts.scheme or parts.netloc):
+            args.discovery_url = urllib.parse.urlunsplit(parts._replace(scheme='file'))
+    if args.output_file == STDSTREAM_PATH:
+        args.out_file = sys.stdout
+    else:
+        args.out_file = args.output_file.open('w')
+    return args
+
+def main(arglist: Optional[Sequence[str]]=None) -> int:
+    args = parse_arguments(arglist)
+    with urllib.request.urlopen(args.discovery_url) as discovery_file:
+        if not (discovery_file.status is None or 200 <= discovery_file.status < 300):
+            print(
+                f"error getting {args.discovery_url}: server returned {discovery_file.status}",
+                file=sys.stderr,
+            )
+            return os.EX_IOERR
+        discovery_document = json.load(discovery_file)
+    resources = sorted(discovery_document['resources'].items())
+
+    for name, resource_spec in resources:
+        print(document_resource(name, resource_spec), file=args.out_file)
+
+    print('''class ArvadosAPIClient:''', file=args.out_file)
+    for name, _ in resources:
+        method_spec = {
+            'description': f"Return an instance of `{classify_name(name)}` to call methods via this client",
+            'parameters': {},
+        }
+        print(Method(name, method_spec).doc(), file=args.out_file)
+
+    return os.EX_OK
+
+if __name__ == '__main__':
+    sys.exit(main())

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list