daptiv-chef-ci 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -43,7 +43,7 @@ Gem::Specification.new do |gem|
43
43
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
44
44
  gem.name = "daptiv-chef-ci"
45
45
  gem.require_paths = ["lib"]
46
- gem.version = '0.0.5'
46
+ gem.version = '0.0.6'
47
47
 
48
48
  gem.add_runtime_dependency "log4r", "~> 1.1.10"
49
49
  gem.add_runtime_dependency "mixlib-shellout", "~> 1.2.0"
@@ -1,4 +1,5 @@
1
1
  require 'log4r'
2
+ require 'mixlib/shellout/exceptions'
2
3
  require_relative 'shell'
3
4
 
4
5
  module DaptivChefCI
@@ -12,24 +13,60 @@ module DaptivChefCI
12
13
  @shell = shell
13
14
  end
14
15
 
15
- def destroy()
16
- @shell.exec_cmd('vagrant destroy -f')
16
+ def destroy(opts={})
17
+ opts = {
18
+ :cmd_timeout_in_seconds => 180,
19
+ :retry_attempts => 2,
20
+ :retry_wait_in_seconds => 20
21
+ }.merge(opts)
22
+ exec_cmd_with_retry('vagrant destroy -f', opts)
17
23
  end
18
24
 
19
- def halt()
20
- @shell.exec_cmd('vagrant halt')
25
+ def halt(opts={})
26
+ opts = {
27
+ :cmd_timeout_in_seconds => 180,
28
+ :retry_attempts => 2,
29
+ :retry_wait_in_seconds => 20
30
+ }.merge(opts)
31
+ exec_cmd_with_retry('vagrant halt', opts)
21
32
  end
22
33
 
23
- def up(timeout=7200)
24
- @shell.exec_cmd('vagrant up', timeout)
34
+ def up(opts={})
35
+ opts = {
36
+ :cmd_timeout_in_seconds => 7200,
37
+ :retry_attempts => 0
38
+ }.merge(opts)
39
+ exec_cmd_with_retry('vagrant up', opts)
25
40
  end
26
41
 
27
- def provision(timeout=7200)
28
- @shell.exec_cmd('vagrant provision', timeout)
42
+ def provision(opts={})
43
+ opts = {
44
+ :cmd_timeout_in_seconds => 7200,
45
+ :retry_attempts => 0
46
+ }.merge(opts)
47
+ exec_cmd_with_retry('vagrant provision', opts)
29
48
  end
30
49
 
31
- def reload()
32
- @shell.exec_cmd('vagrant reload')
50
+ def reload(opts={})
51
+ opts = {
52
+ :cmd_timeout_in_seconds => 180,
53
+ :retry_attempts => 0
54
+ }.merge(opts)
55
+ exec_cmd_with_retry('vagrant reload', opts)
56
+ end
57
+
58
+
59
+ private
60
+
61
+ def exec_cmd_with_retry(cmd, opts)
62
+ attempt ||= 1
63
+ @shell.exec_cmd(cmd, opts[:cmd_timeout_in_seconds] || 600)
64
+ rescue Mixlib::ShellOut::ShellCommandFailed => e
65
+ @logger.warn("#{cmd} failed with error: #{e.message}")
66
+ raise if attempt > (opts[:retry_attempts] || 0)
67
+ attempt += 1
68
+ sleep(opts[:retry_wait_in_seconds] || 10)
69
+ retry
33
70
  end
34
71
 
35
72
  end
@@ -1,4 +1,5 @@
1
1
  require 'mocha/api'
2
+ require 'mixlib/shellout/exceptions'
2
3
  require 'daptiv-chef-ci/vagrant_driver'
3
4
  require 'daptiv-chef-ci/logger'
4
5
 
@@ -25,6 +26,18 @@ describe DaptivChefCI::VagrantDriver, :unit => true do
25
26
  end
26
27
  @vagrant.halt()
27
28
  end
29
+
30
+ it 'should retry when exec fails' do
31
+ # shell cmd fails then succeeds, the vagrant.halt should succeed overall
32
+ @shell.stubs(:exec_cmd).raises(Mixlib::ShellOut::ShellCommandFailed, 'There was an error').then.returns('success')
33
+ @vagrant.halt({ :retry_wait_in_seconds => 0 })
34
+ end
35
+
36
+ it 'should fail after retrying twice' do
37
+ # shell always fails, vagrant.halt should fail after a couple retries
38
+ @shell.stubs(:exec_cmd).raises(Mixlib::ShellOut::ShellCommandFailed, 'There was an error')
39
+ expect { @vagrant.halt({ :retry_wait_in_seconds => 0 }) }.to raise_error(Mixlib::ShellOut::ShellCommandFailed)
40
+ end
28
41
  end
29
42
 
30
43
  describe 'up' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daptiv-chef-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-24 00:00:00.000000000 Z
12
+ date: 2013-10-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: log4r
@@ -157,6 +157,7 @@ files:
157
157
  - pkg/daptiv-chef-ci-0.0.2.gem
158
158
  - pkg/daptiv-chef-ci-0.0.3.gem
159
159
  - pkg/daptiv-chef-ci-0.0.4.gem
160
+ - pkg/daptiv-chef-ci-0.0.5.gem
160
161
  - Rakefile
161
162
  - README.md
162
163
  - spec/daptiv-chef-ci/logger_spec.rb
@@ -178,7 +179,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
179
  version: '0'
179
180
  segments:
180
181
  - 0
181
- hash: 4016572917644416697
182
+ hash: -3011568715703408744
182
183
  required_rubygems_version: !ruby/object:Gem::Requirement
183
184
  none: false
184
185
  requirements:
@@ -187,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
188
  version: '0'
188
189
  segments:
189
190
  - 0
190
- hash: 4016572917644416697
191
+ hash: -3011568715703408744
191
192
  requirements: []
192
193
  rubyforge_project:
193
194
  rubygems_version: 1.8.23