X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/28c07cc661b01747d4a3b090d0cac2e68067ad80..71c4fdc3352ad5ca34c2f260fe43fa1150868a04:/sdk/ruby/lib/arvados.rb diff --git a/sdk/ruby/lib/arvados.rb b/sdk/ruby/lib/arvados.rb index a94eb1db42..753c518b31 100644 --- a/sdk/ruby/lib/arvados.rb +++ b/sdk/ruby/lib/arvados.rb @@ -1,10 +1,11 @@ require 'rubygems' -require 'google/api_client' require 'active_support/inflector' require 'json' require 'fileutils' require 'andand' +require 'arvados/google_api_client' + ActiveSupport::Inflector.inflections do |inflect| inflect.irregular 'specimen', 'specimens' inflect.irregular 'human', 'humans' @@ -35,9 +36,8 @@ class Arvados @application_version ||= 0.0 @application_name ||= File.split($0).last - @arvados_api_version = opts[:api_version] || - config['ARVADOS_API_VERSION'] || - 'v1' + @arvados_api_version = opts[:api_version] || 'v1' + @arvados_api_host = opts[:api_host] || config['ARVADOS_API_HOST'] or raise "#{$0}: no :api_host or ENV[ARVADOS_API_HOST] provided." @@ -46,7 +46,8 @@ class Arvados raise "#{$0}: no :api_token or ENV[ARVADOS_API_TOKEN] provided." if (opts[:suppress_ssl_warnings] or - config['ARVADOS_API_HOST_INSECURE']) + %w(1 true yes).index(config['ARVADOS_API_HOST_INSECURE']. + andand.downcase)) suppress_warnings do OpenSSL::SSL.const_set 'VERIFY_PEER', OpenSSL::SSL::VERIFY_NONE end @@ -105,28 +106,6 @@ class Arvados end end - class Google::APIClient - def discovery_document(api, version) - api = api.to_s - return @discovery_documents["#{api}:#{version}"] ||= - begin - # fetch new API discovery doc if stale - cached_doc = File.expand_path '~/.cache/arvados/discovery_uri.json' - if not File.exist?(cached_doc) or (Time.now - File.mtime(cached_doc)) > 86400 - response = self.execute!(:http_method => :get, - :uri => self.discovery_uri(api, version), - :authenticated => false) - FileUtils.makedirs(File.dirname cached_doc) - File.open(cached_doc, 'w') do |f| - f.puts response.body - end - end - - File.open(cached_doc) { |f| JSON.load f } - end - end - end - def client @client ||= Google::APIClient. new(:host => @arvados_api_host, @@ -142,6 +121,10 @@ class Arvados $stderr.puts "#{File.split($0).last} #{$$}: #{message}" if @@debuglevel >= verbosity end + def debuglog *args + self.class.debuglog *args + end + def config(config_file_path="~/.config/arvados/settings.conf") return @@config if @@config @@ -150,7 +133,19 @@ class Arvados config['ARVADOS_API_HOST'] = ENV['ARVADOS_API_HOST'] config['ARVADOS_API_TOKEN'] = ENV['ARVADOS_API_TOKEN'] config['ARVADOS_API_HOST_INSECURE'] = ENV['ARVADOS_API_HOST_INSECURE'] - config['ARVADOS_API_VERSION'] = ENV['ARVADOS_API_VERSION'] + + if config['ARVADOS_API_HOST'] and config['ARVADOS_API_TOKEN'] + # Environment variables take precedence over the config file, so + # there is no point reading the config file. If the environment + # specifies a _HOST without asking for _INSECURE, we certainly + # shouldn't give the config file a chance to create a + # system-wide _INSECURE state for this user. + # + # Note: If we start using additional configuration settings from + # this file in the future, we might have to read the file anyway + # instead of returning here. + return (@@config = config) + end begin expanded_path = File.expand_path config_file_path @@ -162,16 +157,18 @@ class Arvados # skip comments and blank lines next if line.match('^\s*#') or not line.match('\S') var, val = line.chomp.split('=', 2) + var.strip! + val.strip! # allow environment settings to override config files. - if var and val + if !var.empty? and val config[var] ||= val else - warn "#{expanded_path}: #{lineno}: could not parse `#{line}'" + debuglog "#{expanded_path}: #{lineno}: could not parse `#{line}'", 0 end end end - rescue - debuglog "HOME environment variable (#{ENV['HOME']}) not set, not using #{config_file_path}", 0 + rescue StandardError => e + debuglog "Ignoring error reading #{config_file_path}: #{e}", 0 end @@config = config @@ -192,8 +189,6 @@ class Arvados end def self.api_exec(method, parameters={}) api_method = arvados_api.send(api_models_sym).send(method.name.to_sym) - parameters = parameters. - merge(:api_token => arvados.config['ARVADOS_API_TOKEN']) parameters.each do |k,v| parameters[k] = v.to_json if v.is_a? Array or v.is_a? Hash end @@ -212,7 +207,10 @@ class Arvados execute(:api_method => api_method, :authenticated => false, :parameters => parameters, - :body => body) + :body_object => body, + :headers => { + authorization: 'OAuth2 '+arvados.config['ARVADOS_API_TOKEN'] + }) resp = JSON.parse result.body, :symbolize_names => true if resp[:errors] raise Arvados::TransactionFailedError.new(resp[:errors])