class HiveQueen

Special cases:

Keeps an in-memory history of printed lines (to persist to HQ), and puts to stderr (capistrano's default)

Attributes

endpoint[RW]
logger[RW]
password[RW]
project[RW]
username[RW]

Public Class Methods

commit_status(commit_sha) click to toggle source
# File lib/capistrano/hivequeen.rb, line 47
def commit_status(commit_sha)
  get("/projects/#{project}/commit_statuses/#{commit_sha}.json")
end
credentials_from_path() click to toggle source
# File lib/capistrano/hivequeen.rb, line 75
def credentials_from_path
  # Check that credentials are not accessible to world or group
  mode = File.stat(credentials_path).mode
  raise InsecureCredentials unless (mode % 64 == 0)

  File.read(credentials_path)

rescue InsecureCredentials
  puts "#{credentials_path} is insecure. Please change you password and run"
  puts "chmod 600 #{credentials_path}"
  exit 1
rescue Errno::ENOENT, RuntimeError
  puts "Could not read HiveQueen credentials from #{credentials_path}."
  puts "#{credentials_path} should contain your username and password seperated by a colon"
  puts "Run this command with your credentials:"
  puts " $ echo username:password > #{credentials_path}; chmod 600 #{credentials_path}"
  exit 1
end
default_roles() click to toggle source
# File lib/capistrano/hivequeen.rb, line 25
def default_roles
  @project_data['default_roles']
end
environment_names() click to toggle source
# File lib/capistrano/hivequeen.rb, line 33
def environment_names
  environments.map{|e| e['name'].to_sym }
end
environments() click to toggle source
# File lib/capistrano/hivequeen.rb, line 29
def environments
  project_data['environments']
end
finish_deployment(environment_id, deployment_id) click to toggle source
# File lib/capistrano/hivequeen.rb, line 59
def finish_deployment(environment_id, deployment_id)
  state = $! ? 'failed' : 'succeeded'
  puts "Finishing deployment in Hivequeen. State: #{state}"
  params = {:deployment => {:state => state}}
  deploy_log = logger.device.history
  params[:deployment][:deploy_log] = deploy_log if deploy_log
  put_or_post('PUT', "/environments/#{environment_id}/deployments/#{deployment_id}.json", params)
end
get_credentials!() click to toggle source

Load credentials from ~/.hivequeen

# File lib/capistrano/hivequeen.rb, line 69
def get_credentials!
  creds = ENV['HIVEQUEEN_CREDENTIALS'] || credentials_from_path
  @username, @password = creds.chomp.split(':')
  raise unless username && password
end
project_data() click to toggle source
# File lib/capistrano/hivequeen.rb, line 21
def project_data
  @project_data ||= get("/#{project}.json")
end
repository() click to toggle source
# File lib/capistrano/hivequeen.rb, line 37
def repository
  project_data['repo']
end
roles(env_id) click to toggle source
# File lib/capistrano/hivequeen.rb, line 41
def roles(env_id)
  env_id = env_id.to_sym
  @roles ||= {}
  @roles[env_id] ||= get("/#{env_id}.json")
end
start_deployment(environment_id, params) click to toggle source
# File lib/capistrano/hivequeen.rb, line 51
def start_deployment(environment_id, params)
  required_params = [:task, :commit]
  required_params.each do |key|
    raise ArgumentError.new("#{key} is a required param") unless params.key?(key)
  end
  put_or_post('POST', "/environments/#{environment_id}/deployments.json", :deployment => params)
end

Protected Class Methods

auth_header() click to toggle source
# File lib/capistrano/hivequeen.rb, line 103
def auth_header
  value = Base64.encode64([username, password] * ':').gsub(/\n/, '')
  { 'Authorization' => "Basic #{value}" }
end
connection() click to toggle source
# File lib/capistrano/hivequeen.rb, line 99
def connection
  Excon.new(endpoint)
end
credentials_path() click to toggle source
# File lib/capistrano/hivequeen.rb, line 95
def credentials_path
  ENV['HIVEQUEEN_CREDENTIALS_PATH'] || File.join(ENV['HOME'], '.hivequeen')
end
get(path) click to toggle source
# File lib/capistrano/hivequeen.rb, line 108
def get(path)
  url = "#{endpoint}#{path}"
  logger.trace "Fetching #{url}"
  response = connection.request(:method => 'GET', :path => path, :headers => auth_header)
  unless (200..299).include?(response.status)
    raise "Request to #{url} returned #{response.status} status"
  end
  JSON.parse(response.body)
end
put_or_post(method, path, data) click to toggle source
# File lib/capistrano/hivequeen.rb, line 118
def put_or_post(method, path, data)
  headers = auth_header.merge("Content-type"=>"application/json", "Accept"=>"application/json")
  response = connection.request(:path => path, :method => method, :headers => headers, :body => data.to_json)
  case response.status
  when 204
    # Do nothing
  when (200..299)
    JSON.parse(response.body)
  when (400..499)
    errors = JSON.parse(response.body)
    raise DeploymentError.new(errors.inspect)
  else
    raise "Request to #{path} returned #{response.status} status"
  end
end