diff --git a/lib/hydra/tasks.rb b/lib/hydra/tasks.rb index ed28637..0265bb6 100644 --- a/lib/hydra/tasks.rb +++ b/lib/hydra/tasks.rb @@ -243,8 +243,9 @@ module Hydra #:nodoc: include Open3 # Create a new hydra remote task with the given name. # The task will be named hydra:remote: - def initialize(name) + def initialize(name, command=nil) @name = name + @command = command yield self if block_given? @config = find_config_file if @config @@ -262,6 +263,7 @@ module Hydra #:nodoc: environment = config.fetch('environment') { 'test' } workers = config.fetch('workers') { [] } workers = workers.select{|w| w['type'] == 'ssh'} + @command = "RAILS_ENV=#{environment} rake #{@name}" unless @command $stdout.write "==== Hydra Running #{@name} ====\n" Thread.abort_on_exception = true @@ -270,7 +272,7 @@ module Hydra #:nodoc: workers.each do |worker| @listeners << Thread.new do begin - @results[worker] = if run_task(worker, environment) + @results[worker] = if run_command(worker, @command) "==== #{@name} passed on #{worker['connect']} ====\n" else "==== #{@name} failed on #{worker['connect']} ====\nPlease see above for more details.\n" @@ -286,13 +288,13 @@ module Hydra #:nodoc: end end - def run_task worker, environment + def run_command worker, command $stdout.write "==== Hydra Running #{@name} on #{worker['connect']} ====\n" ssh_opts = worker.fetch('ssh_opts') { '' } writer, reader, error = popen3("ssh -tt #{ssh_opts} #{worker['connect']} ") writer.write("cd #{worker['directory']}\n") writer.write "echo BEGIN HYDRA\n" - writer.write("RAILS_ENV=#{environment} rake #{@name}\n") + writer.write(command + "\r") writer.write "echo END HYDRA\n" writer.write("exit\n") writer.close diff --git a/test/fixtures/task_test_config.yml b/test/fixtures/task_test_config.yml new file mode 100644 index 0000000..40e4050 --- /dev/null +++ b/test/fixtures/task_test_config.yml @@ -0,0 +1,6 @@ +--- + workers: + - type: ssh + connect: localhost + directory: /tmp + runners: 1 \ No newline at end of file diff --git a/test/task_test.rb b/test/task_test.rb new file mode 100644 index 0000000..fc00be8 --- /dev/null +++ b/test/task_test.rb @@ -0,0 +1,21 @@ +require File.join(File.dirname(__FILE__), 'test_helper') +require 'hydra/tasks' +require 'rake' + +class TaskTest < Test::Unit::TestCase + context "a task" do + should "execute the command in a remote machine" do + + File.delete( "/tmp/new_file" ) if File.exists? "/tmp/new_file" + + Hydra::RemoteTask.new('cat:text_file', 'touch new_file') do |t| + t.config = "test/fixtures/task_test_config.yml" + end + + Rake.application['hydra:remote:cat:text_file'].invoke + + assert( File.exists? "/tmp/new_file" ) + + end + end +end