vagrant-veertu 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +5 -0
- data/lib/vagrant-veertu.rb +18 -0
- data/lib/vagrant-veertu/action.rb +330 -0
- data/lib/vagrant-veertu/action/boot.rb +21 -0
- data/lib/vagrant-veertu/action/check_accessible.rb +22 -0
- data/lib/vagrant-veertu/action/check_created.rb +21 -0
- data/lib/vagrant-veertu/action/check_running.rb +21 -0
- data/lib/vagrant-veertu/action/check_veertu.rb +22 -0
- data/lib/vagrant-veertu/action/clear_forwarded_ports.rb +20 -0
- data/lib/vagrant-veertu/action/clear_network_interfaces.rb +31 -0
- data/lib/vagrant-veertu/action/created.rb +20 -0
- data/lib/vagrant-veertu/action/customize.rb +44 -0
- data/lib/vagrant-veertu/action/destroy.rb +19 -0
- data/lib/vagrant-veertu/action/discard_state.rb +20 -0
- data/lib/vagrant-veertu/action/export.rb +41 -0
- data/lib/vagrant-veertu/action/forced_halt.rb +25 -0
- data/lib/vagrant-veertu/action/forward_ports.rb +91 -0
- data/lib/vagrant-veertu/action/import.rb +96 -0
- data/lib/vagrant-veertu/action/is_paused.rb +20 -0
- data/lib/vagrant-veertu/action/is_running.rb +20 -0
- data/lib/vagrant-veertu/action/is_saved.rb +20 -0
- data/lib/vagrant-veertu/action/message_already_running.rb +16 -0
- data/lib/vagrant-veertu/action/message_not_created.rb +16 -0
- data/lib/vagrant-veertu/action/message_not_running.rb +16 -0
- data/lib/vagrant-veertu/action/message_will_not_destroy.rb +17 -0
- data/lib/vagrant-veertu/action/network.rb +556 -0
- data/lib/vagrant-veertu/action/network_fix_ipv6.rb +81 -0
- data/lib/vagrant-veertu/action/package.rb +44 -0
- data/lib/vagrant-veertu/action/package_vagrantfile.rb +33 -0
- data/lib/vagrant-veertu/action/prepare_forwarded_port_collision_params.rb +35 -0
- data/lib/vagrant-veertu/action/prepare_nfs_settings.rb +119 -0
- data/lib/vagrant-veertu/action/prepare_nfs_valid_ids.rb +17 -0
- data/lib/vagrant-veertu/action/resume.rb +21 -0
- data/lib/vagrant-veertu/action/sane_defaults.rb +89 -0
- data/lib/vagrant-veertu/action/set_name.rb +55 -0
- data/lib/vagrant-veertu/action/setup_package_files.rb +51 -0
- data/lib/vagrant-veertu/action/snapshot_delete.rb +32 -0
- data/lib/vagrant-veertu/action/snapshot_restore.rb +28 -0
- data/lib/vagrant-veertu/action/snapshot_save.rb +25 -0
- data/lib/vagrant-veertu/action/suspend.rb +20 -0
- data/lib/vagrant-veertu/cap.rb +23 -0
- data/lib/vagrant-veertu/cap/public_address.rb +15 -0
- data/lib/vagrant-veertu/config.rb +199 -0
- data/lib/vagrant-veertu/driver/base.rb +240 -0
- data/lib/vagrant-veertu/driver/meta.rb +143 -0
- data/lib/vagrant-veertu/driver/version_5_0.rb +284 -0
- data/lib/vagrant-veertu/errors.rb +18 -0
- data/lib/vagrant-veertu/model/forwarded_port.rb +70 -0
- data/lib/vagrant-veertu/plugin.rb +76 -0
- data/lib/vagrant-veertu/provider.rb +121 -0
- data/lib/vagrant-veertu/synced_folder.rb +120 -0
- data/lib/vagrant-veertu/util/compile_forwarded_ports.rb +35 -0
- data/lib/vagrant-veertu/version.rb +5 -0
- data/locales/en.yml +19 -0
- data/vagrant-veertu.gemspec +22 -0
- metadata +130 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVeertu
|
3
|
+
module Errors
|
4
|
+
class VeertuError < Vagrant::Errors::VagrantError
|
5
|
+
error_namespace('vagrant_veertu.errors')
|
6
|
+
end
|
7
|
+
class VeertuUnsupported < VeertuError
|
8
|
+
error_key(:veertumanage_unsupported)
|
9
|
+
end
|
10
|
+
class VeertuManageError < VeertuError
|
11
|
+
error_key(:veertumanage_error)
|
12
|
+
end
|
13
|
+
class VeertuManageNotFoundError < VeertuManageError
|
14
|
+
error_key(:veertumanage_notfound_error)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVeertu
|
3
|
+
module Model
|
4
|
+
# Represents a single forwarded port for VirtualBox. This has various
|
5
|
+
# helpers and defaults for a forwarded port.
|
6
|
+
class ForwardedPort
|
7
|
+
# The NAT adapter on which to attach the forwarded port.
|
8
|
+
#
|
9
|
+
# @return [Integer]
|
10
|
+
attr_reader :adapter
|
11
|
+
|
12
|
+
# If true, this port should be auto-corrected.
|
13
|
+
#
|
14
|
+
# @return [Boolean]
|
15
|
+
attr_reader :auto_correct
|
16
|
+
|
17
|
+
# The unique ID for the forwarded port.
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
attr_reader :id
|
21
|
+
|
22
|
+
# The protocol to forward.
|
23
|
+
#
|
24
|
+
# @return [String]
|
25
|
+
attr_reader :protocol
|
26
|
+
|
27
|
+
# The IP that the forwarded port will connect to on the guest machine.
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
attr_reader :guest_ip
|
31
|
+
|
32
|
+
# The port on the guest to be exposed on the host.
|
33
|
+
#
|
34
|
+
# @return [Integer]
|
35
|
+
attr_reader :guest_port
|
36
|
+
|
37
|
+
# The IP that the forwarded port will bind to on the host machine.
|
38
|
+
#
|
39
|
+
# @return [String]
|
40
|
+
attr_reader :host_ip
|
41
|
+
|
42
|
+
# The port on the host used to access the port on the guest.
|
43
|
+
#
|
44
|
+
# @return [Integer]
|
45
|
+
attr_reader :host_port
|
46
|
+
|
47
|
+
def initialize(id, host_port, guest_port, options)
|
48
|
+
@id = id
|
49
|
+
@guest_port = guest_port
|
50
|
+
@host_port = host_port
|
51
|
+
|
52
|
+
options ||= {}
|
53
|
+
@auto_correct = false
|
54
|
+
@auto_correct = options[:auto_correct] if options.key?(:auto_correct)
|
55
|
+
@adapter = (options[:adapter] || 1).to_i
|
56
|
+
@guest_ip = options[:guest_ip] || nil
|
57
|
+
@host_ip = options[:host_ip] || nil
|
58
|
+
@protocol = options[:protocol] || "tcp"
|
59
|
+
end
|
60
|
+
|
61
|
+
# This corrects the host port and changes it to the given new port.
|
62
|
+
#
|
63
|
+
# @param [Integer] new_port The new port
|
64
|
+
def correct_host_port(new_port)
|
65
|
+
@host_port = new_port
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVeertu
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
6
|
+
name "Veertu provider"
|
7
|
+
description <<-EOF
|
8
|
+
The Veertu provider allows Vagrant to manage and control
|
9
|
+
Veertu-based virtual machines.
|
10
|
+
EOF
|
11
|
+
|
12
|
+
provider(:veertu, priority: 6) do
|
13
|
+
require File.expand_path("../provider", __FILE__)
|
14
|
+
Provider
|
15
|
+
end
|
16
|
+
|
17
|
+
config(:veertu, :provider) do
|
18
|
+
require File.expand_path("../config", __FILE__)
|
19
|
+
Config
|
20
|
+
end
|
21
|
+
|
22
|
+
config(:veertu, :provider) do
|
23
|
+
require File.expand_path("../config", __FILE__)
|
24
|
+
setup_i18n
|
25
|
+
Config
|
26
|
+
end
|
27
|
+
|
28
|
+
synced_folder(:veertu) do
|
29
|
+
require File.expand_path("../synced_folder", __FILE__)
|
30
|
+
SyncedFolder
|
31
|
+
end
|
32
|
+
|
33
|
+
provider_capability(:veertu, :forwarded_ports) do
|
34
|
+
require_relative "cap"
|
35
|
+
Cap
|
36
|
+
end
|
37
|
+
|
38
|
+
provider_capability(:veertu, :nic_mac_addresses) do
|
39
|
+
require_relative "cap"
|
40
|
+
Cap
|
41
|
+
end
|
42
|
+
|
43
|
+
provider_capability(:veertu, :public_address) do
|
44
|
+
require_relative "cap/public_address"
|
45
|
+
Cap::PublicAddress
|
46
|
+
end
|
47
|
+
|
48
|
+
provider_capability(:veertu, :snapshot_list) do
|
49
|
+
require_relative "cap"
|
50
|
+
Cap
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.setup_i18n
|
54
|
+
I18n.load_path << File.expand_path("locales/en.yml", ProviderVeertu.source_root)
|
55
|
+
I18n.reload!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
autoload :Action, File.expand_path("../action", __FILE__)
|
60
|
+
|
61
|
+
# Drop some autoloads in here to optimize the performance of loading
|
62
|
+
# our drivers only when they are needed.
|
63
|
+
module Driver
|
64
|
+
autoload :Meta, File.expand_path("../driver/meta", __FILE__)
|
65
|
+
autoload :Version_5_0, File.expand_path("../driver/version_5_0", __FILE__)
|
66
|
+
end
|
67
|
+
|
68
|
+
module Model
|
69
|
+
autoload :ForwardedPort, File.expand_path("../model/forwarded_port", __FILE__)
|
70
|
+
end
|
71
|
+
|
72
|
+
module Util
|
73
|
+
autoload :CompileForwardedPorts, File.expand_path("../util/compile_forwarded_ports", __FILE__)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVeertu
|
5
|
+
class Provider < Vagrant.plugin("2", :provider)
|
6
|
+
attr_reader :driver
|
7
|
+
|
8
|
+
def self.installed?
|
9
|
+
Driver::Meta.new
|
10
|
+
true
|
11
|
+
rescue Vagrant::Errors::VirtualBoxInvalidVersion
|
12
|
+
return false
|
13
|
+
rescue Vagrant::Errors::VirtualBoxNotDetected
|
14
|
+
return false
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.usable?(raise_error=false)
|
18
|
+
# Instantiate the driver, which will determine the VirtualBox
|
19
|
+
# version and all that, which checks for VirtualBox being present
|
20
|
+
Driver::Meta.new
|
21
|
+
true
|
22
|
+
rescue Vagrant::Errors::VirtualBoxInvalidVersion
|
23
|
+
raise if raise_error
|
24
|
+
return false
|
25
|
+
rescue Vagrant::Errors::VirtualBoxNotDetected
|
26
|
+
raise if raise_error
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(machine)
|
31
|
+
@logger = Log4r::Logger.new("vagrant::provider::veertu")
|
32
|
+
@machine = machine
|
33
|
+
|
34
|
+
# This method will load in our driver, so we call it now to
|
35
|
+
# initialize it.
|
36
|
+
machine_id_changed
|
37
|
+
end
|
38
|
+
|
39
|
+
# @see Vagrant::Plugin::V1::Provider#action
|
40
|
+
def action(name)
|
41
|
+
# Attempt to get the action method from the Action class if it
|
42
|
+
# exists, otherwise return nil to show that we don't support the
|
43
|
+
# given action.
|
44
|
+
action_method = "action_#{name}"
|
45
|
+
return Action.send(action_method) if Action.respond_to?(action_method)
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
# If the machine ID changed, then we need to rebuild our underlying
|
50
|
+
# driver.
|
51
|
+
def machine_id_changed
|
52
|
+
id = @machine.id
|
53
|
+
|
54
|
+
begin
|
55
|
+
@logger.debug("Instantiating the driver for machine ID: #{@machine.id.inspect}")
|
56
|
+
@driver = Driver::Meta.new(id)
|
57
|
+
rescue Driver::Meta::VMNotFound
|
58
|
+
# The virtual machine doesn't exist, so we probably have a stale
|
59
|
+
# ID. Just clear the id out of the machine and reload it.
|
60
|
+
@logger.debug("VM not found! Clearing saved machine ID and reloading.")
|
61
|
+
id = nil
|
62
|
+
retry
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns the SSH info for accessing the VirtualBox VM.
|
67
|
+
def ssh_info
|
68
|
+
# If the VM is not running that we can't possibly SSH into it
|
69
|
+
return nil if state.id != :running
|
70
|
+
local_port = @driver.ssh_port(@machine.config.ssh.guest_port)
|
71
|
+
return {
|
72
|
+
host: "127.0.0.1",
|
73
|
+
port: local_port
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
# Return the state of Veertu virtual machine by actually
|
78
|
+
# querying VeertuManage.
|
79
|
+
#
|
80
|
+
# @return [Symbol]
|
81
|
+
def state
|
82
|
+
#puts caller
|
83
|
+
# We have to check if the UID matches to avoid issues with
|
84
|
+
# VirtualBox.
|
85
|
+
uid = @machine.uid
|
86
|
+
if uid && uid.to_s != Process.uid.to_s
|
87
|
+
raise Vagrant::Errors::VirtualBoxUserMismatch,
|
88
|
+
original_uid: uid.to_s,
|
89
|
+
uid: Process.uid.to_s
|
90
|
+
end
|
91
|
+
# Determine the ID of the state here.
|
92
|
+
state_id = nil
|
93
|
+
state_id = :not_created if !@driver.uuid
|
94
|
+
state_id = @driver.read_state if !state_id
|
95
|
+
state_id = :unknown if !state_id
|
96
|
+
|
97
|
+
# Translate into short/long descriptions
|
98
|
+
short = state_id.to_s.gsub("_", " ")
|
99
|
+
long = I18n.t("vagrant.commands.status.#{state_id}")
|
100
|
+
|
101
|
+
# If we're not created, then specify the special ID flag
|
102
|
+
if state_id == :not_created
|
103
|
+
state_id = Vagrant::MachineState::NOT_CREATED_ID
|
104
|
+
end
|
105
|
+
# Return the state
|
106
|
+
state_to_ret = Vagrant::MachineState.new(state_id, short, long)
|
107
|
+
return state_to_ret
|
108
|
+
end
|
109
|
+
|
110
|
+
# Returns a human-friendly string version of this provider which
|
111
|
+
# includes the machine's ID that this provider represents, if it
|
112
|
+
# has one.
|
113
|
+
#
|
114
|
+
# @return [String]
|
115
|
+
def to_s
|
116
|
+
id = @machine.id ? @machine.id : "new VM"
|
117
|
+
"VirtualBox (#{id})"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require "vagrant/util/platform"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVeertu
|
5
|
+
class SyncedFolder < Vagrant.plugin("2", :synced_folder)
|
6
|
+
def usable?(machine, raise_errors=false)
|
7
|
+
# These synced folders only work if the provider if VirtualBox
|
8
|
+
return false if machine.provider_name != :virtualbox
|
9
|
+
|
10
|
+
# This only happens with `vagrant package --base`. Sigh.
|
11
|
+
return true if !machine.provider_config
|
12
|
+
|
13
|
+
machine.provider_config.functional_vboxsf
|
14
|
+
end
|
15
|
+
|
16
|
+
def prepare(machine, folders, _opts)
|
17
|
+
share_folders(machine, folders, false)
|
18
|
+
end
|
19
|
+
|
20
|
+
def enable(machine, folders, _opts)
|
21
|
+
share_folders(machine, folders, true)
|
22
|
+
|
23
|
+
# short guestpaths first, so we don't step on ourselves
|
24
|
+
folders = folders.sort_by do |id, data|
|
25
|
+
if data[:guestpath]
|
26
|
+
data[:guestpath].length
|
27
|
+
else
|
28
|
+
# A long enough path to just do this at the end.
|
29
|
+
10000
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Go through each folder and mount
|
34
|
+
machine.ui.output(I18n.t("vagrant.actions.vm.share_folders.mounting"))
|
35
|
+
folders.each do |id, data|
|
36
|
+
if data[:guestpath]
|
37
|
+
# Guest path specified, so mount the folder to specified point
|
38
|
+
machine.ui.detail(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
|
39
|
+
guestpath: data[:guestpath],
|
40
|
+
hostpath: data[:hostpath]))
|
41
|
+
|
42
|
+
# Dup the data so we can pass it to the guest API
|
43
|
+
data = data.dup
|
44
|
+
|
45
|
+
# Calculate the owner and group
|
46
|
+
ssh_info = machine.ssh_info
|
47
|
+
data[:owner] ||= ssh_info[:username]
|
48
|
+
data[:group] ||= ssh_info[:username]
|
49
|
+
|
50
|
+
# Mount the actual folder
|
51
|
+
machine.guest.capability(
|
52
|
+
:mount_virtualbox_shared_folder,
|
53
|
+
os_friendly_id(id), data[:guestpath], data)
|
54
|
+
else
|
55
|
+
# If no guest path is specified, then automounting is disabled
|
56
|
+
machine.ui.detail(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
|
57
|
+
hostpath: data[:hostpath]))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def disable(machine, folders, _opts)
|
63
|
+
if machine.guest.capability?(:unmount_virtualbox_shared_folder)
|
64
|
+
folders.each do |id, data|
|
65
|
+
machine.guest.capability(
|
66
|
+
:unmount_virtualbox_shared_folder,
|
67
|
+
data[:guestpath], data)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Remove the shared folders from the VM metadata
|
72
|
+
names = folders.map { |id, _data| os_friendly_id(id) }
|
73
|
+
driver(machine).unshare_folders(names)
|
74
|
+
end
|
75
|
+
|
76
|
+
def cleanup(machine, opts)
|
77
|
+
driver(machine).clear_shared_folders if machine.id && machine.id != ""
|
78
|
+
end
|
79
|
+
|
80
|
+
protected
|
81
|
+
|
82
|
+
# This is here so that we can stub it for tests
|
83
|
+
def driver(machine)
|
84
|
+
machine.provider.driver
|
85
|
+
end
|
86
|
+
|
87
|
+
def os_friendly_id(id)
|
88
|
+
id.gsub(/[\/]/,'_').sub(/^_/, '')
|
89
|
+
end
|
90
|
+
|
91
|
+
# share_folders sets up the shared folder definitions on the
|
92
|
+
# VirtualBox VM.
|
93
|
+
#
|
94
|
+
# The transient parameter determines if we're FORCING transient
|
95
|
+
# or not. If this is false, then any shared folders will be
|
96
|
+
# shared as non-transient unless they've specifically asked for
|
97
|
+
# transient.
|
98
|
+
def share_folders(machine, folders, transient)
|
99
|
+
defs = []
|
100
|
+
folders.each do |id, data|
|
101
|
+
hostpath = data[:hostpath]
|
102
|
+
if !data[:hostpath_exact]
|
103
|
+
hostpath = Vagrant::Util::Platform.cygwin_windows_path(hostpath)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Only setup the shared folders that match our transient level
|
107
|
+
if (!!data[:transient]) == transient
|
108
|
+
defs << {
|
109
|
+
name: os_friendly_id(id),
|
110
|
+
hostpath: hostpath.to_s,
|
111
|
+
transient: transient,
|
112
|
+
}
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
driver(machine).share_folders(defs)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "vagrant/util/scoped_hash_override"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVeertu
|
5
|
+
module Util
|
6
|
+
module CompileForwardedPorts
|
7
|
+
include Vagrant::Util::ScopedHashOverride
|
8
|
+
|
9
|
+
# This method compiles the forwarded ports into {ForwardedPort}
|
10
|
+
# models.
|
11
|
+
def compile_forwarded_ports(config)
|
12
|
+
mappings = {}
|
13
|
+
|
14
|
+
config.vm.networks.each do |type, options|
|
15
|
+
if type == :forwarded_port
|
16
|
+
guest_port = options[:guest]
|
17
|
+
host_port = options[:host]
|
18
|
+
protocol = options[:protocol] || "tcp"
|
19
|
+
options = scoped_hash_override(options, :veertu)
|
20
|
+
id = options[:id]
|
21
|
+
|
22
|
+
# If the forwarded port was marked as disabled, ignore.
|
23
|
+
next if options[:disabled]
|
24
|
+
|
25
|
+
mappings[host_port.to_s + protocol.to_s] =
|
26
|
+
Model::ForwardedPort.new(id, host_port, guest_port, options)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
mappings.values
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|