class SaltedRails::Config

Attributes

admin_password[RW]
box[RW]
ca_path[RW]
copy_from_home[RW]
databases[RW]
domain[RW]
files[RW]
forward_agent[RW]
gems[RW]
hostname[RW]
logger[RW]
machine[RW]
machines[RW]
mapped_ports[RW]
memory[RW]
mirror[RW]
packages[RW]
ports[RW]
private_key_path[RW]
project_root[RW]
region[RW]
roles[RW]
salt_root[RW]
staging_password[RW]
sync_vagrant[RW]
versions[RW]

Public Class Methods

new(project_root, machine = 'default') click to toggle source

pass vm.ui for the logger if you want debugging info

# File lib/salted-rails/config.rb, line 41
def initialize(project_root, machine = 'default')
  @logger = Log4r::Logger.new("vagrant::salted-rails")
  @machine = machine
  @project_root = project_root
  @project_root += '/' unless @project_root =~ /\/$/
  @salt_root = nil
  # see salt/vagrant/top.sls for other roles
  @roles = %w{ app web db }
  @domain = nil
  @admin_password = nil
  @staging_password = nil
  @private_key_path = nil
  @mirror = nil
  @memory = nil

  # app in production mode: 80, 443
  # admin: 880
  # app in dev mode: 3000
  # gem server: 8808
  @ports = [ 80, 443, 880, 3000, 8808 ]
  @mapped_ports = { }
  @sync_vagrant = nil
  @box = nil
  @ca_path = nil
  @region = nil
  @forward_agent = true
  @files = [ '.ruby-version', '.java-version', '.php-version', 'config/database.yml', 'Gemfile', 'Gemfile.lock' ].select{ |f| File.exist?(@project_root + f) }
  @packages = nil
  @copy_from_home = [ ]

  ENV['REMOTE_MACHINE'] = 'true'
  database_file = @project_root + 'config/database.yml'
  @databases = YAML.load(ERB.new(IO.read(database_file)).result) rescue { }
  ENV['REMOTE_MACHINE'] = nil

  @gems = { }
  if File.exists? @project_root + 'Gemfile'
    File.foreach(@project_root + 'Gemfile') do |line|
      if line =~ /^\s*gem\s*['"]([^'"]+)['"][,\s]*(['"]([^'"]+)['"])?/
        gem = $1
        version = $3.to_s
        version = true if version == '' or version !~ /\d/
        @gems[gem] = version
      end
    end
  end
  @databases.each do |key, details|
    @gems[details['adapter']] ||= true
  end

  @roles << 'mysql' if @gems.include?('mysql') or @gems.include?('mysql2')

  @versions= { }

  @machines = [ ]
  @hostname = nil
end

Public Instance Methods

clone() click to toggle source

Clone

# File lib/salted-rails/config.rb, line 121
def clone
  obj = self.dup
  obj.roles = @roles.dup
  obj.ports = @ports.dup
  obj.mapped_ports = @mapped_ports.dup
  obj.files = @files.dup
  obj.copy_from_home = @copy_from_home.dup
  obj.databases = @databases.dup
  obj.gems = @gems.dup
  obj
end
configure_vagrant(config) click to toggle source
# File lib/salted-rails/config.rb, line 161
def configure_vagrant(config)
  require 'salted-rails/vagrant_helper'
  normalize
  helper = SaltedRails::VagrantHelper.new(self)
  helper.configure_vagrant(config)
end
define(machine) { |obj| ... } click to toggle source
# File lib/salted-rails/config.rb, line 103
def define(machine, &block)
  obj = self.clone
  obj.machine = machine
  obj.machines = [ ]
  obj.logger = @logger
  @machines << obj
  yield(obj) if block_given?
end
gui?() click to toggle source
# File lib/salted-rails/config.rb, line 99
def gui?
  @roles.include? 'gui'
end
normalize() click to toggle source
# File lib/salted-rails/config.rb, line 168
def normalize
  @versions['mysql'] ||= '5.5' if @roles.include?('mysql')
  @versions['teamcity'] ||= '8.0.4' if @roles.include?('teamcity')
  @versions['rubymine'] ||= '5.4.3' if @roles.include?('rubymine')
  @roles << 'gui' if @roles.include?('rubymine') and not gui?

  %w{ ruby php java }.each do |lang|
    version = File.open(@project_root + ".#{lang}-version", 'r') do |f_in|
      f_in.gets.gsub(/\s/,'')
    end rescue nil
    @versions[lang] ||= version if version
  end
  unless @versions.include?('ruby')
    File.open(@project_root + '.rvmrc', 'r') do |f_in|
      while (line = f_in.gets) and not @versions.include('ruby')
        @versions['ruby'] = $1 if line =~ /^\s*environment_id=['"]([^"'@]+)/
      end
    end rescue nil
  end

  if @memory.nil?
    @memory = 512
    {
            'gui' => 1536,
            'teamcity' => 1536,
            'cruisecontrolrb' => 512
    }.each do |role, extra|
      @memory += extra if @roles.include?(role)
    end
  end

  if @domain.nil?
    if @hostname
      @domain = @hostname.sub(/^[^.]*\.?/, '')
    else
      @domain = sanitize_dns_name(File.basename(File.expand_path(@project_root).sub(/\/$/, '').sub(/\/(app|site|web|www|website)\d*$/, ''))) + '.test'
      @domain = 'railsapp.test' if @domain == '.test'
    end
  end

  if @hostname.nil? or @hostname == ''
    if @machine == 'default'
      @hostname = @domain
    else
      @hostname = sanitize_dns_name(@machine.to_s)
      if @hostname == ''
        @hostname = @domain
      else
        @hostname <<= '.' + @domain
      end
    end
  end

  @private_key_path ||= '~/.ssh/id_rsa'
  @mirror ||= 'auto'
  @salt_root ||= File.dirname(__FILE__) + '/../../'
  @ca_path ||= '/etc/ssl/certs/ca-certificates.crt'
  @ca_path = nil unless  File.exist?(@ca_path)
  @box ||= 'preciseCloud32'
  @region ||= 'San Francisco 1'

  {
          'teamcity' => 8111,
          'cruisecontrolrb' => 3333
  }.each do |role, port|
    @ports << port if @roles.include?(role) and not @ports.include?(port)
  end

  @sync_vagrant = (provider == 'virtualbox') if @sync_vagrant.nil?

  unless @roles.include?('secure') or @roles.include?('insecure')
    @roles << (provider == 'virtualbox' ? 'insecure' : 'secure')
  end
  @machines.each {|m| m.normalize}
end
provider() click to toggle source
# File lib/salted-rails/config.rb, line 112
def provider
  pat = File.join(@project_root, '.vagrant','machines',@machine,'*','id')
  prov = Dir.glob(pat).collect{|path| File.basename(File.dirname(path))}.first
  prov ||= ARGV.select{|a| a =~ /^--provider=/}.collect{|a| a.sub(/.*=/, '')}.first
  prov ||= ENV['VAGRANT_DEFAULT_PROVIDER'] || 'virtualbox'
  prov
end
sanitize_dns_name(name) click to toggle source
# File lib/salted-rails/config.rb, line 36
def sanitize_dns_name(name)
  dns_name = name.downcase.gsub(/[^-0-9a-z]+/,'-').sub(/^-+/, '').sub(/-+$/, '')
end
to_hash() click to toggle source
# File lib/salted-rails/config.rb, line 133
def to_hash
  {
    'admin_password' => @admin_password,
    'databases' => @databases,
    'disable_vagrant_sync' => @disable_vagrant_sync,
    'domain' => @domain,
    'files' => @files,
    'forward_agent' => @forward_agent,
    'gems' => @gems,
    'hostname' => @hostname,
    'machine' => @machine,
    'mapped_ports' => @mapped_ports,
    'memory' => @memory,
    'mirror' => @mirror,
    'ports' => @ports,
    'region' => @region,
    'roles' => @roles,
    'provider' => provider,
    'staging_password' => @staging_password,
    'versions' => @versions
  }
end
to_yaml() click to toggle source
# File lib/salted-rails/config.rb, line 156
def to_yaml
  normalize
  self.to_hash.to_yaml
end