49 lines
1.3 KiB
Ruby
49 lines
1.3 KiB
Ruby
class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base
|
|
MAX_ATTEMPTS = 5
|
|
|
|
default_command :perform
|
|
|
|
desc "perform", "Health check current app version"
|
|
def perform
|
|
on(MRSK.primary_host) do
|
|
begin
|
|
execute *MRSK.healthcheck.run
|
|
|
|
target = "Health check against #{MRSK.config.healthcheck["path"]}"
|
|
attempt = 1
|
|
|
|
begin
|
|
status = capture_with_info(*MRSK.healthcheck.curl)
|
|
|
|
if status == "200"
|
|
info "#{target} succeeded with 200 OK!"
|
|
else
|
|
raise "#{target} failed with status #{status}"
|
|
end
|
|
rescue SSHKit::Command::Failed
|
|
if attempt <= MAX_ATTEMPTS
|
|
info "#{target} failed to respond, retrying in #{attempt}s..."
|
|
sleep attempt
|
|
attempt += 1
|
|
|
|
retry
|
|
else
|
|
raise
|
|
end
|
|
end
|
|
rescue SSHKit::Command::Failed => e
|
|
error capture_with_info(*MRSK.healthcheck.logs)
|
|
|
|
if e.message =~ /curl/
|
|
raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!"
|
|
else
|
|
raise
|
|
end
|
|
ensure
|
|
execute *MRSK.healthcheck.stop, raise_on_non_zero_exit: false
|
|
execute *MRSK.healthcheck.remove, raise_on_non_zero_exit: false
|
|
end
|
|
end
|
|
end
|
|
end
|