Vagrant.configure("2") do |config|
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  config.vm.box = "trusty_64"
  # The exposed ports can be changed here; the ssh port is never necessary.
  # The mongo ports are where the replica-sets are exposed.
  config.vm.network "forwarded_port", guest: 22, host: 2226
  config.vm.network "forwarded_port", guest: 27060, host: 27060
  config.vm.network "forwarded_port", guest: 27061, host: 27061
  config.vm.network "forwarded_port", guest: 27062, host: 27062
  config.vm.provider "virtualbox" do |v|
    v.name = "Mongo Replica Set Docker"
    # You may need to configure this to run benignly on your host machine
    v.memory = 1024
    v.cpus = 1
  end

  $script = <<SCRIPT
if [ -f ~/vagrant_provisioned_date ]; then
    echo Already provisioned.
else


echo Starting provisioning.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' \
    | sudo tee /etc/apt/sources.list.d/mongodb.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo 'deb https://get.docker.com/ubuntu docker main' \
    | sudo tee /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install --force-yes -y apt-transport-https lxc-docker mongodb-org-shell mongodb-org-tools


# kill and remove any existing docker containers; this makes things fresh
docker kill rs1_srv1 rs1_srv2 rs1_srv3
docker rm rs1_srv1 rs1_srv2 rs1_srv3
# Clean up all of the docker images
docker rmi $(docker images -q)


mkdir -p mongod
cat <<EOT > mongod/Dockerfile
FROM ubuntu:latest

# Add 10gen official apt source to the sources list
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list

# Install MongoDB
RUN apt-get update
RUN apt-get install -y mongodb-org

# Create the MongoDB data directory
RUN mkdir -p /data/db

EXPOSE 27017
ENTRYPOINT ["usr/bin/mongod"]
EOT
docker build -t kitware/mongodb mongod



# Create the replica sets
docker run -it -p 27060:27017 --name rs1_srv1 -d kitware/mongodb --replSet rs1 --noprealloc --smallfiles
docker run -it -p 27061:27017 --name rs1_srv2 -d kitware/mongodb --replSet rs1 --noprealloc --smallfiles
docker run -it -p 27062:27017 --name rs1_srv3 -d kitware/mongodb --replSet rs1 --noprealloc --smallfiles


# Determine host IP as perceived by a docker container
#hostip=`docker inspect -f \'\{\{ .NetworkSettings.Gateway \}\}\' rs1_srv1`
hostip=`ip route show 0.0.0.0/0 | grep -Eo \'via \\S+\' | awk \'{ print \\$2 }\'`


# Configure the replica set
until mongo --port 27060 admin --eval 'db.stats\(\)' && mongo --port 27061 admin --eval 'db.stats\(\)' && mongo --port 27062 admin --eval 'db.stats\(\)'; do echo 'waiting for mongo rs1'; sleep 1; done
mongo --port 27060 admin <<EOT
rs.initiate({_id: 'rs1', version: 1, members: [
{_id: 0, host: '$hostip:27060'},
{_id: 1, host: '$hostip:27061'},
{_id: 2, host: '$hostip:27062'}]})
while (true) {
    var stat = rs.status();
    if (stat.ok==1 && stat.members && stat.members.length==3 &&
            stat.members[0].state==1 && stat.members[1].state==2 &&
            stat.members[2].state==2) {
        break;
    }
    print('waiting for set to be fully up');
    sleep(1000);
}
rs.status()
EOT


# Record that we provisioned
date > ~/vagrant_provisioned_date
echo Done provisioning.

fi
SCRIPT
  config.vm.provision "shell", inline: $script

end
