colinsurprenant/redstorm

View on GitHub
vagrant/Vagrantfile

Summary

Maintainability
Test Coverage
# -*- mode: ruby -*-
# vi: set ft=ruby :

# @param swap_size_mb [Integer] swap size in megabytes
# @param swap_file [String] full path for swap file, default is /swapfile1
# @return [String] the script text for shell inline provisioning
def create_swap(swap_size_mb, swap_file = "/swapfile1")
  <<-EOS
    if [ ! -f #{swap_file} ]; then
      echo "Creating #{swap_size_mb}mb swap file=#{swap_file}. This could take a while..."
      dd if=/dev/zero of=#{swap_file} bs=1024 count=#{swap_size_mb * 1024}
      mkswap #{swap_file}
      chmod 0600 #{swap_file}
      swapon #{swap_file}

      if ! grep -Fxq "#{swap_file} swap swap defaults 0 0" /etc/fstab
      then
        echo "#{swap_file} swap swap defaults 0 0" >> /etc/fstab
      fi
    fi
  EOS
end

# execute chef provisionning with environment specific configs
# this is an attempt to DRY up the dev/prod provisionning
# @param chef [Object] the chef provisionner, see Vagrant doc
# @param env [Symbol] the environment symbol, :dev, :prod, etc
def provision(chef, env)
# provision = lambda do |chef|
  # chef.log_level = :debug

  chef.cookbooks_path = ["./cookbooks"]
  chef.roles_path = ["./roles"]
  chef.data_bags_path = ["./databags"]

  # setup users (from data_bags/users/*.json)
  chef.add_recipe "users::sysadmins" # creates users and sysadmin group
  chef.add_recipe "users::sysadmin_sudo" # adds %sysadmin group to sudoers

  chef.add_recipe "ohai"
  chef.add_recipe "apt"
  chef.add_recipe "build-essential"
  chef.add_recipe "git"
  chef.add_recipe "redisio::install"
  chef.add_recipe "redisio::enable"
  chef.add_recipe "runit"
  chef.add_recipe "java"
  chef.add_recipe "storm::singlenode"

  chef.json = {
    :java => {
      :oracle => {
        "accept_oracle_download_terms" => true
      },
      :install_flavor => "openjdk",
      :jdk_version => "7",
    },

    :storm => {
      :version => "0.9.1-incubating",

      :deploy => {
        :user => "storm",
        :group => "storm",
      },
    },
  }

  case env
  when :dev
    chef.json[:storm].merge!({
      :nimbus => {
        :host => "localhost",
        :childopts => "-Xmx128m",
      },
      :supervisor => {
        :hosts =>  ["localhost"],
        :childopts => "-Xmx128m",
      },
      :worker => {
        :childopts => "-Xmx128m",
      },
      :ui => {
        :childopts => "-Xmx128m",
      },
    })
  when :prod
    chef.json[:storm].merge!({
      :nimbus => {
        :host => "localhost",
        :childopts => "-Xmx768m",
      },
      :supervisor => {
        :hosts =>  ["localhost"],
        :childopts => "-Xmx256m",
      },
      :worker => {
        :childopts => "-Xmx4096m -Xms4096m",
      },
      :ui => {
        :childopts => "-Xmx768m",
      },
    })
  else
    raise("invalid env=#{env.inspect}")
  end
end

# use version 2 config object
Vagrant.configure("2") do |config|
  config.ssh.forward_agent = true

  config.vm.define :prod do |prod|
    prod.vm.box = "dummy"
    prod.ssh.username = "ubuntu"

    prod.vm.provider :aws do |aws, override|
      aws.access_key_id = ENV["ACCESS_KEY_ID"]
      aws.secret_access_key = ENV["SECRET_ACCESS_KEY"]
      aws.keypair_name = ENV["KEYPAIR_NAME"]
      override.ssh.private_key_path = ENV["PRIVATE_KEY_PATH"]

      aws.ami = "ami-0cdf4965" # Ubuntu 12.10, us-east-1, 64bits, ebs root
      aws.instance_type = "m1.large"
      aws.region = "us-east-1"
      aws.tags = {"Name" => "redstorm_cluster"}
      aws.security_groups = ["storm", "ssh"]
    end

    # TODO on EC2, add swap on ephemeral device not ebs boot
    prod.vm.provision :shell, :inline => create_swap(1024, "/mnt/swapfile1")

    prod.vm.provision :chef_solo do |chef|
      provision(chef, :prod)
    end
  end

  config.vm.define :dev do |dev|
    dev.vm.box = "precise-amd64"
    dev.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box"

    # storm ui
    dev.vm.network :forwarded_port, :guest => 8080, :host => 8080

    # storm numbus thrift
    dev.vm.network :forwarded_port, :guest => 6627, :host => 6627

    # storm drpc
    dev.vm.network :forwarded_port, :guest => 3772, :host => 3772

    # redis
    dev.vm.network :forwarded_port, :guest => 6379, :host => 6379

    dev.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", 1536]
    end

    dev.vm.provision :shell, :inline => create_swap(256)

    dev.vm.provision :chef_solo do |chef|
      provision(chef, :dev)
    end
  end

  # vagrant-omnibus plugin: auto install/upgrate chef
  config.omnibus.chef_version = "10.18.2"
end