You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by Ben Browning <bb...@redhat.com> on 2010/08/31 22:06:44 UTC

[PATCH 2/2] Update deltacloudd script to work under jruby.

A slight rearranging of the script was done to make the
non-jruby-compatible and jruby-compatible code all in one place.
The functionality under non-jruby is unchanged. Under jruby,
webrick is booted instead of thin because thin does not have a
jruby-compatible gem.
---
 server/bin/deltacloudd |  102 +++++++++++++++++++++++++++++++----------------
 1 files changed, 67 insertions(+), 35 deletions(-)

diff --git a/server/bin/deltacloudd b/server/bin/deltacloudd
index 3c91d3e..9d91e1a 100755
--- a/server/bin/deltacloudd
+++ b/server/bin/deltacloudd
@@ -2,7 +2,6 @@
 
 require 'rubygems'
 require 'optparse'
-require 'thin'
 
 options = {
   :env => 'development'
@@ -44,45 +43,78 @@ end
 ENV["API_HOST"] = "localhost" unless ENV["API_HOST"]
 ENV["API_PORT"] = "3001" unless ENV["API_PORT"]
 
+puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
+puts
+
 dirname="#{File.dirname(__FILE__)}/.."
+platform = RUBY_PLATFORM[/java/] || 'ruby'
 
-argv_opts = ARGV.clone
-argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
-argv_opts << ['--address', ENV["API_HOST"] ]
-argv_opts << ['--port', ENV["API_PORT"] ]
-argv_opts << ['--rackup', 'config.ru' ]
-argv_opts << ['--chdir', dirname ]
-argv_opts << ['-e', options[:env] ]
-argv_opts << ['--threaded', '-D', '--stats', '/stats']
-
-argv_opts.flatten!
-
-if options[:env] == "development"
-  use_rerun = false
-  begin
-    require "rerun"
-    use_rerun = true
-  rescue
-    # Do nothing
-  end
-end
+if platform == 'java'
+  require 'rack'
 
-puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
-puts
+  # We can't chdir with webrick so add our root directory
+  # onto the load path
+  $: << dirname
+
+  # Read in config.ru and convert it to an instance of Rack::Builder
+  cfgfile = File.read(File.join(dirname, 'config.ru'))
+  inner_app = eval("Rack::Builder.new {(" + cfgfile + "\n )}.to_app",
+                   nil, 'config.ru')
 
-if use_rerun
-  argv_opts.unshift "thin"
-  command = argv_opts.join(" ")
-  topdir = File::expand_path(File::join(File::dirname(__FILE__), ".."))
-  rerun = Rerun::Runner.new(command, :dir => topdir)
-  rerun.start
-  rerun.join
+  app = Rack::Builder.new {
+    use Rack::CommonLogger # apache-like logging
+    use Rack::Reloader if options[:env] == "development"
+    set :root, dirname # Set Sinatra root since we can't chdir to ../
+    run inner_app
+  }.to_app
+
+  # There's a bug with string ports on JRuby so convert to int
+  # http://jira.codehaus.org/browse/JRUBY-4868
+  port = ENV["API_PORT"].to_i
+
+  puts "=> Ctrl-C to shutdown server"
+  Rack::Handler::WEBrick.run(app,
+                             :Host => ENV["API_HOST"],
+                             :Port => port,
+                             :AccessLog => [])
 else
-  thin = Thin::Runner.new(argv_opts)
+  require 'thin'
+
+  argv_opts = ARGV.clone
+  argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
+  argv_opts << ['--address', ENV["API_HOST"] ]
+  argv_opts << ['--port', ENV["API_PORT"] ]
+  argv_opts << ['--rackup', 'config.ru' ]
+  argv_opts << ['--chdir', dirname ]
+  argv_opts << ['-e', options[:env] ]
+  argv_opts << ['--threaded', '-D', '--stats', '/stats']
+
+  argv_opts.flatten!
+
+  if options[:env] == "development"
+    use_rerun = false
+    begin
+      require "rerun"
+      use_rerun = true
+    rescue
+      # Do nothing
+    end
+  end
+
+  if use_rerun
+    argv_opts.unshift "thin"
+    command = argv_opts.join(" ")
+    topdir = File::expand_path(File::join(File::dirname(__FILE__), ".."))
+    rerun = Rerun::Runner.new(command, :dir => topdir)
+    rerun.start
+    rerun.join
+  else
+    thin = Thin::Runner.new(argv_opts)
 
-  begin
-    thin.run!
-  rescue Exception => e
-    puts "ERROR: #{e.message}"
+    begin
+      thin.run!
+    rescue Exception => e
+      puts "ERROR: #{e.message}"
+    end
   end
 end
-- 
1.7.2.1