Merge pull request #2347 from dougm/esxi-guest
guests/esxi: Add support for VMware ESXi guests
This commit is contained in:
commit
4f8b751c4c
|
@ -0,0 +1,13 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
module Cap
|
||||||
|
class ChangeHostName
|
||||||
|
def self.change_host_name(machine, name)
|
||||||
|
if !machine.communicate.test("localcli system hostname get | grep '#{name}'")
|
||||||
|
machine.communicate.execute("localcli system hostname set -H '#{name}'")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,38 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
module Cap
|
||||||
|
class ConfigureNetworks
|
||||||
|
def self.configure_networks(machine, networks)
|
||||||
|
networks.each do |network|
|
||||||
|
ix = network[:interface]
|
||||||
|
switch = "vSwitch#{ix}"
|
||||||
|
pg = "VagrantNetwork#{ix}"
|
||||||
|
vmnic = "vmnic#{ix}"
|
||||||
|
device = "vmk#{ix}"
|
||||||
|
|
||||||
|
if machine.communicate.test("localcli network ip interface ipv4 get -i #{device}")
|
||||||
|
machine.communicate.execute("localcli network ip interface remove -i #{device}")
|
||||||
|
end
|
||||||
|
|
||||||
|
if machine.communicate.test("localcli network vswitch standard list -v #{switch}")
|
||||||
|
machine.communicate.execute("localcli network vswitch standard remove -v #{switch}")
|
||||||
|
end
|
||||||
|
|
||||||
|
machine.communicate.execute("localcli network vswitch standard add -v #{switch}")
|
||||||
|
machine.communicate.execute("localcli network vswitch standard uplink add -v #{switch} -u #{vmnic}")
|
||||||
|
machine.communicate.execute("localcli network vswitch standard portgroup add -v #{switch} -p #{pg}")
|
||||||
|
machine.communicate.execute("localcli network ip interface add -i #{device} -p #{pg}")
|
||||||
|
|
||||||
|
ifconfig = "localcli network ip interface ipv4 set -i #{device}"
|
||||||
|
|
||||||
|
if network[:type].to_sym == :static
|
||||||
|
machine.communicate.execute("#{ifconfig} -t static --ipv4 #{network[:ip]} --netmask #{network[:netmask]}")
|
||||||
|
elsif network[:type].to_sym == :dhcp
|
||||||
|
machine.communicate.execute("#{ifconfig} -t dhcp")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,16 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
module Cap
|
||||||
|
class Halt
|
||||||
|
def self.halt(machine)
|
||||||
|
begin
|
||||||
|
machine.communicate.execute("/bin/halt -d 0")
|
||||||
|
rescue IOError
|
||||||
|
# Ignore, this probably means connection closed because it
|
||||||
|
# shut down.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,40 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
module Cap
|
||||||
|
class MountNFSFolder
|
||||||
|
extend Vagrant::Util::Retryable
|
||||||
|
|
||||||
|
def self.mount_nfs_folder(machine, ip, folders)
|
||||||
|
folders.each do |name, opts|
|
||||||
|
guestpath = opts[:guestpath]
|
||||||
|
volume = guestpath.gsub("/", "_")
|
||||||
|
machine.communicate.tap do |comm|
|
||||||
|
if comm.test("localcli storage nfs list | grep '^#{volume}'")
|
||||||
|
comm.execute("localcli storage nfs remove -v #{volume}")
|
||||||
|
end
|
||||||
|
mount_command = "localcli storage nfs add -H #{ip} -s '#{opts[:hostpath]}' -v '#{volume}'"
|
||||||
|
retryable(:on => Vagrant::Errors::LinuxNFSMountFailed, :tries => 5, :sleep => 2) do
|
||||||
|
comm.execute(mount_command,
|
||||||
|
:error_class => Vagrant::Errors::LinuxNFSMountFailed)
|
||||||
|
end
|
||||||
|
|
||||||
|
# symlink vmfs volume to :guestpath
|
||||||
|
if comm.test("test -L '#{guestpath}'")
|
||||||
|
comm.execute("rm '#{guestpath}'")
|
||||||
|
end
|
||||||
|
if comm.test("test -d '#{guestpath}'")
|
||||||
|
comm.execute("rmdir '#{guestpath}'")
|
||||||
|
end
|
||||||
|
dir = File.dirname(guestpath)
|
||||||
|
if !comm.test("test -d '#{dir}'")
|
||||||
|
comm.execute("mkdir -p '#{dir}'")
|
||||||
|
end
|
||||||
|
|
||||||
|
comm.execute("ln -s '/vmfs/volumes/#{volume}' '#{guestpath}'")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
require "vagrant"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
class Guest < Vagrant.plugin("2", :guest)
|
||||||
|
def detect?(machine)
|
||||||
|
machine.communicate.test("uname -s | grep VMkernel")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,35 @@
|
||||||
|
require "vagrant"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module GuestEsxi
|
||||||
|
class Plugin < Vagrant.plugin("2")
|
||||||
|
name "ESXi guest."
|
||||||
|
description "ESXi guest support."
|
||||||
|
|
||||||
|
guest("esxi") do
|
||||||
|
require File.expand_path("../guest", __FILE__)
|
||||||
|
Guest
|
||||||
|
end
|
||||||
|
|
||||||
|
guest_capability("esxi", "change_host_name") do
|
||||||
|
require_relative "cap/change_host_name"
|
||||||
|
Cap::ChangeHostName
|
||||||
|
end
|
||||||
|
|
||||||
|
guest_capability("esxi", "configure_networks") do
|
||||||
|
require_relative "cap/configure_networks"
|
||||||
|
Cap::ConfigureNetworks
|
||||||
|
end
|
||||||
|
|
||||||
|
guest_capability("esxi", "mount_nfs_folder") do
|
||||||
|
require_relative "cap/mount_nfs_folder"
|
||||||
|
Cap::MountNFSFolder
|
||||||
|
end
|
||||||
|
|
||||||
|
guest_capability("esxi", "halt") do
|
||||||
|
require_relative "cap/halt"
|
||||||
|
Cap::Halt
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue