nickstenning-outback 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,82 +1,72 @@
1
1
  require 'yaml'
2
- require 'tempfile'
3
2
 
4
3
  module Outback
5
4
 
6
5
  class Manager
7
6
 
8
- attr_reader :tasks, :status, :errors, :position
9
- attr_writer :logger
7
+ ROLLOUT = 1
8
+ ROLLBACK = -1
9
+
10
+ attr_reader :tasks, :position
10
11
  attr_accessor :workdir
12
+ attr_writer :watcher
11
13
 
12
14
  def initialize
13
15
  @tasks = []
14
- @statuses = []
15
- @errors = []
16
16
  @position = 0
17
17
  end
18
18
 
19
- def rollout
20
- @direction = 1
19
+ def add_tasks( *tasks )
20
+ [*tasks].each do |task|
21
+ task.workdir = @workdir unless task.workdir
22
+ end
23
+ @tasks += [*tasks]
24
+ end
25
+
26
+ alias_method :add_task, :add_tasks
27
+
28
+ def rollout!
29
+ @direction = ROLLOUT
21
30
  run
22
31
  end
23
32
 
24
- def rollback
25
- @direction = -1
33
+ def rollback!
34
+ @direction = ROLLBACK
26
35
  run
27
36
  end
28
37
 
29
38
  def rollout_from( task )
30
39
  @position = @tasks.index(task)
31
- rollout
40
+ rollout!
32
41
  end
33
42
 
34
43
  def rollback_from( task )
35
44
  @position = @tasks.index(task) - 1
36
- rollback
37
- end
38
-
39
- def attempt
40
- method = {1 => :rollout, -1 => :rollback}[@direction]
41
- Dir.chdir(@workdir || Dir.pwd) do
42
- @statuses << [method, *current_task.send(method)]
43
- end
44
- return latest_okay?
45
- end
46
-
47
- def latest_okay?
48
- status[1] == 0
45
+ rollback!
49
46
  end
50
47
 
51
- def errors
52
- @statuses.select { |status| status[1] != 0 }
53
- end
54
-
55
- def status
56
- @statuses.last
48
+ def attempt( task )
49
+ method = {ROLLOUT => :rollout!, ROLLBACK => :rollback!}[@direction]
50
+ ret = task.send(method)
51
+ @watcher.notify(task) if @watcher
52
+ return ret
57
53
  end
58
54
 
59
55
  def current_task
60
56
  @tasks[@position]
61
57
  end
62
58
 
63
- def state
64
- { :position => @position,
65
- :direction => @direction,
66
- :statuses => @statuses }
67
- end
68
-
69
59
  private
70
60
 
71
61
  def run
72
- if @direction == 1
62
+ if @direction == ROLLOUT
73
63
  task_list = @tasks[@position..-1]
74
- elsif @direction == -1
64
+ elsif @direction == ROLLBACK
75
65
  task_list = @tasks[0..@position + 1].reverse
76
66
  end
77
67
  task_list.each do |task|
78
68
  @position = @tasks.index(task)
79
- unless attempt
69
+ unless attempt current_task
80
70
  fail
81
71
  break
82
72
  end
@@ -84,11 +74,11 @@ module Outback
84
74
  end
85
75
 
86
76
  def fail
87
- case status[0]
88
- when :rollout
89
- rollback_from current_task
90
- raise TransactionError, "Could not rollout task #{current_task}, attempting rollback."
91
- when :rollback
77
+ case @direction
78
+ when ROLLOUT
79
+ #rollback_from current_task
80
+ raise Error, "Could not rollout task #{current_task}, attempting rollback."
81
+ when ROLLBACK
92
82
  raise TransactionError, "Could not rollback task #{current_task}, aborting."
93
83
  else
94
84
  raise Error, "Unknown direction!"
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'open4'
3
+
4
+ module Outback
5
+
6
+ class ShellTask
7
+
8
+ attr_accessor :rollout, :rollback, :workdir
9
+ attr_reader :result, :errors, :exit_code
10
+
11
+ def initialize(out, back)
12
+ @rollout, @rollback = out, back
13
+ @rolled_out = false
14
+ end
15
+
16
+ def rollout!
17
+ run @rollout
18
+ @rolled_out = true
19
+ return @exit_code == 0
20
+ end
21
+
22
+ def rollback!
23
+ run @rollback
24
+ @rolled_out = false
25
+ return @exit_code == 0
26
+ end
27
+
28
+ def rolled_out?
29
+ @rolled_out
30
+ end
31
+
32
+ def reset_strings
33
+ @result, @errors = "", ""
34
+ end
35
+
36
+ def run( command )
37
+ reset_strings
38
+ Dir.chdir(@workdir || Dir.getwd) do
39
+ @status = Open4.popen4(*command) do |pid, i, o, e|
40
+ @result = o.read
41
+ @errors = e.read
42
+ end
43
+ @exit_code = @status.exitstatus
44
+ end
45
+ # Catch nonexistent commands at this point and return a sensible error
46
+ rescue Errno::ENOENT => e
47
+ @exit_code = 127
48
+ @errors = e.message
49
+ end
50
+
51
+ end
52
+
53
+ end
data/lib/outback.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  require 'outback/manager'
2
- require 'outback/task_helper'
3
- require 'outback/task'
4
- require 'outback/command'
2
+ require 'outback/shelltask'
5
3
  require 'outback/yaml'
6
4
 
7
5
  module Outback
data/outback.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{outback}
3
- s.version = "0.0.1"
3
+ s.version = "0.0.2"
4
4
 
5
5
  s.specification_version = 2 if s.respond_to? :specification_version=
6
6
 
@@ -8,11 +8,11 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Nick Stenning"]
9
9
  s.date = %q{2008-07-14}
10
10
  s.email = ["nick@whiteink.com"]
11
- s.files = ["lib/outback/command.rb", "lib/outback/manager.rb", "lib/outback/task.rb", "lib/outback/task_helper.rb", "lib/outback/yaml.rb", "lib/outback.rb", "outback.gemspec", "spec/outback/manager_spec.rb", "spec/outback/task_spec.rb", "spec/outback/yaml_spec.rb", "spec/spec_helper.rb"]
11
+ s.files = ["lib/outback/manager.rb", "lib/outback/shelltask.rb", "lib/outback/yaml.rb", "lib/outback.rb", "outback.gemspec", "spec/outback/manager_spec.rb", "spec/outback/shelltask_spec.rb", "spec/outback/yaml_spec.rb", "spec/spec_helper.rb"]
12
12
  s.has_rdoc = true
