Skip to content

Commit 92a168e

Browse files
committed
Roll-forward clean up: separate actions and checks
1 parent b6aa2fb commit 92a168e

File tree

2 files changed

+75
-59
lines changed

2 files changed

+75
-59
lines changed

lib/jecloud/application.rb

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,10 @@ def roll_forward!
107107
next_attempt = nil
108108
while cont
109109
update_config do
110-
session = Session.new(@config.failures)
111-
cont = roll_forward_step! session
112-
next_attempt = session.next_attempt
110+
Session.new(@config.failures).tap do |session|
111+
roll_forward_step! session
112+
next_attempt, cont = session.next_attempt, session.any_actions_executed?
113+
end
113114
end
114115
end
115116
if next_attempt
@@ -159,70 +160,62 @@ def roll_forward_step! session
159160
raise ExpectedDelay, "No IP address assigned yet"
160161
end
161162

162-
jecloud_installed = false
163-
session.action "#{server.uuid}-ssh" do
164-
session.action "#{server.uuid}-sudo-test" do
165-
x = server_session.sudo!("echo ok").strip
166-
if x == 'ok'
167-
$log.debug "sudo test ok"
168-
else
169-
raise UnexpectedExternalProblem, "sudo does not work on #{server.public_ip}"
170-
end
163+
session.check "#{server.uuid}-sudo-test" do
164+
x = server_session.sudo!("echo ok").strip
165+
if x == 'ok'
166+
$log.debug "sudo test ok"
167+
else
168+
raise UnexpectedExternalProblem, "sudo does not work on #{server.public_ip}"
171169
end
170+
end
172171

172+
jecloud_installed = session.check("#{server.uuid}-is-jecloud-up-to-date") do
173173
jecloud_version = server_session.exec!("jecloud print-version || echo 'NONE'").strip
174-
$log.debug "JeCloud version on the server: #{jecloud_version}"
175-
if jecloud_version =~ /^\d+\.\d+(?:\.\d+(?:\.\d+)?)?$/
176-
if jecloud_version.pad_numbers >= JeCloud::VERSION.pad_numbers
177-
$log.debug "JeCloud installed on the server is good enough."
178-
jecloud_installed = true
179-
end
174+
(jecloud_version =~ /^\d+\.\d+(?:\.\d+(?:\.\d+)?)?$/ && jecloud_version.pad_numbers >= JeCloud::VERSION.pad_numbers).tap do |is_good_enough|
175+
$log.debug "JeCloud version on the server: #{jecloud_version} (#{is_good_enough ? 'Good to go!' : 'Need to (re)install JeCloud.'})"
180176
end
177+
end
178+
179+
session.action "#{server.uuid}-install-jecloud", :unless => jecloud_installed do
180+
yum_packages = %w/gcc gcc-c++ openssl openssl-devel ruby-devel rubygems git/
181+
182+
$log.debug "Installing yum packages: #{yum_packages.join(' ')}"
183+
server_session.sudo_print!("yum install -y #{yum_packages.join(' ')}")
184+
$log.info "Installed yum packages: #{yum_packages.join(' ')}"
185+
186+
$log.debug "Rebuilding JeCloud locally"
187+
puts `rake build`
188+
raise UnexpectedExternalProblem, "JeCloud build failed" unless $?.success?
181189

