Merge pull request #9034 from briancain/unify-solaris-guests
Unify Solaris Guests
This commit is contained in:
commit
47edb88fe4
|
@ -11,8 +11,6 @@ module VagrantPlugins
|
|||
|
||||
# Only do this if the hostname is not already set
|
||||
if !machine.communicate.test("/usr/sbin/svccfg -s system/identity:node listprop config/nodename | /usr/bin/grep '#{name}'")
|
||||
#machine.communicate.execute("#{su_cmd} sh -c \"echo '#{name}' > /etc/nodename\"")
|
||||
#machine.communicate.execute("#{su_cmd} uname -S #{name}")
|
||||
machine.communicate.execute("#{su_cmd} /usr/sbin/svccfg -s system/identity:node setprop config/nodename=\"#{name}\"")
|
||||
machine.communicate.execute("#{su_cmd} /usr/sbin/svccfg -s system/identity:node setprop config/loopback=\"#{name}\"")
|
||||
machine.communicate.execute("#{su_cmd} /usr/sbin/svccfg -s system/identity:node refresh ")
|
||||
|
|
|
@ -12,19 +12,13 @@ module VagrantPlugins
|
|||
su_cmd = machine.config.solaris11.suexec_cmd
|
||||
mask = "#{network[:netmask]}"
|
||||
cidr = mask.split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").to_s
|
||||
#ifconfig_cmd = "#{su_cmd} /sbin/ifconfig #{device}"
|
||||
#machine.communicate.execute("#{ifconfig_cmd} plumb")
|
||||
|
||||
if network[:type].to_sym == :static
|
||||
#machine.communicate.execute("#{ifconfig_cmd} inet #{network[:ip]} netmask #{network[:netmask]}")
|
||||
#machine.communicate.execute("#{ifconfig_cmd} up")
|
||||
#machine.communicate.execute("#{su_cmd} sh -c \"echo '#{network[:ip]}' > /etc/hostname.#{device}\"")
|
||||
# ipadm create-addr -T static -a local=172.16.10.15/24 net2/v4
|
||||
if machine.communicate.test("ipadm | grep #{device}/v4")
|
||||
machine.communicate.execute("#{su_cmd} ipadm delete-addr #{device}/v4")
|
||||
end
|
||||
machine.communicate.execute("#{su_cmd} ipadm create-addr -T static -a #{network[:ip]}/#{cidr} #{device}/v4")
|
||||
elsif network[:type].to_sym == :dhcp
|
||||
#machine.communicate.execute("#{ifconfig_cmd} dhcp start")
|
||||
if machine.communicate.test("ipadm show-if -o all | grep #{device} | tr -s ' ' | cut -d ' ' -f 6 | grep '4\|6'")
|
||||
machine.communicate.execute("#{su_cmd} ipadm create-addr -T addrconf #{device}/v4")
|
||||
end
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
# A general Vagrant system implementation for "solaris 11".
|
||||
#
|
||||
# Contributed by Jan Thomas Moldung <janth@moldung.no>
|
||||
|
||||
module VagrantPlugins
|
||||
module GuestSolaris11
|
||||
module Cap
|
||||
class Halt
|
||||
def self.halt(machine)
|
||||
# There should be an exception raised if the line
|
||||
#
|
||||
# vagrant::::profiles=Primary Administrator
|
||||
#
|
||||
# does not exist in /etc/user_attr. TODO
|
||||
begin
|
||||
machine.communicate.execute(
|
||||
"#{machine.config.solaris11.suexec_cmd} /usr/sbin/shutdown -y -i5 -g0")
|
||||
rescue IOError, Vagrant::Errors::SSHDisconnected
|
||||
# Ignore, this probably means connection closed because it
|
||||
# shut down.
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,21 +0,0 @@
|
|||
require "vagrant/util/shell_quote"
|
||||
|
||||
module VagrantPlugins
|
||||
module GuestSolaris11
|
||||
module Cap
|
||||
class InsertPublicKey
|
||||
def self.insert_public_key(machine, contents)
|
||||
contents = contents.chomp
|
||||
contents = Vagrant::Util::ShellQuote.escape(contents, "'")
|
||||
|
||||
machine.communicate.tap do |comm|
|
||||
comm.execute("mkdir -p ~/.ssh")
|
||||
comm.execute("chmod 0700 ~/.ssh")
|
||||
comm.execute("printf '#{contents}\\n' >> ~/.ssh/authorized_keys")
|
||||
comm.execute("chmod 0600 ~/.ssh/authorized_keys")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,45 +0,0 @@
|
|||
# A general Vagrant system implementation for "solaris 11".
|
||||
#
|
||||
# Contributed by Jan Thomas Moldung <janth@moldung.no>
|
||||
|
||||
module VagrantPlugins
|
||||
module GuestSolaris11
|
||||
module Cap
|
||||
class MountVirtualBoxSharedFolder
|
||||
def self.mount_virtualbox_shared_folder(machine, name, guestpath, options)
|
||||
# These are just far easier to use than the full options syntax
|
||||
owner = options[:owner]
|
||||
group = options[:group]
|
||||
|
||||
# Create the shared folder
|
||||
machine.communicate.execute("#{machine.config.solaris11.suexec_cmd} mkdir -p #{guestpath}")
|
||||
|
||||
if owner.is_a? Integer
|
||||
mount_uid = owner
|
||||
else
|
||||
# We have to use this `id` command instead of `/usr/bin/id` since this
|
||||
# one accepts the "-u" and "-g" flags.
|
||||
mount_uid = "`/usr/xpg4/bin/id -u #{owner}`"
|
||||
end
|
||||
|
||||
if group.is_a? Integer
|
||||
mount_gid = group
|
||||
else
|
||||
mount_gid = "`/usr/xpg4/bin/id -g #{group}`"
|
||||
end
|
||||
|
||||
# Mount the folder with the proper owner/group
|
||||
mount_options = "-o uid=#{mount_uid},gid=#{mount_gid}"
|
||||
if options[:mount_options]
|
||||
mount_options += ",#{options[:mount_options].join(",")}"
|
||||
end
|
||||
|
||||
machine.communicate.execute("#{machine.config.solaris11.suexec_cmd} /sbin/mount -F vboxfs #{mount_options} #{name} #{guestpath}")
|
||||
|
||||
# chown the folder to the proper owner/group
|
||||
machine.communicate.execute("#{machine.config.solaris11.suexec_cmd} chown #{mount_uid}:#{mount_gid} #{guestpath}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,21 +0,0 @@
|
|||
require "vagrant/util/shell_quote"
|
||||
|
||||
module VagrantPlugins
|
||||
module GuestSolaris11
|
||||
module Cap
|
||||
class RemovePublicKey
|
||||
def self.remove_public_key(machine, contents)
|
||||
contents = contents.chomp
|
||||
contents = Vagrant::Util::ShellQuote.escape(contents, "'")
|
||||
|
||||
machine.communicate.tap do |comm|
|
||||
if comm.test("test -f ~/.ssh/authorized_keys")
|
||||
comm.execute(
|
||||
"sed -i '/^.*#{contents}.*$/d' ~/.ssh/authorized_keys")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,29 +0,0 @@
|
|||
require_relative "../../../synced_folders/rsync/default_unix_cap"
|
||||
|
||||
module VagrantPlugins
|
||||
module GuestSolaris11
|
||||
module Cap
|
||||
class RSync
|
||||
extend VagrantPlugins::SyncedFolderRSync::DefaultUnixCap
|
||||
|
||||
def self.rsync_command(machine)
|
||||
"#{machine.config.solaris11.suexec_cmd} rsync"
|
||||
end
|
||||
|
||||
def self.rsync_pre(machine, opts)
|
||||
machine.communicate.tap do |comm|
|
||||
comm.sudo("mkdir -p '#{opts[:guestpath]}'")
|
||||
end
|
||||
end
|
||||
|
||||
def self.rsync_post(machine, opts)
|
||||
if opts.key?(:chown) && !opts[:chown]
|
||||
return
|
||||
end
|
||||
suexec_cmd = machine.config.solaris11.suexec_cmd
|
||||
machine.communicate.execute("#{suexec_cmd} #{build_rsync_chown(opts)}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -10,16 +10,16 @@ module VagrantPlugins
|
|||
name "Solaris 11 guest."
|
||||
description "Solaris 11 guest support."
|
||||
|
||||
guest(:solaris11, :solaris) do
|
||||
require_relative "guest"
|
||||
Guest
|
||||
end
|
||||
|
||||
config(:solaris11) do
|
||||
require_relative "config"
|
||||
Config
|
||||
end
|
||||
|
||||
guest(:solaris11) do
|
||||
require_relative "guest"
|
||||
Guest
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :change_host_name) do
|
||||
require_relative "cap/change_host_name"
|
||||
Cap::ChangeHostName
|
||||
|
@ -29,36 +29,6 @@ module VagrantPlugins
|
|||
require_relative "cap/configure_networks"
|
||||
Cap::ConfigureNetworks
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :halt) do
|
||||
require_relative "cap/halt"
|
||||
Cap::Halt
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :mount_virtualbox_shared_folder) do
|
||||
require_relative "cap/mount_virtualbox_shared_folder"
|
||||
Cap::MountVirtualBoxSharedFolder
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :rsync_installed) do
|
||||
require_relative "cap/rsync"
|
||||
Cap::RSync
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :rsync_pre) do
|
||||
require_relative "cap/rsync"
|
||||
Cap::RSync
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :insert_public_key) do
|
||||
require_relative "cap/insert_public_key"
|
||||
Cap::InsertPublicKey
|
||||
end
|
||||
|
||||
guest_capability(:solaris11, :remove_public_key) do
|
||||
require_relative "cap/remove_public_key"
|
||||
Cap::RemovePublicKey
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
require_relative "../../../../base"
|
||||
|
||||
describe "VagrantPlugins::GuestSolaris11::Cap::ChangeHostName" do
|
||||
let(:caps) do
|
||||
VagrantPlugins::GuestSolaris11::Plugin
|
||||
.components
|
||||
.guest_capabilities[:solaris11]
|
||||
end
|
||||
|
||||
let(:machine) { double("machine", config: double("config", solaris11: double("solaris11", suexec_cmd: 'sudo'))) }
|
||||
let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
|
||||
|
||||
before do
|
||||
allow(machine).to receive(:communicate).and_return(comm)
|
||||
end
|
||||
|
||||
after do
|
||||
comm.verify_expectations!
|
||||
end
|
||||
|
||||
describe ".change_host_name" do
|
||||
let(:cap) { caps.get(:change_host_name) }
|
||||
let(:name) { "solaris11.domain.com" }
|
||||
|
||||
it "changes the hostname" do
|
||||
allow(machine.communicate).to receive(:test).and_return(false)
|
||||
allow(machine.communicate).to receive(:execute)
|
||||
|
||||
expect(machine.communicate).to receive(:execute).with("sudo /usr/sbin/svccfg -s system/identity:node setprop config/nodename=\"#{name}\"")
|
||||
expect(machine.communicate).to receive(:execute).with("sudo /usr/sbin/svccfg -s system/identity:node setprop config/loopback=\"#{name}\"")
|
||||
expect(machine.communicate).to receive(:execute).with("sudo /usr/sbin/svccfg -s system/identity:node refresh ")
|
||||
expect(machine.communicate).to receive(:execute).with("sudo /usr/sbin/svcadm restart system/identity:node ")
|
||||
cap.change_host_name(machine, name)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,56 @@
|
|||
require_relative "../../../../base"
|
||||
|
||||
describe "VagrantPlugins::GuestSolaris11::Cap::ConfigureNetworks" do
|
||||
let(:caps) do
|
||||
VagrantPlugins::GuestSolaris11::Plugin
|
||||
.components
|
||||
.guest_capabilities[:solaris11]
|
||||
end
|
||||
|
||||
let(:machine) { double("machine", config: double("config", solaris11: double("solaris11", suexec_cmd: 'sudo', device: 'net'))) }
|
||||
let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
|
||||
|
||||
before do
|
||||
allow(machine).to receive(:communicate).and_return(comm)
|
||||
end
|
||||
|
||||
after do
|
||||
comm.verify_expectations!
|
||||
end
|
||||
|
||||
describe ".configufre_networks" do
|
||||
let(:cap) { caps.get(:configure_networks) }
|
||||
let(:network_1) do
|
||||
{
|
||||
interface: 0,
|
||||
type: "dhcp",
|
||||
}
|
||||
end
|
||||
|
||||
let(:network_2) do
|
||||
{
|
||||
interface: 1,
|
||||
type: "static",
|
||||
ip: "33.33.33.10",
|
||||
netmask: "255.255.0.0",
|
||||
gateway: "33.33.0.1",
|
||||
}
|
||||
end
|
||||
|
||||
let(:networks) { [network_1, network_2] }
|
||||
|
||||
it "configures the guests network if static" do
|
||||
allow(machine.communicate).to receive(:test).and_return(true)
|
||||
|
||||
cap.configure_networks(machine, networks)
|
||||
expect(comm.received_commands[1]).to eq("sudo ipadm delete-addr net1/v4")
|
||||
expect(comm.received_commands[2]).to eq("sudo ipadm create-addr -T static -a 33.33.33.10/16 net1/v4")
|
||||
end
|
||||
|
||||
it "configures the guests network if dhcp" do
|
||||
allow(machine.communicate).to receive(:test).and_return(true)
|
||||
cap.configure_networks(machine, networks)
|
||||
expect(comm.received_commands[0]).to eq("sudo ipadm create-addr -T addrconf net0/v4")
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,44 +0,0 @@
|
|||
require_relative "../../../../base"
|
||||
|
||||
describe "VagrantPlugins::GuestSolaris11::Cap::Halt" do
|
||||
let(:caps) do
|
||||
VagrantPlugins::GuestSolaris11::Plugin
|
||||
.components
|
||||
.guest_capabilities[:solaris11]
|
||||
end
|
||||
|
||||
let(:shutdown_command){ "sudo /usr/sbin/shutdown -y -i5 -g0" }
|
||||
let(:machine) { double("machine", config: double("config", solaris11: double("solaris11", suexec_cmd: 'sudo'))) }
|
||||
let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
|
||||
|
||||
before do
|
||||
allow(machine).to receive(:communicate).and_return(comm)
|
||||
end
|
||||
|
||||
after do
|
||||
comm.verify_expectations!
|
||||
end
|
||||
|
||||
describe ".halt" do
|
||||
let(:cap) { caps.get(:halt) }
|
||||
|
||||
it "runs the shutdown command" do
|
||||
comm.expect_command(shutdown_command)
|
||||
cap.halt(machine)
|
||||
end
|
||||
|
||||
it "ignores an IOError" do
|
||||
comm.stub_command(shutdown_command, raise: IOError)
|
||||
expect {
|
||||
cap.halt(machine)
|
||||
}.to_not raise_error
|
||||
end
|
||||
|
||||
it "ignores a Vagrant::Errors::SSHDisconnected" do
|
||||
comm.stub_command(shutdown_command, raise: Vagrant::Errors::SSHDisconnected)
|
||||
expect {
|
||||
cap.halt(machine)
|
||||
}.to_not raise_error
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue