Merge branch 'master' into 2244-sdk-docs
[arvados.git] / apps / workbench / app / models / arvados_api_client.rb
index a457efaec95e2ca1c25c0315d285aa1f2ed3d962..2f83a411522b736e216d7e4af04962ae9b1e4d05 100644 (file)
@@ -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|
@@ -51,7 +57,7 @@ class ArvadosApiClient
     
     header = {"Accept" => "application/json"}
 
-    profile_checkpoint { "Prepare request #{url}" }
+    profile_checkpoint { "Prepare request #{url} #{query[:uuid]} #{query[:where]}" }
     msg = @@api_client.post(url, 
                             query,
                             header: header)
@@ -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
+      ArvadosApiClient::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