gosen 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -4,7 +4,7 @@ require 'gosen/deployment'
4
4
  require 'gosen/error'
5
5
 
6
6
  module Gosen
7
- VERSION = "0.1.5"
7
+ VERSION = "0.1.6"
8
8
 
9
9
  # Extracts the site part of a Grid'5000 node hostname, and returns a hash indexing the nodes by their site
10
10
  # Example:
@@ -23,11 +23,15 @@ module Gosen
23
23
  @api_options = {}
24
24
  @logger = options.delete(:logger) || NullLogger.new
25
25
 
26
+ @site.session.default_headers['User-Agent'] = "Gosen/#{Gosen::VERSION} Restfully/#{Restfully::VERSION}"
27
+
26
28
  @min_deployed_nodes = options.delete(:min_deployed_nodes) || 1
27
- raise Gosen::Error if @min_deployed_nodes > @nodes.length || @min_deployed_nodes < 0
29
+ raise Gosen::Error.new("Invalid minimal number of deployed nodes, should be between 0 and #{@nodes.length}") if @min_deployed_nodes > @nodes.length || @min_deployed_nodes < 0
28
30
 
29
31
  @max_deploy_runs = options.delete(:max_deploy_runs) || 1
30
- raise Gosen::Error if @max_deploy_runs < 1
32
+ raise Gosen::Error.new("Invalid maximal number of deployments, should be greater than or equal to 1") if @max_deploy_runs < 1
33
+
34
+ @continue_if_error = options.delete(:continue_if_error) || false
31
35
 
32
36
  if options[:ssh_public_key]
33
37
  @ssh_public_key = options[:ssh_public_key]
@@ -48,21 +52,31 @@ module Gosen
48
52
 
49
53
  def join
50
54
  @max_deploy_runs.times do |i|
51
- @deployment_resource = Gosen::DeploymentRun.new(@site, @environment, @bad_nodes, @api_options)
55
+ @deployment_run = Gosen::DeploymentRun.new(@site, @environment, @bad_nodes, @api_options)
52
56
  @logger.info("Kadeploy run #{i + 1} with #{@bad_nodes.length} nodes (#{@good_nodes.length} already deployed, need #{@min_deployed_nodes - @good_nodes.length} more)")
53
- @deployment_resource.wait_for_completion
54
- @deployment_resource.update_nodes
55
- @bad_nodes = @deployment_resource.bad_nodes
56
- @good_nodes |= @deployment_resource.good_nodes
57
- @logger.info("Nodes deployed: #{@deployment_resource.good_nodes.join(' ')}") unless @deployment_resource.good_nodes.empty?
58
- @logger.info("Nodes which failed: #{@deployment_resource.bad_nodes.join(' ')}") unless @deployment_resource.bad_nodes.empty?
57
+ begin
58
+ @deployment_run.wait_for_completion
59
+ rescue Gosen::Error => e
60
+ if e.message =~ /^Deployment error/ && @continue_if_error
61
+ @logger.warn("Deployment error: #{@deployment_run.deployment_resource['output']}")
62
+ @logger.warn("Continuing because continue_if_error is set")
63
+ next
64
+ else
65
+ raise e
66
+ end
67
+ end
68
+ @deployment_run.update_nodes
69
+ @bad_nodes = @deployment_run.bad_nodes
70
+ @good_nodes |= @deployment_run.good_nodes
71
+ @logger.info("Nodes deployed: #{@deployment_run.good_nodes.join(' ')}") unless @deployment_run.good_nodes.empty?
72
+ @logger.info("Nodes which failed: #{@deployment_run.bad_nodes.join(' ')}") unless @deployment_run.bad_nodes.empty?
59
73
  if no_more_required?
60
74
  @all_runs_done = true
61
75
  @logger.info("Had to run #{i + 1} kadeploy runs, deployed #{@good_nodes.length} nodes")
62
76
  return
63
77
  end
64
78
  end
65
- raise Gosen::Error.new('Not enough nodes')
79
+ raise Gosen::Error.new("Not enough nodes deployed after #{@max_deploy_runs} deployment(s): needed #{@min_deployed_nodes} nodes, got only #{@good_nodes.length}")
66
80
  end
67
81
 
68
82
  def no_more_required?
@@ -3,7 +3,7 @@ module Gosen
3
3
  # Time between two checks of the deployment run status
4
4
  POLLING_TIME = 10
5
5
 
6
- attr_reader :environment, :nodes, :site, :ssh_public_key
6
+ attr_reader :deployment_resource, :environment, :nodes, :site, :ssh_public_key
7
7
 
8
8
  # Launch a new deployment run
9
9
  # @param [Restfully:Resource] site the deployment site, as a restfully resource
@@ -57,7 +57,7 @@ module Gosen
57
57
  Kernel.sleep(Gosen::DeploymentRun::POLLING_TIME)
58
58
  @deployment_resource.reload
59
59
  end
60
- raise Gosen::Error if @deployment_resource['status'] == 'error'
60
+ raise Gosen::Error.new("Deployment error: #{@deployment_resource['output']}") if @deployment_resource['status'] == 'error'
61
61
  end
62
62
 
63
63
  def update_nodes
@@ -4,6 +4,11 @@ class TestDeployment < Test::Unit::TestCase
4
4
  context 'A deployment instance' do
5
5
  setup do
6
6
  @site = mock()
7
+ @session = mock()
8
+ @default_headers = mock()
9
+ @default_headers.stubs(:[]=).with('User-Agent', "Gosen/#{Gosen::VERSION} Restfully/#{Restfully::VERSION}")
10
+ @session.stubs(:default_headers).returns(@default_headers)
11
+ @site.stubs(:session).returns(@session)
7
12
  @site_name = "Rennes"
8
13
  @site.stubs(:name).returns(@site_name)
9
14
  @environment = 'lenny-x64-base'
@@ -148,7 +153,12 @@ class TestDeployment < Test::Unit::TestCase
148
153
 
149
154
  @deployment = Gosen::Deployment.new(@site, @environment, @nodes, { :min_deployed_nodes => 2 })
150
155
  assert_raise(Gosen::Error) {
151
- @deployment.join
156
+ begin
157
+ @deployment.join
158
+ rescue Gosen::Error => e
159
+ assert_equal("Not enough nodes deployed after 1 deployment(s): needed 2 nodes, got only 1", e.message)
160
+ raise e
161
+ end
152
162
  }
153
163
  end
154
164
 
@@ -196,6 +206,37 @@ class TestDeployment < Test::Unit::TestCase
196
206
  assert_equal(@nodes, @deployment.good_nodes)
197
207
  assert_equal([], @deployment.bad_nodes)
198
208
  end
