Stream API responses for jobs.log_tail_follow and users.log_stream
authorTom Clegg <tom@clinicalfuture.com>
Thu, 12 Dec 2013 23:21:26 +0000 (15:21 -0800)
committerTom Clegg <tom@clinicalfuture.com>
Thu, 12 Dec 2013 23:21:26 +0000 (15:21 -0800)
sdk/cli/arvados-cli.gemspec
sdk/cli/bin/arv

index 5d2c7ecddc79ed05d93297952cdadfcf810377ef..51aa3b7f889d9e7842978d69895adb509d2947bd 100644 (file)
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
   s.add_dependency('trollop', '>= 2.0')
   s.add_dependency('andand', '>= 1.3.3')
   s.add_dependency('oj', '>= 2.0.3')
+  s.add_dependency('curb', '~> 0.8')
   s.homepage    =
     'http://arvados.org'
 end
index 947d58e9acc705eaedd9da00e09e5e3d15d55fbf..b01ac1aa8ee6c9ad7e5bffec8ee6b3f1f217366a 100755 (executable)
@@ -51,6 +51,7 @@ ARVADOS_API_HOST and ARVADOS_API_TOKEN need to be defined as environment variabl
 end
 
 begin
+  require 'curb'
   require 'rubygems'
   require 'google/api_client'
   require 'json'
@@ -64,7 +65,7 @@ rescue LoadError
 
 Please install all required gems: 
 
-  gem install google-api-client json trollop andand oj activesupport
+  gem install activesupport andand curb google-api-client json oj trollop
 
   EOS
 end
@@ -246,11 +247,38 @@ if resource_body
 else
   request_body = {}
 end
-request_body[:api_token] = ENV['ARVADOS_API_TOKEN']
-result = client.execute(:api_method => eval(api_method),
-                        :parameters => request_parameters,
-                        :body => request_body,
-                        :authenticated => false)
+
+case api_method
+when
+  'arvados.users.event_stream',
+  'arvados.jobs.log_stream',
+  'arvados.jobs.log_tail_follow'
+
+  # Special case for methods that respond with data streams rather
+  # than JSON (TODO: use the discovery document instead of a static
+  # list of methods)
+  uri_s = eval(api_method).generate_uri(request_parameters)
+  Curl::Easy.perform(uri_s) do |curl|
+    curl.headers['Accept'] = 'text/plain'
+    curl.headers['Authorization'] = "OAuth2 #{ENV['ARVADOS_API_TOKEN']}"
+    if ENV['ARVADOS_API_HOST_INSECURE']
+      curl.ssl_verify_peer = false 
+      curl.ssl_verify_host = false
+    end
+    if global_opts[:verbose]
+      curl.on_header { |data| $stderr.write data }
+    end
+    curl.on_body { |data| $stdout.write data }
+  end
+  exit 0
+else
+  request_body[:api_token] = ENV['ARVADOS_API_TOKEN']
+  result = client.execute(:api_method => eval(api_method),
+                          :parameters => request_parameters,
+                          :body => request_body,
+                          :authenticated => false)
+end
+
 begin
   results = JSON.parse result.body
 rescue JSON::ParserError => e