class Skirnir::Site

Attributes

chef[R]
config[R]
info[R]
nodes[R]
silent[RW]
vagrant[R]

Public Class Methods

new() click to toggle source
# File lib/skirnir/site.rb, line 11
def initialize
  @silent = false
end

Public Instance Methods

all_environments(filename = DEFAULT_FILENAME) click to toggle source
# File lib/skirnir/site.rb, line 96
def all_environments(filename = DEFAULT_FILENAME)
  all = get_config

  all.keys.select {|x| x != 'common'}
end
chef_data_for_all_nodes() click to toggle source
# File lib/skirnir/site.rb, line 75
def chef_data_for_all_nodes
  result = {}

  @nodes.each do |node|
    name = node.name

    name += @info['node_suffix'] unless @info['node_suffix'].empty?

    attribs = chef_hash_for_node(node)
    run_list = node.run_list

    result[name] = { 'attributes' => attribs, 'run_list' => run_list}
  end

  result
end
chef_hash_for_node(node) click to toggle source

@param node [Node]

# File lib/skirnir/site.rb, line 64
def chef_hash_for_node(node)
  result = chef.get_for_roles(node.roles)
  result.deep_merge!(node.chef_hash)

  nodes_info = @nodes.map {|n| n.to_h}
  nodes_hash = Hash.construct(%w(site nodes), nodes_info)
  result.deep_merge!(nodes_hash)

  result
end
chef_hash_for_node_name(name) click to toggle source
# File lib/skirnir/site.rb, line 55
def chef_hash_for_node_name(name)
  node = (@nodes.select {|node| node.name == name}).first

  raise "Unknown node name ''#{name}''" if node.nil?

  chef_hash_for_node(node)
end
nodes_with_role(role) click to toggle source

@return [Array<Node>]

# File lib/skirnir/site.rb, line 51
def nodes_with_role(role)
  @nodes.select {|node| node.has_role? role}
end
read(env, filename = DEFAULT_FILENAME) click to toggle source
# File lib/skirnir/site.rb, line 27
def read(env, filename = DEFAULT_FILENAME)
  all = get_config filename
  puts "- Section: #{env}\n\n" unless @silent

  config = all['common'].deep_merge!(all[env])

  if File.exists?(LOCAL_FILENAME)
    local = YAML.load(IO.read(LOCAL_FILENAME))
    config.deep_merge!(local)
  end

  @config = config
  @info = config['info']
  @vagrant = config['vagrant']

  @chef = Skirnir::Chef.new(config['chef'])
  @nodes = config['nodes'].map {|node| Skirnir::Node.new(site_name, node)}

  setup_role_chefs

  @nodes
end
read_default() click to toggle source
# File lib/skirnir/site.rb, line 15
def read_default
  env=get_env_from_local_section('vagrant')

  read(env, 'config.yml')
end
read_for_update() click to toggle source
# File lib/skirnir/site.rb, line 21
def read_for_update
  env = get_env_from_local_section('update')

  read(env, 'config.yml')
end
site_name() click to toggle source
# File lib/skirnir/site.rb, line 92
def site_name
  @info['site_name']
end

Private Instance Methods

get_config(filename = DEFAULT_FILENAME) click to toggle source
# File lib/skirnir/site.rb, line 103
def get_config(filename = DEFAULT_FILENAME)
  puts "Reading config from #{filename}\n" unless @silent
  YAML.load(IO.read(filename))
end
get_env_from_local_section(section_name) click to toggle source
# File lib/skirnir/site.rb, line 108
def get_env_from_local_section(section_name)
  raise "Can't determine default environment; #{LOCAL_FILENAME} missing" unless File.exists?(LOCAL_FILENAME)

  local = YAML.load(IO.read(LOCAL_FILENAME))

  unless local.has_key?(section_name) && local[section_name].has_key?('env')
    raise "Can't determine default environment; YAML #{section_name}/env entry missing"
  end

  local[section_name]['env']
end
setup_chef_app_should_migrate() click to toggle source
# File lib/skirnir/site.rb, line 148
def setup_chef_app_should_migrate
  should_migrate = true

  nodes_with_role('app').each do |node|
    node.chef.set('all', %w(site app should_migrate), should_migrate)
    should_migrate = false
  end
end
setup_chef_db_host() click to toggle source
# File lib/skirnir/site.rb, line 126
def setup_chef_db_host
  db_nodes = nodes_with_role('db')

  raise "Expected single node with role 'db'; found #{db_nodes.count}" if db_nodes.count != 1

  db_ip = db_nodes[0].ip_int
  app_nodes = nodes_with_role('app')

  is_local = app_nodes.all? {|node| node.ip_int == db_ip}

  @chef.set('all', %w(site db host), is_local ? 'localhost' : db_ip)
  @chef.set('all', %w(site db is_local), is_local)
  @chef.set('db', %w(site db bind_address), is_local ? '127.0.0.1' : db_ip)
end
setup_chef_nginx() click to toggle source
# File lib/skirnir/site.rb, line 141
def setup_chef_nginx
  # TODO this is no good for staging, need is_local for web too
  web_ips = nodes_with_role('web').map{|node| node.ip_int}.map{|ip| "#{ip}/32"}

  @chef.set('app', ['nginx'], { 'authorized_ips' => web_ips, 'realip' => { 'addresses' => web_ips}})
end
setup_role_chefs() click to toggle source
# File lib/skirnir/site.rb, line 120
def setup_role_chefs
  setup_chef_db_host
  setup_chef_nginx
  setup_chef_app_should_migrate
end