209
+
210
+ should 'continue deploying when an error happens and :continue_if_error was set' do
211
+ @ssh_public_key = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvwM1XBJCIMtAyQlweE7BVRtvgyKdwGTeYCI4AFlsTtti4y0Ipe5Hsygx3p7S0BHFiJsVZWDANMRwZ4tcjp8YnjnMkG2yp1jB1qgUf34t/MmEQL0KkoOk8tIIb28o7nTFYKO15mXJm9yBVS1JY8ozEfnA7s5hkrdnvM6h9Jv6VScp8C1XTKmpEy3sWOeUlmCkYftYSr1fLM/7qk9S2TnljA/CGiK9dq2mhJMjnDtulVrdpc1hbh+0oCzL6m2BfXX3v4q1ORml8o04oFeEYDN5qzZneL+FzK+YfJIidvsjZ9ziVTv+7Oy5ms4wvoKiUGNapP0v/meXXBU1KvFRof3VZQ== priteau@parallelogram.local'
212
+ @deployment_resource1 = mock()
213
+ @deployment_resource2 = mock()
214
+ @deployment_resource1.stubs(:reload)
215
+ @deployment_resource2.stubs(:reload)
216
+
217
+ @output = 'Your key cannot be fetched.'
218
+ @deployment_result2 = {
219
+ 'paramount-1.rennes.grid5000.fr' => { 'state' => 'OK' },
220
+ 'paramount-2.rennes.grid5000.fr' => { 'state' => 'OK' }
221
+ }
222
+ @deployment_resource1.stubs(:[]).with('status').returns('processing', 'processing', 'error')
223
+ @deployment_resource1.stubs(:[]).with('output').returns(@output)
224
+ @deployment_resource2.stubs(:[]).with('status').returns('processing', 'processing', 'terminated')
225
+ @deployment_resource2.expects(:[]).with('result').returns(@deployment_result2)
226
+ @min_deployed_nodes = 2
227
+ @site_deployments.expects(:submit).twice.with({ :environment => @environment, :nodes => @nodes, :key => @ssh_public_key }).returns(@deployment_resource1, @deployment_resource2)
228
+ @logger.expects(:info).with("Kadeploy run 1 with 2 nodes (0 already deployed, need 2 more)")
229
+ @logger.expects(:warn).with("Deployment error: #{@output}")
230
+ @logger.expects(:warn).with("Continuing because continue_if_error is set")
231
+ @logger.expects(:info).with("Kadeploy run 2 with 2 nodes (0 already deployed, need 2 more)")
232
+ @logger.expects(:info).with("Nodes deployed: paramount-1.rennes.grid5000.fr paramount-2.rennes.grid5000.fr")
233
+ @logger.expects(:info).with("Had to run 2 kadeploy runs, deployed 2 nodes")
234
+
235
+ @deployment = Gosen::Deployment.new(@site, @environment, @nodes, { :logger => @logger, :min_deployed_nodes => @min_deployed_nodes, :max_deploy_runs => 2, :ssh_public_key => @ssh_public_key, :continue_if_error => true })
236
+ @deployment.join
237
+ assert_equal(@nodes, @deployment.good_nodes)
238
+ assert_equal([], @deployment.bad_nodes)
239
+ end
199
240
  end
200
241
  end
201
242
  end
@@ -95,6 +95,8 @@ class TestDeploymentRun < Test::Unit::TestCase
95
95
  @ssh_public_key = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvwM1XBJCIMtAyQlweE7BVRtvgyKdwGTeYCI4AFlsTtti4y0Ipe5Hsygx3p7S0BHFiJsVZWDANMRwZ4tcjp8YnjnMkG2yp1jB1qgUf34t/MmEQL0KkoOk8tIIb28o7nTFYKO15mXJm9yBVS1JY8ozEfnA7s5hkrdnvM6h9Jv6VScp8C1XTKmpEy3sWOeUlmCkYftYSr1fLM/7qk9S2TnljA/CGiK9dq2mhJMjnDtulVrdpc1hbh+0oCzL6m2BfXX3v4q1ORml8o04oFeEYDN5qzZneL+FzK+YfJIidvsjZ9ziVTv+7Oy5ms4wvoKiUGNapP0v/meXXBU1KvFRof3VZQ== priteau@parallelogram.local'
96
96
  @resource = mock()
97
97
  @resource.stubs(:[]).with('status').returns('processing', 'processing', 'error')
98
+ @output = 'Your key cannot be fetched.'
99
+ @resource.stubs(:[]).with('output').returns(@output)
98
100
  @resource.expects(:reload).twice
99
101
  Kernel.expects(:sleep).with(Gosen::DeploymentRun::POLLING_TIME).twice
100
102
 
@@ -106,9 +108,14 @@ class TestDeploymentRun < Test::Unit::TestCase
106
108
  @deployment = Gosen::DeploymentRun.new(@site, @environment, @nodes, { :ssh_public_key => @ssh_public_key })
107
109
  end
108
110
 
109
- should 'raise an exception' do
111
+ should 'raise an exception and print the deployment output' do
110
112
  assert_raise(Gosen::Error) {
111
- @deployment.join
113
+ begin
114
+ @deployment.join
115
+ rescue Gosen::Error => e
116
+ assert_equal("Deployment error: #{@output}", e.message)
117
+ raise e
118
+ end
112
119
  }
113
120
  end
114
121
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 5
9
- version: 0.1.5
8
+ - 6
9
+ version: 0.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Pierre Riteau
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-25 00:00:00 +02:00
17
+ date: 2010-10-26 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency