class ZestKnife

Constants

OPTS
VALIDATORS

Attributes

validated_opts[RW]
base_domain[RW]
internal_domain[RW]

Public Class Methods

AWS_REGIONS() click to toggle source
# File lib/knife-instance/zestknife.rb, line 19
def self.AWS_REGIONS
  []
end
aws_for_region(region) click to toggle source
# File lib/knife-instance/zestknife.rb, line 15
def self.aws_for_region(region)
  Zest::AWS.new(Chef::Config[:knife][:aws_access_key_id], Chef::Config[:knife][:aws_secret_access_key], region)
end
in_all_aws_regions() { |aws_for_region| ... } click to toggle source
# File lib/knife-instance/zestknife.rb, line 23
def self.in_all_aws_regions
  self.AWS_REGIONS.each do |region|
    yield self.aws_for_region(region)
  end
end
validates(*args) click to toggle source
# File lib/knife-instance/zestknife.rb, line 153
def self.validates(*args)
  raise "Invalid argument(s) passed to validates: #{args - VALIDATORS.keys}" unless (args - VALIDATORS.keys).empty?
  self.validated_opts ||= []
  self.validated_opts.concat args
end
with_opts(*args) click to toggle source
# File lib/knife-instance/zestknife.rb, line 137
def self.with_opts(*args)
  invalid_args = args.select {|arg| !OPTS.keys.include? arg }
  raise "Invalid option(s) passed to with_opts: #{invalid_args.join(", ")}" unless invalid_args.empty?

  args.each do |arg|
    option arg, OPTS[arg]
  end
end
with_validated_opts(*args) click to toggle source
# File lib/knife-instance/zestknife.rb, line 148
def self.with_validated_opts(*args)
  with_opts(*args)
  validates(*args)
end

Public Instance Methods

check_services(hostname) click to toggle source
# File lib/knife-instance/zestknife.rb, line 114
def check_services hostname
  find_item(Chef::Node, hostname) +
    find_item(Chef::ApiClient, hostname) +
    find_ec2(hostname) +
    find_r53(hostname)
end
domain() click to toggle source
# File lib/knife-instance/zestknife.rb, line 88
def domain
  @internal_domain || ""
end
domain_prefix() click to toggle source
# File lib/knife-instance/zestknife.rb, line 125
def domain_prefix
  base_domain[0]
end
environment_prefix(env) click to toggle source
# File lib/knife-instance/zestknife.rb, line 129
def environment_prefix env
  env[0]
end
errors() click to toggle source
# File lib/knife-instance/zestknife.rb, line 165
def errors
  @errors ||= []
end
errors?() click to toggle source
# File lib/knife-instance/zestknife.rb, line 169
def errors?
  !errors.empty?
end
find_ec2(name) click to toggle source
# File lib/knife-instance/zestknife.rb, line 38
def find_ec2(name)
  nodes = {}
  self.class.in_all_aws_regions do |zest_aws|
    nodes = nodes.merge(zest_aws.compute.servers.group_by { |s| s.tags["Name"] })
  end
  nodes[name].nil? ? [] : nodes[name]
end
find_item(klass, name) click to toggle source
# File lib/knife-instance/zestknife.rb, line 29
def find_item(klass, name)
  begin
    object = klass.load(name)
    return [object]
  rescue Net::HTTPServerException
    return []
  end
end
find_r53(name) click to toggle source
# File lib/knife-instance/zestknife.rb, line 46
def find_r53 name
  in_zone = zone_from_name(name)
  if in_zone.nil?
    in_zone = zone
    name = fqdn(name)
  end
  name = "#{name}." unless name[-1] == "."
  recs = in_zone.records.select {|r| r.name == name }.to_a
  recs.empty? ? [in_zone.records.get(name)].compact : recs
end
fqdn(name) click to toggle source
# File lib/knife-instance/zestknife.rb, line 83
def fqdn(name)
  return '' if name.nil? || name.empty?
  "#{name}.#{domain}"