13
13
  s.homepage = %q{http://github.com/nickstenning/outback}
14
14
  s.require_paths = ["lib"]
15
- s.summary = %q{Like rake, but backwards and forwards.}
15
+ s.summary = %q{Run pairs of rollout/rollback tasks in a transactional manner.}
16
16
  s.description = %{Run pairs of rollout/rollback tasks in a transactional manner.}
17
17
 
18
18
  s.add_dependency("open4", [">= 0.9.0"])
@@ -5,121 +5,100 @@ describe Outback::Manager do
5
5
 
6
6
  before do
7
7
  @obm = Outback::Manager.new
8
- @task1 = mock("task1", :name => "Task 1")
9
- @task2 = mock("task2", :name => "Task 2")
8
+ @task1 = mock("task1", :workdir => "/tmp")
9
+ @task2 = mock("task2", :workdir => nil)
10
+ @task1.stub!(:workdir=)
11
+ @task2.stub!(:workdir=)
12
+ end
13
+
14
+ it "should have a list of tasks" do
15
+ @obm.tasks.should be_a_kind_of(Enumerable)
16
+ @obm.should have(0).tasks
10
17
  end
11
18
 
12
- describe "(empty)" do
13
-
14
- it "should have a list of tasks" do
15
- @obm.tasks.should be_a_kind_of(Enumerable)
16
- @obm.should have(0).tasks
17
- end
18
-
19
- it "should have a rollout method" do
20
- @obm.should respond_to(:rollout)
21
- end
22
-
23
- it "should have a rollback method" do
24
- @obm.should respond_to(:rollback)
25
- end
26
-
27
- it "should add tasks to its list with standard array operations" do
28
- @obm.should have(0).tasks
29
- @obm.tasks << @task1
30
- @obm.should have(1).tasks
31
- @obm.tasks << @task2
32
- @obm.should have(2).tasks
33
- end
34
-
19
+ it "should add a task to its list with #add_task" do
20
+ @obm.add_task(@task1)
21
+ @obm.should have(1).tasks
22
+ @obm.add_task(@task2)
23
+ @obm.should have(2).tasks
35
24
  end
36
25
 
26
+ it "should add multiple tasks to its list, in order, with #add_tasks" do
27
+ @obm.add_tasks(@task1, @task2, @task1)
28
+ @obm.should have(3).tasks
29
+ @obm.tasks[0].should == @task1
30
+ @obm.tasks[1].should == @task2
31
+ @obm.tasks[2].should == @task1
32
+ end
33
+
37
34
  describe "(with a few tasks)" do
38
35
 
39
36
  before do
40
- @obm.tasks << @task1 << @task2
37
+ @obm.add_tasks(@task1, @task2)
41
38
  end
42
39
 
43
- it "should call each task's rollout method on rollout (in order)" do
44
- @task1.should_receive(:rollout).and_return(0)
45
- @task2.should_receive(:rollout).and_return(0)
46
- @obm.rollout
40
+ it "should call each task's #rollout! method, in order, on #rollout!" do
41
+ @task1.should_receive(:rollout!).and_return(true)
42
+ @task2.should_receive(:rollout!).and_return(true)
43
+ @obm.rollout!
47
44
  end
48
45
 
49
- it "should call each task's rollback method on rollback (in reverse order)" do
50
- @task2.should_receive(:rollback).and_return(0)
51
- @task1.should_receive(:rollback).and_return(0)
52
- @obm.rollback
46
+ it "should call each task's #rollback! method, in reverse order, on #rollback!" do
47
+ @task1.should_receive(:rollout!).and_return(true)
48
+ @task2.should_receive(:rollout!).and_return(true)
49
+ @obm.rollout!
53
50
  end
54
51
 
55
52
  it "should raise an Outback::Error if a rollout fails" do
56
- @task1.stub!(:rollback)
57
- @task1.should_receive(:rollout).and_return(1)
58
- @task2.should_not_receive(:rollout)
59
- @task2.should_not_receive(:rollback)
60
- lambda { @obm.rollout }.should raise_error(Outback::Error)
53
+ @task1.stub!(:rollback!)
54
+ @task1.should_receive(:rollout!).and_return(false)
55
+ @task2.should_not_receive(:rollout!)
56
+ @task2.should_not_receive(:rollback!)
57
+ lambda { @obm.rollout! }.should raise_error(Outback::Error)
61
58
  end
62
59
 
63
- it "should raise an Outback::Error if a rollback fails" do
64
- @task2.should_receive(:rollback).and_return(1)
65
- @task1.should_not_receive(:rollback)
66
- lambda { @obm.rollback }.should raise_error(Outback::Error)
60
+ it "should raise an Outback::TransactionError if a rollback subsequently fails" do
61
+ @task2.should_receive(:rollback!).and_return(false)
62
+ @task1.should_not_receive(:rollback!)
63
+ lambda { @obm.rollback! }.should raise_error(Outback::TransactionError)
67
64
  end
68
65
 
69
- it "should store the latest task's run direction (rollout, rollback), return code, stdout and stderr in #status" do
70
- @task1.should_receive(:rollout).and_return([0, "A message", ""])
71
- @task2.should_receive(:rollout).and_return([0, "Another message", ""])
72
- @obm.rollout
73
- @obm.status.should == [:rollout, 0, "Another message", ""]
74
- end
66
+ end
67
+
68
+ describe "(with #workdir set)" do
75
69
 
76
- it "should store the latest task's status even if an earlier task raised an error." do
77
- @task1.stub!(:rollback).and_return([0, "Getting rolled back", ""])
78
- @task1.should_receive(:rollout).and_return([1, "", "Error message"])
79
- @task2.should_not_receive(:rollout)
80
- begin
81
- @obm.rollout
82
- rescue Outback::Error
83
- @obm.status.should == [:rollback, 0, "Getting rolled back", ""]
84
- end
70
+ before do
71
+ @task1 = Outback::ShellTask.new("", "")
72
+ @task1.workdir = "/tmp"
73
+ @task2 = Outback::ShellTask.new("", "")
74
+ @obm.workdir = "/nonexistent"
75
+ @obm.add_tasks(@task1, @task2)
85
76
  end
86
77
 
87
- it "should store any status messages with non-zero return codes in #errors" do
88
- @task1.should_receive(:rollout).and_return([0, "All okay", ""])
89
- @task2.should_receive(:rollout).and_return([1, "", "Error message"])
90
- @task2.should_receive(:rollback).and_return([0, "Getting rolled back", ""])
91
- @task1.should_receive(:rollback).and_return([3, "", "Error while rolling back"])
92
- begin
93
- @obm.rollout
94
- rescue Outback::Error
95
- @obm.should have(2).errors
96
- @obm.errors[0].should == [:rollout, 1, "", "Error message"]
97
- @obm.errors[1].should == [:rollback, 3, "", "Error while rolling back"]
98
- end
78
+ it "should set the workdir of each of its tasks if it is currently nil" do
79
+ @task1.workdir.should == "/tmp"
80
+ @task2.workdir.should == "/nonexistent"
99
81
  end
100
82
 
101
- it "should rollback previously rolled-out tasks if a rollout fails" do
102
- @task1.should_receive(:rollout).ordered.and_return([1, "", "Error message"])
103
- @task2.should_not_receive(:rollout)
104
- @task1.should_receive(:rollback).ordered
105
- @task2.should_not_receive(:rollback)
106
- begin
107
- @obm.rollout
108
- rescue Outback::Error
109
- end
110
- end
111
83
  end
112
84
 
113
- describe "(with #workdir set)" do
85
+ describe "(with #watcher set)" do
114
86
 
115
87
  before do
116
- @obm.tasks << Outback::ShellTask.new('pwd', 'pwd')
117
- @obm.workdir = '/tmp'
88
+ @task1 = Outback::ShellTask.new("pwd", "")
89
+ @task2 = Outback::ShellTask.new("echo 'hello'", "")
90
+ require 'tempfile'
91
+ @obm.workdir = Dir.tmpdir
92
+ @obm.add_tasks(@task1, @task2)
93
+ @watcher = mock("watcher")
94
+ @obm.watcher = @watcher
118
95
  end
119
96
 
120
- it "should execute all tasks in the workdir" do
121
- @obm.rollout
122
- @obm.status[2] == "/tmp"
97
+ it "should call the watcher's #notify method after every task rollout/rollback with the task as an argument" do
98
+ @watcher.should_receive(:notify).ordered.with(@task1)
99
+ @watcher.should_receive(:notify).ordered.with(@task2)
100
+ @obm.rollout!
123
101
  end
102
+
124
103
  end
125
104
  end
@@ -0,0 +1,86 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Outback::ShellTask do
4
+
5
+ before do
6
+ @task = Outback::ShellTask.new("out", "back")
7
+ end
8
+
9
+ it "should use the first parameter to the rollout command" do
10
+ @task.rollout.should == "out"
11
+ end
12
+
13
+ it "should use the second parameter as the rollback command" do
14
+ @task.rollback.should == "back"
15
+ end
16
+
17
+ it "should allow its rollout command to be changed with #rollout=" do
18
+ @task.rollout = "foo"
19
+ @task.rollout.should == "foo"
20
+ end
21
+
22
+ it "should allow its rollback command to be changed with #rollback=" do
23
+ @task.rollout = "bar"
24
+ @task.rollout.should == "bar"
25
+ end
26
+
27
+ it "should not be rolled out by default" do
28
+ @task.should_not be_rolled_out
29
+ end
30
+
31
+ it "should rollout when called with #rollout!" do
32
+ @task.rollout!
33
+ @task.should be_rolled_out
34
+ end
35
+
36
+ it "should run its commands in the current working directory if #workdir hasn't been set" do
37
+ @task = Outback::ShellTask.new("pwd", "")
38
+ @task.rollout!
39
+ @task.result.chomp.should == Dir.getwd
40
+ end
41
+
42
+ it "should run its commands in the workdir, if set with #workdir=" do
43
+ @task = Outback::ShellTask.new("pwd", "")
44
+ @task.workdir = "/private/tmp" ## FIXME for *nix systems
45
+ @task.rollout!
46
+ @task.result.chomp.should == @task.workdir
47
+ end
48
+
49
+ it "should return true on successful #rollout! or #rollback!" do
50
+ @task = Outback::ShellTask.new("echo", "echo")
51
+ @task.rollout!.should be_true
52
+ @task.rollback!.should be_true
53
+ end
54
+
55
+ it "should return false on unsuccessful #rollout! or #rollback!" do
56
+ @task = Outback::ShellTask.new("I-am-a-command-most-unlikely-to-exist", "I-am-a-command-most-unlikely-to-exist")
57
+ @task.rollout!.should be_false
58
+ @task.rollback!.should be_false
59
+ end
60
+
61
+ describe "(when rolled out)" do
62
+
63
+ before do
64
+ @task = Outback::ShellTask.new('pwd', 'pwd')
65
+ @task.rollout!
66
+ end
67
+
68
+ it "should be rolled out" do
69
+ @task.should be_rolled_out
70
+ end
71
+
72
+ it "should have an integer exit code" do
73
+ @task.exit_code.should be_a_kind_of(Fixnum)
74
+ end
75
+
76
+ it "should have a string result" do
77
+ @task.result.should be_a_kind_of(String)
78
+ end
79
+
80
+ it "should have a string for errors (stderr)" do
81
+ @task.errors.should be_a_kind_of(String)
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -35,13 +35,13 @@ describe Outback::YAML do
35
35
  end
36
36
  it "should set the rollout_command to the first element of the YAML array" do
37
37
  manager = Outback::YAML.load(@yaml)
38
- manager.tasks[0].rollout_command.should == "touch y"
39
- manager.tasks[1].rollout_command.should == "touch x"
38
+ manager.tasks[0].rollout.should == "touch y"
39
+ manager.tasks[1].rollout.should == "touch x"
40
40
  end
41
41
  it "should set the rollback_command to the second element of the YAML array" do
42
42
  manager = Outback::YAML.load(@yaml)
43
- manager.tasks[0].rollback_command.should == "rm y"
44
- manager.tasks[1].rollback_command.should == "rm x"
43
+ manager.tasks[0].rollback.should == "rm y"
44
+ manager.tasks[1].rollback.should == "rm x"
45
45
  end
46
46
  end
47
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nickstenning-outback
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Stenning
@@ -31,15 +31,13 @@ extensions: []
31
31
  extra_rdoc_files: []
32
32
 
33
33
  files:
34
- - lib/outback/command.rb
35
34
  - lib/outback/manager.rb
36
- - lib/outback/task.rb
37
- - lib/outback/task_helper.rb
35
+ - lib/outback/shelltask.rb
38
36
  - lib/outback/yaml.rb
39
37
  - lib/outback.rb
40
38
  - outback.gemspec
41
39
  - spec/outback/manager_spec.rb
42
- - spec/outback/task_spec.rb
40
+ - spec/outback/shelltask_spec.rb
43
41
  - spec/outback/yaml_spec.rb
44
42
  - spec/spec_helper.rb
45
43
  has_rdoc: true
@@ -67,6 +65,6 @@ rubyforge_project:
67
65
  rubygems_version: 1.2.0
68
66
  signing_key:
69
67
  specification_version: 2
70
- summary: Like rake, but backwards and forwards.
68
+ summary: Run pairs of rollout/rollback tasks in a transactional manner.
71
69
  test_files: []
72
70
 
@@ -1,33 +0,0 @@
1
- module Outback
2
-
3
- class Command
4
-
5
- def initialize( script )
6
- @manager = Manager.new
7
- parse(script)
8
- end
9
-
10
- def parse( script )
11
- script.each_line do |l|
12
- out, back = l[/^([^\^]+)\s*\^\s*(.+)$/]
13
- p "o:", out, "b:", back
14
- if out and back
15
- p out, back
16
- t = Task.new("temp")
17
- t.rollout { |t| t.sys out }
18
- t.rollback { |t| t.sys back }
19
- @manager.tasks << t
20
- end
21
- end
22
- end
23
-
24
- def run( command )
25
- raise %{Command "#{command}" not understood.} unless [:rollout, :rollback].include? command
26
-
27
- #@manager.tasks.each
28
- #@manager.send(command)
29
- end
30
-
31
- end
32
-
33
- end
data/lib/outback/task.rb DELETED
@@ -1,61 +0,0 @@
1
- require 'stringio'
2
-
3
- require 'rubygems'
4
- require 'open4'
5
-
6
- module Outback
7
-
8
- class Task
9
-
10
- attr_reader :name
11
- attr_accessor :stdout, :stderr
12
-
13
- def initialize
14
- @rollout, @rollback = lambda {}
15
- @stdout = StringIO.new
16
- @stderr = StringIO.new
17
- end
18
-
19
- def rollout( &block )
20
- if block_given?
21
- @rollout = block
22
- else
23
- run @rollout
24
- end
25
- end
26
-
27
- def rollback( &block )
28
- if block_given?
29
- @rollback = block
30
- else
31
- run @rollback
32
- end
33
- end
34
-
35
- private
36
-
37
- def run( proc )
38
- proc.call(TaskHelper.new(self))
39
- [0, stdout.string, stderr.string]
40
- rescue SystemCallError => err
41
- [1, stdout.string, stderr.string]
42
- end
43
-
44
- end
45
-
46
-
47
- class ShellTask < Task
48
-
49
- attr_reader :rollout_command, :rollback_command
50
-
51
- def initialize(rollout, rollback)
52
- super()
53
- @rollout = lambda { |t| t.sys rollout }
54
- @rollout_command = rollout
55
- @rollback = lambda { |t| t.sys rollback }
56
- @rollback_command = rollback
57
- end
58
-
59
- end
60
-
61
- end
@@ -1,21 +0,0 @@
1
- module Outback
2
-
3
- class TaskHelper
4
-
5
- def initialize( task )
6
- @task = task
7
- end
8
-
9
- def sys( *args )
10
- pid, i, o, e = Open4.popen4(*args)
11
- o.each_line { |l| @task.stdout.print "[#{pid}] #{l}" }
12
- e.each_line { |l| @task.stderr.print "E [#{pid}] #{l}" }
13
- end
14
-
15
- def puts( *args )
16
- @task.stdout.puts *args
17
- end
18
-
19
- end
20
-
21
- end
@@ -1,63 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe Outback::Task do
4
-
5
- before do
6
- @task = Outback::Task.new
7
- end
8
-
9
- it "should allow its rollout method to be defined with #rollout" do
10
- rollout_proc = lambda { |t| t.puts "rollout" }
11
-
12
- lambda do
13
- @task.rollout &rollout_proc
14
- end.should_not raise_error
15
-
16
- @task.rollout.should == [0, "rollout\n", ""]
17
- end
18
-
19
- it "should allow its rollback method to be defined with #rollback" do
20
- rollback_proc = lambda { |t| t.puts "rollback" }
21
-
22
- lambda do
23
- @task.rollback &rollback_proc
24
- end.should_not raise_error
25
-
26
- @task.rollback.should == [0, "rollback\n", ""]
27
- end
28
-
29
- it "should have a rollout method" do
30
- @task.should respond_to(:rollout)
31
- end
32
-
33
- it "should have a rollback method" do
34
- @task.should respond_to(:rollback)
35
- end
36
-
37
- it "should return an exit code and the command output when rollout or rollback is run" do
38
- returns = @task.rollout
39
- returns[0].should be_a_kind_of(Numeric)
40
- returns[1].should be_a_kind_of(String)
41
- returns[2].should be_a_kind_of(String)
42
- end
43
-
44
- it "should provide a 'sys' method to rollout and rollback blocks to allow system calls" do
45
- @task.rollout do |t|
46
- t.sys 'echo', 'system call'
47
- end
48
- ret = []
49
- lambda { ret = @task.rollout }.should_not raise_error
50
- ret[0].should == 0
51
- ret[1].should match(/\[\d+\] system call\n/)
52
- ret[2].should be_empty
53
- end
54
-
55
- it "should catch failed system commands and provide an appropriate exit code" do
56
- @task.rollout do |t|
57
- t.sys "nonexistent"
58
- end
59
- ret = []
60
- lambda { ret = @task.rollout }.should_not raise_error
61
- ret[0].should == 1
62
- end
63
- end