class KumoDockerCloud::Deployment

Attributes

app_name[RW]
contactable[RW]
health_check_path[R]
stack_name[R]
version[R]
version_check_path[R]

Public Class Methods

new(stack_name, version, _ = nil) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 15
def initialize(stack_name, version, _ = nil)
  @stack_name = stack_name
  @version = version
  @contactable = true

  @health_check_path = 'site_status'
  @version_check_path = "#{health_check_path}/version"
end

Public Instance Methods

validate() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 24
def validate
  wait_for_running_state
  validate_containers
end
wait_for_exit_state() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 38
def wait_for_exit_state
  exit_state_provider = lambda {
    service = docker_cloud_api.services.get(service_uuid)
    { name: service.name, exit_code: service.containers.first.exit_code }
  }

  StateValidator.new(exit_state_provider).wait_for_exit_state(240)
end
wait_for_running_state() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 29
def wait_for_running_state
  service_state_provider = lambda {
    service = docker_cloud_api.services.get(service_uuid)
    { name: service.name, state: service.state }
  }

  StateValidator.new(service_state_provider).wait_for_state('Running', 240)
end

Private Instance Methods

current_state() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 60
def current_state
  return 'an unknown state' if @parsed_service_info.nil?
  @parsed_service_info.fetch('state', 'an unknown state')
end
docker_cloud_api() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 56
def docker_cloud_api
  @docker_cloud_api ||= KumoDockerCloud::DockerCloudApi.new
end
safe_http_get(url) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 120
def safe_http_get(url)
  tries ||= 3
  request = HTTPI::Request.new(url: url, open_timeout: 5, read_timeout: 5)
  HTTPI.get(request)
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError,
    Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
  sleep 5

  if (tries -= 1).zero?
    raise e
  else
    retry
  end
end
service_uuid(service_name) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 49
def service_uuid(service_name)
  @service_uuid ||= begin
    services = docker_cloud_api.service_by_stack_and_service_name(stack_name, service_name)
    services.first.uuid
  end
end
validate_container_data(container) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 77
def validate_container_data(container)
  unless container.name.start_with?(app_name)
    puts "Skipping #{container.name}"
    return
  end
  print "Checking '#{container.name}' (#{container.uuid}): "

  raise "Unexpected number of open container ports" if container.container_ports.size != 1

  if contactable
    endpoint_uri = container.container_ports.first.endpoint_uri.gsub(/^tcp:/, 'http:')
    validate_container_version(endpoint_uri)
    validate_container_health(endpoint_uri)
  end
  print "\n"
end
validate_container_health(endpoint_uri) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 108
def validate_container_health(endpoint_uri)
  health_check_uri = "#{endpoint_uri}#{health_check_path}"
  print "Health "
  response = safe_http_get(health_check_uri)
  if response.code == 200
    print "OK"
  else
    puts "Unhealthy (HTTP #{response.code}): #{response.body}"
    raise DeploymentError.new
  end
end
validate_container_version(endpoint_uri) click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 94
def validate_container_version(endpoint_uri)
  version_check_uri = "#{endpoint_uri}#{version_check_path}"
  print "Version "
  response = safe_http_get(version_check_uri)
  actual_version = response.body.strip

  if actual_version == version
    print "OK, "
  else
    puts "Incorrect: Should be '#{version}'; reported '#{actual_version}'"
    raise DeploymentError.new
  end
end
validate_containers() click to toggle source
# File lib/kumo_dockercloud/deployment.rb, line 65
def validate_containers
  puts "Getting containers"

  containers = docker_cloud_api.containers_by_stack_name(stack_name)

  HTTPI.log = false

  containers.each do |container|
    validate_container_data(container)
  end
end