6fe2ba99 |
# -*- mode: ruby -*-
# vi: set ft=ruby :
|
cfbb85e2 |
# This Vagrantfile provides a simple default configuration using VirtualBox.
# For any other configuration, create a configuration in .vagrant-openshift.json
# using the vagrant-openshift plugin (https://github.com/openshift/vagrant-openshift)
# as an alternative to editing this file.
# Specific providers may use further configuration from provider-specific files -
# consult the provider definitions below for specifics.
|
6fe2ba99 |
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
|
16aecd47 |
# Require a recent version of vagrant otherwise some have reported errors setting host names on boxes |
ea2188b6 |
Vagrant.require_version ">= 1.7.1" |
69950ed8 |
# @param tgt [Hash] target hash that we will be **altering**
# @param src [Hash] read from this source hash
# @return the modified target hash
# @note this one does not merge Array elements
def hash_deep_merge!(tgt_hash, src_hash)
tgt_hash.merge!(src_hash) { |key, oldval, newval|
if oldval.kind_of?(Hash) && newval.kind_of?(Hash)
hash_deep_merge!(oldval, newval)
else
newval
end
}
end
|
cfbb85e2 |
class VFLoadError < Vagrant::Errors::VagrantError
def error_message; @parserr; end
def initialize(message, *args)
@parserr = message
super(*args)
end
end
OPENSTACK_CRED_FILE = "~/.openstackcred"
OPENSTACK_BOX_URL = "https://github.com/cloudbau/vagrant-openstack-plugin/raw/master/dummy.box"
AWS_CRED_FILE = "~/.awscred"
AWS_BOX_URL = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box" |
54df3379 |
VM_NAME_PREFIX = ENV['OPENSHIFT_VM_NAME_PREFIX'] || "" |
cfbb85e2 |
|
6fe2ba99 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| |
fa936680 |
|
6f838878 |
# These are the default settings, overrides are in .vagrant-openshift.json |
69950ed8 |
vagrant_openshift_config = {
"instance_name" => "origin-dev",
"os" => "fedora", |
a75eb94a |
"dev_cluster" => false, |
b2c2bf8d |
"dind_dev_cluster" => ENV['OPENSHIFT_DIND_DEV_CLUSTER'] || false, |
37bdba89 |
"network_plugin" => ENV['OPENSHIFT_NETWORK_PLUGIN'] || "", |
69950ed8 |
"insert_key" => true,
"num_minions" => ENV['OPENSHIFT_NUM_MINIONS'] || 2,
"rebuild_yum_cache" => false,
"cpus" => ENV['OPENSHIFT_NUM_CPUS'] || 2, |
a77c6a44 |
"memory" => ENV['OPENSHIFT_MEMORY'] || 3586, |
eee81c47 |
"fixup_net_udev" => ENV['OPENSHIFT_FIXUP_NET_UDEV'] || true, |
d8c586e8 |
"skip_build" => ENV['OPENSHIFT_SKIP_BUILD'] || false, |
84346e12 |
"sync_folders_type" => nil, |
6c5cd433 |
"master_ip" => ENV['OPENSHIFT_MASTER_IP'] || "10.245.2.2",
"minion_ip_base" => ENV['OPENSHIFT_MINION_IP_BASE'] || "10.245.2.", |
10be8492 |
"hostmanager_enabled" => false,
"hostmanager_aliases" => [], |
69950ed8 |
"virtualbox" => {
"box_name" => "fedora_inst",
"box_url" => "https://mirror.openshift.com/pub/vagrant/boxes/openshift3/fedora_virtualbox_inst.box"
},
"vmware" => {
"box_name" => "fedora_inst", |
9b1a9e4b |
"box_url" => "http://opscode-vm-bento.s3.amazonaws.com/vagrant/vmware/opscode_fedora-23_chef-provisionerless.box" |
69950ed8 |
},
"libvirt" => {
"box_name" => "fedora_inst",
"box_url" => "https://mirror.openshift.com/pub/vagrant/boxes/openshift3/fedora_libvirt_inst.box"
},
"aws" => { |
a75eb94a |
"_see_also_" => AWS_CRED_FILE,
"box_name" => "aws-dummy-box",
"box_url" => AWS_BOX_URL,
"ami" => "<AMI>",
"ami_region" => "<AMI_REGION>",
"ssh_user" => "<SSH_USER>" |
69950ed8 |
},
"openstack" => {
'_see_also_' => OPENSTACK_CRED_FILE,
'box_name' => "openstack-dummy-box",
'box_url' => OPENSTACK_BOX_URL,
'image' => "Fedora", |
faef15d8 |
'ssh_user' => "root" |
69950ed8 |
},
}
|
6f838878 |
# Attempt to read config in this repo's .vagrant-openshift.json if present |
7bedcca1 |
if File.exist?('.vagrant-openshift.json')
json = File.read('.vagrant-openshift.json') |
cfbb85e2 |
begin |
69950ed8 |
hash_deep_merge!(vagrant_openshift_config, JSON.parse(json)) |
cfbb85e2 |
rescue JSON::ParserError => e
raise VFLoadError.new "Error parsing .vagrant-openshift.json:\n#{e}"
end |
7bedcca1 |
end
|
b2c2bf8d |
# Determine the OS platform to use |
a75eb94a |
kube_os = vagrant_openshift_config['os'] || "fedora" |
b2c2bf8d |
# OS platform to box information
kube_box = {
"fedora" => {
"name" => "fedora_deps",
"box_url" => "https://mirror.openshift.com/pub/vagrant/boxes/openshift3/fedora_virtualbox_deps.box"
}
}
|
b31933ad |
sync_from = vagrant_openshift_config['sync_from'] || ENV["VAGRANT_SYNC_FROM"] || '.'
sync_to = vagrant_openshift_config['sync_to'] || ENV["VAGRANT_SYNC_TO"] || "/data/src/github.com/openshift/origin"
|
b2c2bf8d |
dind_dev_cluster = vagrant_openshift_config['dind_dev_cluster'] |
a75eb94a |
dev_cluster = vagrant_openshift_config['dev_cluster'] || ENV['OPENSHIFT_DEV_CLUSTER'] |
91f1849f |
single_vm_cluster = ! (dind_dev_cluster or dev_cluster) |
b2c2bf8d |
if dind_dev_cluster
config.vm.define "#{VM_NAME_PREFIX}dind-host" do |config|
config.vm.box = kube_box[kube_os]["name"]
config.vm.box_url = kube_box[kube_os]["box_url"] |
b31933ad |
config.vm.provision "shell", inline: "#{sync_to}/contrib/vagrant/provision-dind.sh"
config.vm.provision "shell", inline: "#{sync_to}/hack/dind-cluster.sh config-host"
config.vm.provision "shell", privileged: false, inline: "#{sync_to}/hack/dind-cluster.sh restart" |
b2c2bf8d |
config.vm.hostname = "openshift-dind-host" |
b31933ad |
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder sync_from, sync_to, type: vagrant_openshift_config['sync_folders_type'] |
b2c2bf8d |
end
elsif dev_cluster |
16aecd47 |
# Start an OpenShift cluster |
cfbb85e2 |
# Currently this only works with the (default) VirtualBox provider.
|
9668f439 |
# Tag configuration as stale when provisioning a dev cluster to
# ensure that nodes can wait for fresh configuration to be generated.
if ARGV[0] =~ /^up|provision$/i and not ARGV.include?("--no-provision")
system('test -d ./openshift.local.config && touch ./openshift.local.config/.stale')
end
|
63567f85 |
instance_prefix = "openshift"
|
62e93890 |
# The number of minions to provision. |
a75eb94a |
num_minion = (vagrant_openshift_config['num_minions'] || ENV['OPENSHIFT_NUM_MINIONS'] || 2).to_i |
16aecd47 |
# IP configuration |
6c5cd433 |
master_ip = vagrant_openshift_config['master_ip']
minion_ip_base = vagrant_openshift_config['minion_ip_base'] |
fec26965 |
minion_ips = num_minion.times.collect { |n| minion_ip_base + "#{n+3}" } |
16aecd47 |
minion_ips_str = minion_ips.join(",")
|
d331b4c5 |
fixup_net_udev = ''
if vagrant_openshift_config['fixup_net_udev']
fixup_net_udev = '-f'
end
network_plugin = vagrant_openshift_config['network_plugin'] |
a3fdfbee |
if network_plugin != ''
network_plugin = "-n #{network_plugin}"
end |
d8c586e8 |
skip_build = ''
if vagrant_openshift_config['skip_build']
skip_build = '-s'
end |
eee81c47 |
|
16aecd47 |
# OpenShift master |
54df3379 |
config.vm.define "#{VM_NAME_PREFIX}master" do |config| |
16aecd47 |
config.vm.box = kube_box[kube_os]["name"]
config.vm.box_url = kube_box[kube_os]["box_url"] |
b31933ad |
config.vm.provision "shell", inline: "/bin/bash -x #{sync_to}/contrib/vagrant/provision-master.sh #{master_ip} #{num_minion} #{minion_ips_str} #{instance_prefix} #{network_plugin} #{fixup_net_udev} #{skip_build}" |
16aecd47 |
config.vm.network "private_network", ip: "#{master_ip}"
config.vm.hostname = "openshift-master" |
b31933ad |
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder sync_from, sync_to, type: vagrant_openshift_config['sync_folders_type'] |
16aecd47 |
end
# OpenShift minion
num_minion.times do |n| |
54df3379 |
config.vm.define "#{VM_NAME_PREFIX}minion-#{n+1}" do |minion| |
16aecd47 |
minion_index = n+1
minion_ip = minion_ips[n]
minion.vm.box = kube_box[kube_os]["name"]
minion.vm.box_url = kube_box[kube_os]["box_url"] |
b31933ad |
minion.vm.provision "shell", inline: "/bin/bash -x #{sync_to}/contrib/vagrant/provision-node.sh #{master_ip} #{num_minion} #{minion_ips_str} #{instance_prefix} -i #{minion_index} #{network_plugin} #{fixup_net_udev} #{skip_build}" |
16aecd47 |
minion.vm.network "private_network", ip: "#{minion_ip}"
minion.vm.hostname = "openshift-minion-#{minion_index}" |
b31933ad |
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder sync_from, sync_to, type: vagrant_openshift_config['sync_folders_type'] |
16aecd47 |
end
end |
cfbb85e2 |
else # Single VM dev environment
########################## |
6f838878 |
# Define settings for the single VM being created. |
54df3379 |
config.vm.define "#{VM_NAME_PREFIX}openshiftdev", primary: true do |config| |
cfbb85e2 |
if vagrant_openshift_config['rebuild_yum_cache']
config.vm.provision "shell", inline: "yum clean all && yum makecache"
end |
ea2188b6 |
config.vm.provision "setup", type: "shell", path: "contrib/vagrant/provision-minimal.sh" |
47ff3d70 |
|
cfbb85e2 |
config.vm.synced_folder ".", "/vagrant", disabled: true |
d8db9f0b |
unless vagrant_openshift_config['no_synced_folders'] |
30de27a2 |
if folders = vagrant_openshift_config["sync_folders"]
(folders || {}).each do |src, dest|
config.vm.synced_folder src, dest["to"],
rsync__args: %w(--verbose --archive --delete),
rsync__exclude: dest["exclude"],
type: vagrant_openshift_config['sync_folders_type'],
nfs_udp: false # has issues when using NFS from within a docker container
end
else
config.vm.synced_folder sync_from, sync_to,
rsync__args: %w(--verbose --archive --delete),
rsync__exclude: vagrant_openshift_config["sync_folders_rsync_exclude"],
type: vagrant_openshift_config['sync_folders_type'],
nfs_udp: false # has issues when using NFS from within a docker container
end |
47ff3d70 |
end
|
84346e12 |
if vagrant_openshift_config['private_network_ip']
config.vm.network "private_network", ip: vagrant_openshift_config['private_network_ip']
else
config.vm.network "forwarded_port", guest: 80, host: 1080
config.vm.network "forwarded_port", guest: 443, host: 1443
config.vm.network "forwarded_port", guest: 8080, host: 8080
config.vm.network "forwarded_port", guest: 8443, host: 8443
end |
10be8492 |
if Vagrant.has_plugin?('vagrant-hostmanager')
config.hostmanager.aliases = vagrant_openshift_config['hostmanager_aliases']
end
end
if Vagrant.has_plugin?('vagrant-hostmanager')
config.hostmanager.enabled = vagrant_openshift_config['hostmanager_enabled']
config.hostmanager.manage_host = true |
cfbb85e2 |
end
end # vm definition(s)
# #########################################
# provider-specific settings defined below:
# ################################ |
16aecd47 |
# Set VirtualBox provider settings
config.vm.provider "virtualbox" do |v, override| |
5dd883ac |
override.vm.box = vagrant_openshift_config['virtualbox']['box_name'] unless dev_cluster
override.vm.box_url = vagrant_openshift_config['virtualbox']['box_url'] unless dev_cluster |
b6fa6eb3 |
override.ssh.insert_key = vagrant_openshift_config['insert_key'] |
88c99530 |
|
f6543be2 |
v.memory = vagrant_openshift_config['memory'].to_i
v.cpus = vagrant_openshift_config['cpus'].to_i
v.customize ["modifyvm", :id, "--cpus", vagrant_openshift_config['cpus'].to_s] |
9911d615 |
# to make the ha-proxy reachable from the host, you need to add a port forwarding rule from 1080 to 80, which
# requires root privilege. Use iptables on linux based or ipfw on BSD based OS: |
fec26965 |
# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 1080 |
9911d615 |
# sudo ipfw add 100 fwd 127.0.0.1,1080 tcp from any to any 80 in |
af0d0ee4 |
end if vagrant_openshift_config['virtualbox'] |
6fe2ba99 |
|
cfbb85e2 |
# ################################
# Set libvirt provider settings |
88c99530 |
config.vm.provider "libvirt" do |libvirt, override|
override.vm.box = vagrant_openshift_config['libvirt']['box_name']
override.vm.box_url = vagrant_openshift_config['libvirt']['box_url'] |
b6fa6eb3 |
override.ssh.insert_key = vagrant_openshift_config['insert_key'] |
b970e300 |
if ! single_vm_cluster |
c7830337 |
# Work around https://github.com/pradels/vagrant-libvirt/issues/419 |
b31933ad |
override.vm.synced_folder sync_from, sync_to, type: 'nfs' |
c7830337 |
end |
88c99530 |
libvirt.driver = 'kvm' |
f6543be2 |
libvirt.memory = vagrant_openshift_config['memory'].to_i
libvirt.cpus = vagrant_openshift_config['cpus'].to_i |
7379866e |
# run on libvirt somewhere other than default: |
c8afab27 |
libvirt.uri = ENV["VAGRANT_LIBVIRT_URI"] if ENV["VAGRANT_LIBVIRT_URI"] |
af0d0ee4 |
end if vagrant_openshift_config['libvirt'] |
88c99530 |
|
cfbb85e2 |
# ################################### |
16aecd47 |
# Set VMware Fusion provider settings
config.vm.provider "vmware_fusion" do |v, override| |
88c99530 |
override.vm.box = vagrant_openshift_config['vmware']['box_name'] |
7bedcca1 |
override.vm.box_url = vagrant_openshift_config['vmware']['box_url'] |
b6fa6eb3 |
override.ssh.insert_key = vagrant_openshift_config['insert_key'] |
88c99530 |
v.vmx["memsize"] = vagrant_openshift_config['memory'].to_s
v.vmx["numvcpus"] = vagrant_openshift_config['cpus'].to_s
v.gui = false |
91f1849f |
if single_vm_cluster
override.vm.provision "setup", type: "shell", path: "contrib/vagrant/provision-full.sh"
end |
af0d0ee4 |
end if vagrant_openshift_config['vmware'] |
6fe2ba99 |
|
cfbb85e2 |
# ###############################
# Set OpenStack provider settings
config.vm.provider "openstack" do |os, override|
# load creds file, which you should really have
creds_file_path = [nil, ''].include?(ENV['OPENSTACK_CREDS']) ? OPENSTACK_CRED_FILE : ENV['OPENSTACK_CREDS']
# read in all the lines that look like FOO=BAR as a hash
creds = File.exist?(creds_file_path = File.expand_path(creds_file_path)) ?
Hash[*(File.open(creds_file_path).readlines.map{ |l| l.strip!; l.split('=') }.flatten)] : {}
voc = vagrant_openshift_config['openstack']
|
a75eb94a |
override.vm.box = voc["box_name"] || "openstack-dummy-box"
override.vm.box_url = voc["box_url"] || OPENSTACK_BOX_URL |
cfbb85e2 |
# Make sure the private key from the key pair is provided
override.ssh.private_key_path = creds['OSPrivateKeyPath'] || "~/.ssh/id_rsa"
os.endpoint = ENV['OS_AUTH_URL'] ? "#{ENV['OS_AUTH_URL']}/tokens" : creds['OSEndpoint']
os.tenant = ENV['OS_TENANT_NAME'] || creds['OSTenant']
os.username = ENV['OS_USERNAME'] || creds['OSUsername']
os.api_key = ENV['OS_PASSWORD'] || creds['OSAPIKey']
os.keypair_name = voc['key_pair'] || creds['OSKeyPairName'] || "<OSKeypair>" # as stored in Nova |
faef15d8 |
os.flavor = vagrant_openshift_config['instance_type'] || creds['OSFlavor'] || /m1.small/ # Regex or String |
cfbb85e2 |
os.image = voc['image'] || creds['OSImage'] || /Fedora/ # Regex or String
os.ssh_username = user = voc['ssh_user']|| creds['OSSshUser'] || "root" # login for the VM instance
os.server_name = ENV['OS_HOSTNAME'] || vagrant_openshift_config['instance_name'] # name for the instance created |
91f1849f |
if single_vm_cluster
override.vm.provision "setup", type: "shell", path: "contrib/vagrant/provision-full.sh", args: user
end |
f07b4a8d |
|
6f838878 |
# Floating ip usually needed for accessing machines |
f07b4a8d |
floating_ip = creds['OSFloatingIP'] || ENV['OS_FLOATING_IP']
os.floating_ip = floating_ip == ":auto" ? :auto : floating_ip
floating_ip_pool = creds['OSFloatingIPPool'] || ENV['OS_FLOATING_IP_POOL']
os.floating_ip_pool = floating_ip_pool == "false" ? false : floating_ip_pool |
cfbb85e2 |
end if vagrant_openshift_config['openstack']
# ######################### |
7bedcca1 |
# Set AWS provider settings |
84346e12 |
config.vm.provider "aws" do |aws, override| |
cfbb85e2 |
creds_file_path = ENV['AWS_CREDS'].nil? || ENV['AWS_CREDS'] == '' ? AWS_CRED_FILE : ENV['AWS_CREDS'] |
9482a0b5 |
if File.exist?(File.expand_path(creds_file_path))
aws_creds_file = Pathname.new(File.expand_path(creds_file_path)) |
fa4579e3 |
aws_creds = aws_creds_file.exist? ? Hash[*(File.open(aws_creds_file.to_s).readlines.map{ |l| l.strip!
l.split('=') }.flatten)] : {} |
7bedcca1 |
|
cfbb85e2 |
voc = vagrant_openshift_config['aws'] |
a75eb94a |
override.vm.box = voc['box_name'] || "aws-dummy-box"
override.vm.box_url = voc['box_url'] || AWS_BOX_URL |
cfbb85e2 |
override.vm.synced_folder sync_from, sync_to, disabled: true # rsyncing to public cloud not a great experience, use git |
7bedcca1 |
override.ssh.username = vagrant_openshift_config['aws']['ssh_user']
override.ssh.private_key_path = aws_creds["AWSPrivateKeyPath"] || "PATH TO AWS KEYPAIR PRIVATE KEY" |
b6fa6eb3 |
override.ssh.insert_key = true |
7bedcca1 |
aws.access_key_id = aws_creds["AWSAccessKeyId"] || "AWS ACCESS KEY"
aws.secret_access_key = aws_creds["AWSSecretKey"] || "AWS SECRET KEY"
aws.keypair_name = aws_creds["AWSKeyPairName"] || "AWS KEYPAIR NAME" |
cfbb85e2 |
aws.ami = voc['ami']
aws.region = voc['ami_region'] |
eebdecdc |
aws.subnet_id = ENV['AWS_SUBNET_ID'] || vagrant_openshift_config['aws']['subnet_id'] || "subnet-cf57c596" |
5229dfcb |
aws.instance_type = ENV['AWS_INSTANCE_TYPE'] || vagrant_openshift_config['instance_type'] || "t2.large" |
7bedcca1 |
aws.instance_ready_timeout = 240 |
cfbb85e2 |
aws.tags = { "Name" => ENV['AWS_HOSTNAME'] || vagrant_openshift_config['instance_name'] } |
7bedcca1 |
aws.user_data = %{ |
6f838878 |
# cloud-config |
7bedcca1 |
growpart:
mode: auto
devices: ['/']
runcmd: |
ff389dc0 |
- [ sh, -xc, "sed -i s/^Defaults.*requiretty/\#Defaults\ requiretty/g /etc/sudoers"] |
7bedcca1 |
}
aws.block_device_mapping = [
{
"DeviceName" => "/dev/sda1", |
7a00c508 |
"Ebs.VolumeSize" => vagrant_openshift_config['volume_size'] || 25, |
98f44ebe |
"Ebs.VolumeType" => "gp2" |
a27d9ef5 |
},
{
"DeviceName" => "/dev/sdb", |
41dc4849 |
"Ebs.VolumeSize" => vagrant_openshift_config['docker_volume_size'] || 25, |
a27d9ef5 |
"Ebs.VolumeType" => "gp2" |
7bedcca1 |
}
] |
5c6fcb42 |
end |
cfbb85e2 |
end if vagrant_openshift_config['aws'] |
6fe2ba99 |
end |