screwcap 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ Hoe.plugin :newgem
11
11
  # Generate all the Rake tasks
12
12
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
13
  $hoe = Hoe.spec 'screwcap' do
14
- self.version = '0.8.1'
14
+ self.version = '0.8.2'
15
15
  self.developer 'Grant Ammons', 'grant@pipelinedeals.com'
16
16
  self.rubyforge_name = self.name # TODO this is default value
17
17
  self.extra_deps = [['net-ssh','>= 2.0.23'],['net-ssh-gateway','>=1.0.1'], ['net-scp','>=1.0.4']]
@@ -6,18 +6,82 @@ class Runner
6
6
  @@silent = options[:silent]
7
7
  @@verbose = options[:verbose]
8
8
  task = options[:task]
9
- results = []
10
9
 
11
10
  if (task.__servers.nil? or task.__servers == [] or task.__servers.compact == []) and task.__built_commands.any? {|c| c[:type] == :remote or c[:type] == :scp }
12
11
  raise Screwcap::ConfigurationError, "The task #{task.name} includes remote commands, however no servers were defined for this task."
13
12
  end
14
13
 
14
+ connections = []
15
+
16
+ _log "\nExecuting task #{task.name}\n", :color => :blue
17
+
18
+ if task.__options[:parallel] == false
19
+ run_serially(task, options)
20
+ else
21
+ run_parallel(task, options)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def self.run_serially(task, options)
28
+ results = []
29
+ connections = []
15
30
  if options[:servers] and task.__servers
16
- servers = options[:servers].select {|s| task.__servers.include? s.__name }
31
+ servers = options[:servers].select {|s| task.__servers.flatten.include? s.__name }
17
32
  connections = servers.map {|server| server.connect! }.flatten
18
33
  end
19
34
 
20
- _log "\nExecuting task #{task.name}\n", :color => :blue
35
+ connections.each do |connection|
36
+ task.__built_commands.each do |command|
37
+ ret = case command[:type]
38
+ when :remote
39
+ results << run_remote_command(command, connection[:connection], options)
40
+ if command[:block]
41
+ opts = task.__options.clone.merge(:stderr => command[:stderr], :stdout => command[:stdout], :exit_code => command[:exit_code])
42
+ opts[:servers] = task.__servers
43
+ opts[:name] = "Run results"
44
+
45
+ inner_task = Task.new(opts, &command[:block])
46
+ inner_task.__build_commands(options[:tasks])
47
+ results << self.execute!(options.merge(:task => inner_task))
48
+ end
49
+ when :local
50
+ result = {}
51
+ result[:stdout] = `#{command[:command]}`
52
+ result[:exit_code] = $?.to_i
53
+ results << result
54
+ if $?.to_i == 0
55
+ if options[:verbose]
56
+ _log " O: #{ret}\n", :color => :green
57
+ else
58
+ _log(".", :color => :green)
59
+ end
60
+ else
61
+ _errorlog(" E: (local): #{command[:command]} return exit code: #{$?}\n", :color => :red) if $? != 0
62
+ end
63
+ when :scp
64
+ threads = []
65
+ servers.each do |server|
66
+ threads << Thread.new(server) { |_server| _server.upload! command[:local], command[:remote] }
67
+ end
68
+ threads.each {|t| t.join }
69
+ when :block
70
+ command[:block].call
71
+ end
72
+ end
73
+ end
74
+ _log "Complete\n", :color => :blue
75
+ results
76
+ end
77
+
78
+ def self.run_parallel(task, options)
79
+ results = []
80
+ connections = []
81
+ if options[:servers] and task.__servers
82
+ servers = options[:servers].select {|s| task.__servers.flatten.include? s.__name }
83
+ connections = servers.map {|server| server.connect! }.flatten
84
+ end
21
85
 
22
86
  task.__built_commands.each do |command|
23
87
  ret = case command[:type]
@@ -72,8 +136,6 @@ class Runner
72
136
  results
73
137
  end
74
138
 
75
- private
76
-
77
139
  def self.run_remote_command(command, ssh, options)
78
140
  stdout, stderr, exit_code, exit_signal = ssh_exec! ssh, command[:command]
79
141
  ret = {:command => command[:command]}
data/lib/screwcap.rb CHANGED
@@ -16,7 +16,7 @@ require 'screwcap/sequence'
16
16
  require 'screwcap/task_manager'
17
17
 
18
18
  module Screwcap
19
- VERSION='0.8.1'
19
+ VERSION='0.8.2'
20
20
 
21
21
  class TaskNotFound < RuntimeError; end
22
22
  class NoServersDefined < Exception; end
data/screwcap.gemspec CHANGED
@@ -6,7 +6,7 @@ require 'bundler/version'
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "screwcap"
9
- s.version = "0.8.1"
9
+ s.version = "0.8.2"
10
10
  s.platform = Gem::Platform::RUBY
11
11
  s.author = "Grant Ammons"
12
12
  s.email = ["grant@pipelinedealsco.com"]
data/spec/runner_spec.rb CHANGED
@@ -86,6 +86,28 @@ describe "The Runner" do
86
86
  commands = Runner.execute! :name => :runblock, :task => task, :tasks => [task, revert_task], :servers => [@server], :silent => true
87
87
  command_names(commands).should == %w(do_something revert failed)
88
88
  end
89
+
90
+ it "should be able to run tasks parallel or serial" do
91
+ @server2 = Server.new :name => :server2, :address => "fake2.com", :user => "fake"
92
+ Runner.stubs(:ssh_exec!).returns(["ok\n","",0,nil])
93
+ task = Task.new :name => :parallel_task, :servers => [:server, :server2] do
94
+ run "one"
95
+ run "two"
96
+ end
97
+ task.__build_commands
98
+ task.validate([@server, @server2])
99
+ commands = Runner.execute! :name => :parallel_task, :task => task, :tasks => [task], :servers => [@server, @server2]
100
+ command_names(commands).should == %w(one one two two)
101
+
102
+ task = Task.new :name => :serial_task, :parallel => false, :servers => [:server, :server2] do
103
+ run "one"
104
+ run "two"
105
+ end
106
+ task.__build_commands
107
+ task.validate([@server, @server2])
108
+ commands = Runner.execute! :name => :serial_task, :task => task, :tasks => [task], :servers => [@server, @server2], :silent => true
109
+ command_names(commands).should == %w(one two one two)
110
+ end
89
111
  end
90
112
 
91
113
  def command_names(commands)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: screwcap
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 59
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 1
10
- version: 0.8.1
9
+ - 2
10
+ version: 0.8.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Grant Ammons
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-18 00:00:00 -07:00
18
+ date: 2011-04-27 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency