X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/450b51a554050504d6b510c2c9c1adf463b937a0..a3d2b8e1de5b8c785846ddc57ae9a4c02bc51adc:/services/api/app/controllers/arvados/v1/schema_controller.rb?ds=sidebyside diff --git a/services/api/app/controllers/arvados/v1/schema_controller.rb b/services/api/app/controllers/arvados/v1/schema_controller.rb index ced2f16207..0300b75075 100644 --- a/services/api/app/controllers/arvados/v1/schema_controller.rb +++ b/services/api/app/controllers/arvados/v1/schema_controller.rb @@ -8,6 +8,7 @@ class Arvados::V1::SchemaController < ApplicationController skip_before_action :find_object_by_uuid skip_before_action :load_filters_param skip_before_action :load_limit_offset_order_params + skip_before_action :load_select_param skip_before_action :load_read_auths skip_before_action :load_where_param skip_before_action :render_404_if_no_object @@ -25,13 +26,18 @@ class Arvados::V1::SchemaController < ApplicationController def discovery_doc Rails.cache.fetch 'arvados_v1_rest_discovery' do Rails.application.eager_load! + remoteHosts = {} + Rails.configuration.RemoteClusters.each {|k,v| if k != :"*" then remoteHosts[k] = v["Host"] end } discovery = { kind: "discovery#restDescription", discoveryVersion: "v1", id: "arvados:v1", name: "arvados", version: "v1", - revision: "20131114", + # format is YYYYMMDD, must be fixed width (needs to be lexically + # sortable), updated manually, may be used by clients to + # determine availability of API server features. + revision: "20220510", source_version: AppVersion.hash, sourceVersion: AppVersion.hash, # source_version should be deprecated in the future packageVersion: AppVersion.package_version, @@ -39,34 +45,35 @@ class Arvados::V1::SchemaController < ApplicationController title: "Arvados API", description: "The API to interact with Arvados.", documentationLink: "http://doc.arvados.org/api/index.html", - defaultCollectionReplication: Rails.configuration.Collections["DefaultReplication"], + defaultCollectionReplication: Rails.configuration.Collections.DefaultReplication, protocol: "rest", baseUrl: root_url + "arvados/v1/", basePath: "/arvados/v1/", rootUrl: root_url, servicePath: "arvados/v1/", batchPath: "batch", - uuidPrefix: Rails.application.config.ClusterID, - defaultTrashLifetime: Rails.application.config.Collections["DefaultTrashLifetime"], - blobSignatureTtl: Rails.application.config.Collections["BlobSigningTTL"], - maxRequestSize: Rails.application.config.API["MaxRequestSize"], - maxItemsPerResponse: Rails.application.API["MaxItemsPerResponse"], - dockerImageFormats: Rails.application.config.Containers["SupportedDockerImageFormats"], - crunchLogBytesPerEvent: Rails.application.config.Containers["Logging"]["LogBytesPerEvent"], - crunchLogSecondsBetweenEvents: Rails.application.config.Containers["Logging"]["LogSecondsBetweenEvents"], - crunchLogThrottlePeriod: Rails.application.config.Containers["Logging"]["LogThrottlePeriod"], - crunchLogThrottleBytes: Rails.application.config.Containers["Logging"]["LogThrottleBytes"], - crunchLogThrottleLines: Rails.application.config.Containers["Logging"]["LogThrottleLines"], - crunchLimitLogBytesPerJob: Rails.application.config.Containers["Logging"]["LimitLogBytesPerJob"], - crunchLogPartialLineThrottlePeriod: Rails.application.config.Containers["Logging"]["LogPartialLineThrottlePeriod"], - crunchLogUpdatePeriod: Rails.application.config.Containers["Logging"]["LogUpdatePeriod"], - crunchLogUpdateSize: Rails.application.config.Containers["Logging"]["LogUpdateSize"], - remoteHosts: Rails.application.config.RemoteClusters.map {|k,v| v.Host}, - remoteHostsViaDNS: Rails.application.config.RemoteClusters["*"]["Proxy"], - websocketUrl: Rails.application.config.Services["Websocket"]["ExternalURL"], - workbenchUrl: Rails.application.config.Services["Workbench1"]["ExternalURL"], - keepWebServiceUrl: Rails.application.config.Services["WebDAV"]["ExternalURL"], - gitUrl: Rails.application.config.Services["GitHTTP"]["ExternalURL"], + uuidPrefix: Rails.configuration.ClusterID, + defaultTrashLifetime: Rails.configuration.Collections.DefaultTrashLifetime, + blobSignatureTtl: Rails.configuration.Collections.BlobSigningTTL, + maxRequestSize: Rails.configuration.API.MaxRequestSize, + maxItemsPerResponse: Rails.configuration.API.MaxItemsPerResponse, + dockerImageFormats: Rails.configuration.Containers.SupportedDockerImageFormats.keys, + crunchLogBytesPerEvent: Rails.configuration.Containers.Logging.LogBytesPerEvent, + crunchLogSecondsBetweenEvents: Rails.configuration.Containers.Logging.LogSecondsBetweenEvents, + crunchLogThrottlePeriod: Rails.configuration.Containers.Logging.LogThrottlePeriod, + crunchLogThrottleBytes: Rails.configuration.Containers.Logging.LogThrottleBytes, + crunchLogThrottleLines: Rails.configuration.Containers.Logging.LogThrottleLines, + crunchLimitLogBytesPerJob: Rails.configuration.Containers.Logging.LimitLogBytesPerJob, + crunchLogPartialLineThrottlePeriod: Rails.configuration.Containers.Logging.LogPartialLineThrottlePeriod, + crunchLogUpdatePeriod: Rails.configuration.Containers.Logging.LogUpdatePeriod, + crunchLogUpdateSize: Rails.configuration.Containers.Logging.LogUpdateSize, + remoteHosts: remoteHosts, + remoteHostsViaDNS: Rails.configuration.RemoteClusters["*"].Proxy, + websocketUrl: Rails.configuration.Services.Websocket.ExternalURL.to_s, + workbenchUrl: Rails.configuration.Services.Workbench1.ExternalURL.to_s, + workbench2Url: Rails.configuration.Services.Workbench2.ExternalURL.to_s, + keepWebServiceUrl: Rails.configuration.Services.WebDAV.ExternalURL.to_s, + gitUrl: Rails.configuration.Services.GitHTTP.ExternalURL.to_s, parameters: { alt: { type: "string", @@ -99,10 +106,10 @@ class Arvados::V1::SchemaController < ApplicationController auth: { oauth2: { scopes: { - "https://api.curoverse.com/auth/arvados" => { + "https://api.arvados.org/auth/arvados" => { description: "View and manage objects" }, - "https://api.curoverse.com/auth/arvados.readonly" => { + "https://api.arvados.org/auth/arvados.readonly" => { description: "View objects" } } @@ -214,8 +221,8 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => k.to_s }, scopes: [ - "https://api.curoverse.com/auth/arvados", - "https://api.curoverse.com/auth/arvados.readonly" + "https://api.arvados.org/auth/arvados", + "https://api.arvados.org/auth/arvados.readonly" ] }, index: { @@ -250,8 +257,8 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => "#{k.to_s}List" }, scopes: [ - "https://api.curoverse.com/auth/arvados", - "https://api.curoverse.com/auth/arvados.readonly" + "https://api.arvados.org/auth/arvados", + "https://api.arvados.org/auth/arvados.readonly" ] }, create: { @@ -272,7 +279,7 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => k.to_s }, scopes: [ - "https://api.curoverse.com/auth/arvados" + "https://api.arvados.org/auth/arvados" ] }, update: { @@ -300,7 +307,7 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => k.to_s }, scopes: [ - "https://api.curoverse.com/auth/arvados" + "https://api.arvados.org/auth/arvados" ] }, delete: { @@ -320,7 +327,7 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => k.to_s }, scopes: [ - "https://api.curoverse.com/auth/arvados" + "https://api.arvados.org/auth/arvados" ] } } @@ -347,7 +354,7 @@ class Arvados::V1::SchemaController < ApplicationController "$ref" => (action == 'index' ? "#{k.to_s}List" : k.to_s) }, scopes: [ - "https://api.curoverse.com/auth/arvados" + "https://api.arvados.org/auth/arvados" ] } route.segment_keys.each do |key| @@ -398,8 +405,86 @@ class Arvados::V1::SchemaController < ApplicationController end end end - Rails.configuration.API["DisabledAPIs"].each do |method| - ctrl, action = method.split('.', 2) + + # The 'replace_files' option is implemented in lib/controller, + # not Rails -- we just need to add it here so discovery-aware + # clients know how to validate it. + [:create, :update].each do |action| + discovery[:resources]['collections'][:methods][action][:parameters]['replace_files'] = { + type: 'object', + description: 'Files and directories to initialize/replace with content from other collections.', + required: false, + location: 'query', + properties: {}, + additionalProperties: {type: 'string'}, + } + end + + discovery[:resources]['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" + ] + }, + } + } + + discovery[:resources]['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" + ] + }, + } + } + + discovery[:resources]['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" + ] + }, + } + } + + Rails.configuration.API.DisabledAPIs.each do |method, _| + ctrl, action = method.to_s.split('.', 2) discovery[:resources][ctrl][:methods].delete(action.to_sym) end discovery