# -*- mode: ruby -*-
# vi: set ft=ruby :

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require "yaml"

_config = YAML.load(File.open(File.join(File.dirname(__FILE__), "vagrantconfig.yaml"), File::RDONLY).read)
CONF = _config

# Override vagrant configurations using environment variables
keys = CONF.keys
keys.each do |k|
  if ENV[k.upcase] != nil then
    puts "Overide from environment variable: " + k.upcase + " = " + ENV[k.upcase]
    if /^\d+/.match(ENV[k.upcase])
      CONF[k] = Integer(ENV[k.upcase])
    else
      CONF[k] = ENV[k.upcase]
    end
  end
end

# Repository
# Example for testing a Release candidate.
repo = CONF['repo']
# repo = "http://bigtop.s3.amazonaws.com/releases/0.7.0/redhat/6/x86_64"

# Which Linux Distribution to use. Right now only centos is tested
distro = CONF['distro']

# number of instances
num_instances = CONF['num_instances']

# hadoop ecosystem components
components = CONF['components']

# Whether to run smoke tests
run_smoke_tests = CONF['run_smoke_tests']

# Smoke test Components to run
smoke_test_components = CONF['smoke_test_components'].join(',')

# This is a update to allow dev packages
# Force success - not worried if this step fails, since we generally only use it for development.
enable_local_repo = CONF['enable_local_repo']
puts "vagrant conf local repo enabled:  #{enable_local_repo}"

# master node hostname
bigtop_master = "bigtop1.vagrant"

$script = <<SCRIPT
service iptables stop
service firewalld stop
chkconfig iptables off
# Remove 127.0.0.1 entry since vagrant's hostname setting will map it to FQDN,
# which miss leads some daemons to bind on 127.0.0.1 instead of public or private IP
sed -i "/127.0.0.1/d" /etc/hosts
echo "Bigtop yum repo = #{repo}"
# Prepare host manipulation files needed in standalone box
cp /bigtop-home/provisioner/vagrant/config_hosts /etc/init.d
cp /bigtop-home/provisioner/vagrant/gen_hosts.sh /usr/bin
chkconfig --add config_hosts
# Prepare puppet configuration file
mkdir -p /etc/puppet/hieradata
cp /bigtop-home/bigtop-deploy/puppet/hiera.yaml /etc/puppet
cp -r /bigtop-home/bigtop-deploy/puppet/hieradata/bigtop/ /etc/puppet/hieradata/
cat > /etc/puppet/hieradata/site.yaml << EOF
bigtop::hadoop_head_node: #{bigtop_master}
hadoop::hadoop_storage_dirs: [/data/1, /data/2]
bigtop::bigtop_repo_uri: #{repo}
hadoop_cluster_node::cluster_components: #{components}
hadoop::common_hdfs::testonly_hdfs_sshkeys: "yes"
EOF
SCRIPT

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # manage /etc/hosts by hostmanager plugin(https://github.com/smdahlen/vagrant-hostmanager)
  # use vagrant-cachier to cache packages at local(https://github.com/fgrehm/vagrant-cachier)
  config.hostmanager.enabled = true

  # use vagrant-cachier to cache packages at local(https://github.com/fgrehm/vagrant-cachier)
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end

  # nodes definition
  (1..num_instances).each do |i|
    config.vm.define "bigtop#{i}" do |bigtop|

      bigtop.vm.box = CONF['box']
      bigtop_hostname="bigtop#{i}"
      bigtop_fqdn="#{bigtop_hostname}.vagrant"
      bigtop_ip="10.10.10.1#{i}"

      bigtop.vm.provider :virtualbox do |vb|
        vb.customize ["modifyvm", :id, "--memory", CONF['memory_size']]
	vb.customize ['modifyvm', :id, '--cpus', CONF['number_cpus']]
      end

      bigtop.vm.network :private_network, ip: bigtop_ip
      bigtop.vm.hostname = bigtop_fqdn

      # two levels up is the bigtop "home" directory.
      # the current directory has puppet recipes which we need for provisioning.
      bigtop.vm.synced_folder "../../", "/bigtop-home"

      # We also add the bigtop-home output/ dir, so that locally built rpms will be available.
      puts "Adding output/ repo ? #{enable_local_repo}"

      # Install puppet
      bigtop.vm.provision :shell do |shell|
        shell.path = "../../bigtop_toolchain/bin/puppetize.sh"
      end

      # carry on w/ installation
      bigtop.vm.provision :shell do |shell|
        shell.path = "../utils/setup-env-" + distro + ".sh"
        shell.args = ["#{enable_local_repo}"]
      end
      bigtop.vm.provision "shell", inline: $script
      # Add the ip to FQDN and hostname mapping in /etc/hosts
      bigtop.hostmanager.aliases = "#{bigtop_fqdn} #{bigtop_hostname}"

      # deploy Apache Hadoop and it's ecosystem
      bigtop.vm.provision :puppet do |puppet|
        puppet.module_path = "../../bigtop-deploy/puppet/modules/"
        puppet.manifests_path =  "../../bigtop-deploy/puppet/manifests/"
        puppet.manifest_file = "."
        puppet.options = "--parser future"
      end

      if run_smoke_tests then
        if i==num_instances then
          puts "creating provisioner directive for running tests"
          bigtop.vm.provision :shell do |shell|
            shell.path = "../utils/smoke-tests.sh"
            shell.args = ["#{smoke_test_components}"]
          end
        else
          puts "Not creating provisioner directive for tests yet... only on vm #{i} of #{num_instances}"
        end
      end

    end
  end

end
