4575b7b2f7
Change-Id: I828751cb631930099770c301b0ec2df802fcbf52 Signed-off-by: Bogdan Dobrelya <bdobrelia@mirantis.com>
161 lines
6.0 KiB
Ruby
161 lines
6.0 KiB
Ruby
# -*- mode: ruby -*-
|
|
# vi: set ft=ruby :
|
|
# Copyright 2015 Mirantis, Inc.
|
|
#
|
|
# Licensed 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.
|
|
|
|
Vagrant.require_version ">= 1.7.4"
|
|
|
|
require 'etc'
|
|
require 'log4r'
|
|
require 'yaml'
|
|
|
|
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
|
VAGRANTFILE_API_VERSION = "2"
|
|
ENV['VAGRANT_DEFAULT_PROVIDER'] = "docker"
|
|
HOME=Etc.getpwuid.dir
|
|
# Solar examples specific key paths mappings
|
|
INSECURE_KEY="#{HOME}/.vagrant.d/insecure_private_key"
|
|
KEY_PATH1="/vagrant/tmp/keys/ssh_private"
|
|
def get_machine_key (index = '')
|
|
"/vagrant/.vagrant/machines/solar-dev#{index}/virtualbox/private_key"
|
|
end
|
|
|
|
# configs, custom updates _defaults
|
|
@logger = Log4r::Logger.new("vagrant::docker::driver")
|
|
defaults_cfg = YAML.load_file('vagrant-settings.yaml_defaults')
|
|
if File.exist?('vagrant-settings.yaml')
|
|
custom_cfg = YAML.load_file('vagrant-settings.yaml')
|
|
cfg = defaults_cfg.merge(custom_cfg)
|
|
else
|
|
cfg = defaults_cfg
|
|
end
|
|
|
|
SLAVES_COUNT = cfg["slaves_count"]
|
|
SLAVES_IPS = cfg["slaves_ips"]
|
|
MASTER_IPS = cfg["master_ips"]
|
|
DOCKER_MASTER_IMAGE=cfg['docker_master_image']
|
|
DOCKER_SLAVES_IMAGE=cfg['docker_slaves_image']
|
|
DOCKER_CMD=cfg['docker_cmd']
|
|
SOLAR_DB_BACKEND = cfg.fetch('solar_db_backend', 'riak')
|
|
|
|
def ansible_playbook_command(filename, args=[])
|
|
ansible_script_crafted = "ansible-playbook -v -i \"localhost,\" -c local /vagrant/bootstrap/playbooks/#{filename} #{args.join ' '}"
|
|
@logger.info("Crafted ansible-script: #{ansible_script_crafted})")
|
|
ansible_script_crafted
|
|
end
|
|
|
|
def shell_script(filename, env=[], args=[])
|
|
shell_script_crafted = "/bin/bash -c \"#{env.join ' '} #{filename} #{args.join ' '} 2>/dev/null\""
|
|
@logger.info("Crafted shell-script: #{shell_script_crafted})")
|
|
shell_script_crafted
|
|
end
|
|
|
|
# FIXME(bogdando) w/a unimplemented docker-exec
|
|
# see https://github.com/mitchellh/vagrant/issues/4179
|
|
# Use docker exec instead of the SSH provisioners
|
|
def docker_exec (name, script)
|
|
@logger.info("Executing docker-exec at #{name}: #{script}")
|
|
system "docker exec -it #{name} #{script}"
|
|
end
|
|
|
|
solar_script = ansible_playbook_command("solar.yaml")
|
|
solar_agent_script = ansible_playbook_command("solar-agent.yaml")
|
|
solar_exec = shell_script("#{solar_script}", ["SOLAR_DB_BACKEND=#{SOLAR_DB_BACKEND}"])
|
|
# NOTE(bogdando) w/a for a centos7 issue
|
|
fix_six = shell_script("/vagrant/bootstrap/playbooks/fix_centos7_six.sh")
|
|
|
|
# TODO(bogdando) use https://github.com/jpetazzo/pipework for multi net.
|
|
# Hereafter, we will use only the 1st IP address and a single interface.
|
|
# Define the solar net with the given gateway, ip-range, subnet.
|
|
docker_pre = shell_script("bootstrap/playbooks/docker_pre.sh", [],
|
|
[ "#{SLAVES_IPS[0]}1", "#{SLAVES_IPS[0]}0/24", "#{SLAVES_IPS[0]}0/24" ])
|
|
# Destroy the solar net and do additional teardown steps
|
|
docker_post = shell_script("bootstrap/playbooks/docker_post.sh")
|
|
|
|
# Prepare docker volumes and workaround missing machines' ssh_keys
|
|
# and virtualbox hardcoded paths in Solar
|
|
key=get_machine_key
|
|
docker_volumes = ["-v", "#{INSECURE_KEY}:#{KEY_PATH1}:ro"]
|
|
docker_volumes << ["-v", "#{INSECURE_KEY}:#{key}:ro",
|
|
"-v", "/var/tmp/vagrant:/var/tmp/vagrant",
|
|
"-v", "/sys/fs/cgroup:/sys/fs/cgroup",
|
|
"-v", "/var/run/docker.sock:/var/run/docker.sock" ]
|
|
SLAVES_COUNT.times do |i|
|
|
index = i + 1
|
|
key = get_machine_key index.to_s
|
|
docker_volumes << ["-v", "#{INSECURE_KEY}:#{key}:ro"]
|
|
end
|
|
docker_volumes.flatten!
|
|
@logger.info("Crafted docker volumes: #{docker_volumes}")
|
|
|
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
config.trigger.before :up do
|
|
@logger.info("Executing docker network create steps")
|
|
system "#{docker_pre}"
|
|
end
|
|
config.trigger.after :destroy do
|
|
@logger.info("Executing docker teardown steps")
|
|
system "#{docker_post}"
|
|
end
|
|
|
|
config.vm.provider :docker do |d, override|
|
|
d.image = DOCKER_MASTER_IMAGE
|
|
d.remains_running = false
|
|
d.has_ssh = false
|
|
d.cmd = DOCKER_CMD.split(' ')
|
|
end
|
|
|
|
# disable nfs, we use volume mounts instead
|
|
config.nfs.functional = false
|
|
config.vm.synced_folder ".", "/vagrant", :nfs => false
|
|
|
|
# Configure the solar-dev node
|
|
config.vm.define "solar-dev", primary: true do |config|
|
|
config.vm.host_name = "solar-dev"
|
|
config.vm.provider :docker do |d, override|
|
|
d.name = "solar-dev"
|
|
d.create_args = ["-i", "-t", "--privileged", "--ip=#{MASTER_IPS[0]}", "--net=solar",
|
|
docker_volumes].flatten
|
|
end
|
|
# NOTE(bogdando) ssh provisioners are not wellcome here
|
|
config.trigger.after :up, :option => { :vm => 'solar-dev'} do
|
|
docker_exec("solar-dev","/usr/sbin/rsyslogd >/dev/null 2>&1")
|
|
docker_exec("solar-dev","/usr/sbin/sshd >/dev/null 2>&1")
|
|
docker_exec("solar-dev","#{fix_six} >/dev/null 2>&1")
|
|
docker_exec("solar-dev","#{solar_exec}")
|
|
end
|
|
end
|
|
|
|
# Configure the rest of the solar nodes
|
|
SLAVES_COUNT.times do |i|
|
|
index = i + 1
|
|
ip_index = i + 3
|
|
config.vm.define "solar-dev#{index}" do |config|
|
|
config.vm.host_name = "solar-dev#{index}"
|
|
config.vm.provider :docker do |d, override|
|
|
d.name = "solar-dev#{index}"
|
|
d.image = DOCKER_SLAVES_IMAGE
|
|
d.create_args = ["-i", "-t", "--privileged", "--ip=#{SLAVES_IPS[0]}#{ip_index}", "--net=solar",
|
|
docker_volumes].flatten
|
|
end
|
|
config.trigger.after :up, :option => { :vm => "solar-dev#{index}" } do
|
|
docker_exec("solar-dev#{index}","/usr/sbin/rsyslogd >/dev/null 2>&1")
|
|
docker_exec("solar-dev#{index}","/usr/sbin/sshd >/dev/null 2>&1")
|
|
docker_exec("solar-dev#{index}","#{fix_six} >/dev/null 2>&1")
|
|
docker_exec("solar-dev#{index}","#{solar_agent_script}")
|
|
end
|
|
end
|
|
end
|
|
end
|