Vagrantfile
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