end
generate_hostname(env) click to toggle source
# File lib/knife-instance/zestknife.rb, line 92
def generate_hostname env
  name = nil

  5.times do |i|
    name = random_hostname env
    break if check_services(name).empty?

    name = nil
    srand # re-seed rand so we don't get stuck in a sequence
  end

  errors << "Unable to find available hostname in 5 tries" if name.nil?
  name
end
msg_pair(label, value, color=:cyan) click to toggle source
# File lib/knife-instance/zestknife.rb, line 9
def msg_pair(label, value, color=:cyan)
  if value && !value.to_s.empty?
    puts "#{ui.color(label, color)}: #{value}"
  end
end
random_hostname(env) click to toggle source
# File lib/knife-instance/zestknife.rb, line 121
def random_hostname env
  "#{domain_prefix}#{environment_prefix env}#{random_three_digit_number}"
end
random_three_digit_number() click to toggle source
# File lib/knife-instance/zestknife.rb, line 133
def random_three_digit_number
  sprintf("%03d", rand(1000))
end
setup_config(keys=[:aws_access_key_id, :aws_secret_access_key]) click to toggle source
# File lib/knife-instance/zestknife.rb, line 159
def setup_config(keys=[:aws_access_key_id, :aws_secret_access_key])
  keys.each do |k|
    Chef::Config[:knife][k] = ENV[k.to_s] if Chef::Config[:knife][k].nil? && ENV[k.to_s]
  end
end
validate!(keys=[:aws_access_key_id, :aws_secret_access_key]) click to toggle source
# File lib/knife-instance/zestknife.rb, line 173
def validate!(keys=[:aws_access_key_id, :aws_secret_access_key])
  keys.each do |k|
    if Chef::Config[:knife][k].nil? & config[k].nil?
      errors << "You did not provide a valid '#{k}' value."
    end
  end

  self.class.validated_opts.each do |opt|
    send VALIDATORS[opt]
  end if self.class.validated_opts

  if errors.each { |e| ui.error(e) }.any?
    exit 1
  end
end
validate_color() click to toggle source
# File lib/knife-instance/zestknife.rb, line 201
def validate_color
  unless @color
    errors << "You must provide a cluster_tag with the -t option"
  end
end
validate_domain() click to toggle source
# File lib/knife-instance/zestknife.rb, line 192
def validate_domain
end
validate_env() click to toggle source
# File lib/knife-instance/zestknife.rb, line 189
def validate_env
end
validate_force_deploy() click to toggle source
# File lib/knife-instance/zestknife.rb, line 198
def validate_force_deploy
end
validate_hostname(hostname) click to toggle source
# File lib/knife-instance/zestknife.rb, line 107
def validate_hostname hostname
  errors << "hostname can't be blank" and return if (hostname.nil? || hostname.empty?)
  check_services(hostname).each do |service|
    errors << "#{hostname} in #{service.class} already exists. Delete first."
  end
end
validate_prod() click to toggle source
# File lib/knife-instance/zestknife.rb, line 207
def validate_prod
end
validate_region() click to toggle source
# File lib/knife-instance/zestknife.rb, line 195
def validate_region
end
zone() click to toggle source
# File lib/knife-instance/zestknife.rb, line 57
def zone
  unless @zone
    self.class.in_all_aws_regions do |zest_aws|
      @zone ||= zest_aws.dns.zones.detect { |z| z.domain.downcase == domain }
    end
    raise "Could not find DNS zone" unless @zone
  end

  @zone
end
zone_from_name(dns_name) click to toggle source
# File lib/knife-instance/zestknife.rb, line 68
def zone_from_name dns_name
  name, tld = dns_name.split(".")[-2..-1]
  if name && tld
    dns_domain = "#{name}.#{tld}"
    zone = nil

    self.class.in_all_aws_regions do |zest_aws|
      zone1 = zest_aws.dns.zones.select {|x| x.domain =~ /^#{dns_domain}/ }.first
      zone = zone1 if zone1
    end

    zone
  end
end