X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/da51b9328abab2df757ed13eadc7c3557315094b..7c21045a213c5cc8846a263124271c93d38d78b1:/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 84735d9774..c7f7d3435e 100644 --- a/apps/workbench/app/models/arvados_api_client.rb +++ b/apps/workbench/app/models/arvados_api_client.rb @@ -9,13 +9,13 @@ 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 @@client_mtx.synchronize do - if not @@api_client + if not @@api_client @@api_client = HTTPClient.new if Rails.configuration.arvados_insecure_https @@api_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE @@ -26,16 +26,16 @@ class ArvadosApiClient end end - api_token = Thread.current[:arvados_api_token] - api_token ||= '' - 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} + query = { + 'api_token' => Thread.current[:arvados_api_token] || '', + 'reader_tokens' => (Thread.current[:reader_tokens] || []).to_json, + } if !data.nil? data.each do |k,v| if v.is_a? String or v.nil? @@ -54,11 +54,11 @@ class ArvadosApiClient if @@profiling_enabled query["_profile"] = "true" end - + header = {"Accept" => "application/json"} profile_checkpoint { "Prepare request #{url} #{query[:uuid]} #{query[:where]}" } - msg = @@api_client.post(url, + msg = @@api_client.post(url, query, header: header) profile_checkpoint 'API transaction' @@ -68,7 +68,7 @@ class ArvadosApiClient end json = msg.content - + begin resp = Oj.load(json, :symbol_keys => true) rescue Oj::ParseError @@ -90,14 +90,34 @@ class ArvadosApiClient resp end + def self.patch_paging_vars(ary, items_available, offset, limit, links=nil) + 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 + if links + (class << ary; self; end).class_eval { attr_accessor :links } + ary.links = links + 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] + ary = j[:items].collect { |x| unpack_api_response x, x[:kind] } + links = ArvadosResourceList.new Link + links.results = (j[:links] || []).collect do |x| + unpack_api_response x, x[:kind] end - ary + self.class.patch_paging_vars(ary, j[:items_available], j[:offset], j[:limit], links) elsif j.is_a? Hash and (kind || j[:kind]) oclass = self.kind_class(kind || j[:kind]) if oclass @@ -137,10 +157,6 @@ class ArvadosApiClient Rails.configuration.arvados_v1_base end - def arvados_schema - @arvados_schema ||= api 'schema', '' - end - def discovery @discovery ||= api '../../discovery/v1/apis/arvados/v1/rest', '' end