182-
session.action "#{server.uuid}-install-jecloud", :unless => jecloud_installed do
183-
yum_packages = %w/gcc gcc-c++ openssl openssl-devel ruby-devel rubygems git/
184-
185-
$log.debug "Installing yum packages: #{yum_packages.join(' ')}"
186-
server_session.sudo_print!("yum install -y #{yum_packages.join(' ')}")
187-
$log.info "Installed yum packages: #{yum_packages.join(' ')}"
188-
189-
$log.debug "Rebuilding JeCloud locally"
190-
puts `rake build`
191-
raise UnexpectedExternalProblem, "JeCloud build failed" unless $?.success?
192-
193-
remote_path = "/tmp/#{File.basename(GEM_FILE)}"
194-
$log.debug "Uploading JeCloud gem into #{server.public_ip}:#{remote_path}"
195-
server_session.sftp.file.open(remote_path, 'w') do |of|
196-
of.write(File.read(GEM_FILE))
197-
end
198-
server_session.sftp.loop
199-
200-
$log.debug "Uninstalling old JeCloud version if any"
201-
server_session.sudo_print!("gem uninstall --executables jecloud")
202-
203-
$log.debug "Installing JeCloud gem"
204-
server_session.sudo_print!("gem install --no-rdoc --no-ri #{remote_path}")
205-
206-
jecloud_version = server_session.exec!("jecloud print-version || echo 'NONE'").strip
207-
if jecloud_version == JeCloud::VERSION
208-
$log.info "Installed JeCloud on #{server.public_ip}"
209-
else
210-
puts jecloud_version
211-
raise UnexpectedExternalProblem, "Installation of JeCloud failed on #{server.public_ip}"
212-
end
190+
remote_path = "/tmp/#{File.basename(GEM_FILE)}"
191+
$log.debug "Uploading JeCloud gem into #{server.public_ip}:#{remote_path}"
192+
server_session.sftp.file.open(remote_path, 'w') do |of|
193+
of.write(File.read(GEM_FILE))
213194
end
195+
server_session.sftp.loop
214196

215-
# deployment requested?
216-
if server.deployment?
217-
# pretend that it succeeded
218-
server.deployment = nil
219-
return true
197+
$log.debug "Uninstalling old JeCloud version if any"
198+
server_session.sudo_print!("gem uninstall --executables jecloud")
199+
200+
$log.debug "Installing JeCloud gem"
201+
server_session.sudo_print!("gem install --no-rdoc --no-ri #{remote_path}")
202+
203+
jecloud_version = server_session.exec!("jecloud print-version || echo 'NONE'").strip
204+
if jecloud_version == JeCloud::VERSION
205+
$log.info "Installed JeCloud on #{server.public_ip}"
206+
else
207+
puts jecloud_version
208+
raise UnexpectedExternalProblem, "Installation of JeCloud failed on #{server.public_ip}"
220209
end
221210
end
211+
212+
session.action "#{server.uuid}-start-deployment", :if => server.deployment? do
213+
# pretend that it succeeded
214+
server.deployment = nil
215+
end
222216
end
223217
server_session.close!
224218
end
225-
return false
226219
end
227220

228221
private

lib/jecloud/session.rb

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,39 @@ class Session
88
def initialize failures
99
@failures = failures
1010
@next_attempt = nil
11+
@any_actions_executed = false
1112
end
1213

13-
def action name, options={}
14+
def any_actions_executed?
15+
@any_actions_executed
16+
end
17+
18+
def action name, options={}, &block
19+
raise "action must have :if or :unless condition specified" unless options.include?(:if) || options.include?(:unless)
20+
21+
options = { :if => true, :unless => false }.merge(options)
22+
unless options.if && !options.unless
23+
$log.debug "Not needed: #{name}"
24+
return
25+
end
26+
run_action_or_check name, &block
27+
@any_actions_executed = true # got here, so action succeeded
28+
end
29+
30+
# check results should be cached eventually, but for now run them every time
31+
def check name, options={}, &block
1432
options = { :if => true, :unless => false }.merge(options)
1533
unless options.if && !options.unless
1634
$log.debug "Not needed: #{name}"
1735
return
1836
end
1937

38+
run_action_or_check name, &block
39+
end
40+
41+
private
42+
43+
def run_action_or_check name
2044
failure = @failures.delete(name) || Hashie::Mash.new
2145
now = Time.now.to_i
2246
next_attempt = failure.last && failure.last + failure.delay
@@ -28,7 +52,7 @@ def action name, options={}
2852
else
2953
$log.debug "Starting: #{name}"
3054
begin
31-
yield
55+
result = yield
3256
$log.info "Succeeded: #{name}"
3357
rescue Exception => e
3458
message = "#{e.class.name}: #{e.message}"
@@ -47,9 +71,8 @@ def action name, options={}
4771
throw :failed
4872
end
4973
end
74+
return result
5075
end
5176

52-
private
53-
5477
end
5578
end

0 commit comments

Comments
 (0)