X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0b9a7fb2c29104c40978ca4e97b8c1ecd2573d69..1452044e468074674b5a16c1990ada4f2c1485ec:/apps/workbench/app/models/arvados_api_client.rb diff --git a/apps/workbench/app/models/arvados_api_client.rb b/apps/workbench/app/models/arvados_api_client.rb index 9f92b03114..39036bc8bf 100644 --- a/apps/workbench/app/models/arvados_api_client.rb +++ b/apps/workbench/app/models/arvados_api_client.rb @@ -9,7 +9,7 @@ class ArvadosApiClient @@client_mtx = Mutex.new @@api_client = nil - @@profiling_enabled = Rails.configuration.profiling_enabled rescue false + @@profiling_enabled = Rails.configuration.profiling_enabled def api(resources_kind, action, data=nil) profile_checkpoint @@ -19,6 +19,9 @@ class ArvadosApiClient @@api_client = HTTPClient.new if Rails.configuration.arvados_insecure_https @@api_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE + else + # Use system CA certificates + @@api_client.ssl_config.add_trust_ca('/etc/ssl/certs') end end end @@ -29,6 +32,9 @@ class ArvadosApiClient resources_kind = class_kind(resources_kind).pluralize if resources_kind.is_a? Class url = "#{self.arvados_v1_base}/#{resources_kind}#{action}" + # Clean up /arvados/v1/../../discovery/v1 to /discovery/v1 + url.sub! '/arvados/v1/../../', '/' + query = {"api_token" => api_token} if !data.nil? data.each do |k,v| @@ -74,7 +80,7 @@ class ArvadosApiClient if msg.status_code != 200 errors = resp[:errors] errors = errors.join("\n\n") if errors.is_a? Array - raise "API error #{msg.status_code}:\n\n#{errors}\n" + raise "#{errors} [API: #{msg.status_code}]" end if resp[:_profile] Rails.logger.info "API client: " \ @@ -84,14 +90,26 @@ class ArvadosApiClient resp end + def self.patch_paging_vars(ary, items_available, offset, limit) + if items_available + (class << ary; self; end).class_eval { attr_accessor :items_available } + ary.items_available = items_available + end + if offset + (class << ary; self; end).class_eval { attr_accessor :offset } + ary.offset = offset + end + if limit + (class << ary; self; end).class_eval { attr_accessor :limit } + ary.limit = limit + end + ary + end + def unpack_api_response(j, kind=nil) if j.is_a? Hash and j[:items].is_a? Array and j[:kind].match(/(_list|List)$/) ary = j[:items].collect { |x| unpack_api_response x, j[:kind] } - if j[:items_available] - (class << ary; self; end).class_eval { attr_accessor :items_available } - ary.items_available = j[:items_available] - end - ary + self.class.patch_paging_vars(ary, j[:items_available], j[:offset], j[:limit]) elsif j.is_a? Hash and (kind || j[:kind]) oclass = self.kind_class(kind || j[:kind]) if oclass @@ -131,8 +149,8 @@ class ArvadosApiClient Rails.configuration.arvados_v1_base end - def arvados_schema - @arvados_schema ||= api 'schema', '' + def discovery + @discovery ||= api '../../discovery/v1/apis/arvados/v1/rest', '' end def kind_class(kind) @@ -145,6 +163,7 @@ class ArvadosApiClient protected def profile_checkpoint label=nil + return if !@@profiling_enabled label = yield if block_given? t = Time.now if label and @profile_t0