vagrant-parallels 0.2.1 → 0.2.2.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +21 -13
- data/.travis.yml +1 -0
- data/README.md +43 -54
- data/config/i18n-tasks.yml.erb +1 -1
- data/debug.log +941 -0
- data/lib/vagrant-parallels/action.rb +0 -7
- data/lib/vagrant-parallels/action/check_accessible.rb +1 -1
- data/lib/vagrant-parallels/action/check_guest_tools.rb +10 -2
- data/lib/vagrant-parallels/action/clear_network_interfaces.rb +1 -1
- data/lib/vagrant-parallels/action/customize.rb +6 -4
- data/lib/vagrant-parallels/action/export.rb +56 -12
- data/lib/vagrant-parallels/action/import.rb +49 -30
- data/lib/vagrant-parallels/action/network.rb +137 -48
- data/lib/vagrant-parallels/action/package_config_files.rb +0 -12
- data/lib/vagrant-parallels/action/prepare_nfs_valid_ids.rb +1 -1
- data/lib/vagrant-parallels/action/set_name.rb +2 -2
- data/lib/vagrant-parallels/config.rb +11 -2
- data/lib/vagrant-parallels/driver/base.rb +281 -0
- data/lib/vagrant-parallels/driver/meta.rb +138 -0
- data/lib/vagrant-parallels/driver/{prl_ctl.rb → pd_8.rb} +116 -256
- data/lib/vagrant-parallels/driver/pd_9.rb +417 -0
- data/lib/vagrant-parallels/errors.rb +15 -7
- data/lib/vagrant-parallels/plugin.rb +7 -7
- data/lib/vagrant-parallels/provider.rb +33 -3
- data/lib/vagrant-parallels/version.rb +1 -1
- data/locales/en.yml +30 -16
- data/test/unit/base.rb +1 -5
- data/test/unit/config_test.rb +13 -2
- data/test/unit/driver/pd_8_test.rb +196 -0
- data/test/unit/driver/pd_9_test.rb +196 -0
- data/test/unit/locales/locales_test.rb +1 -1
- data/test/unit/support/shared/parallels_context.rb +2 -2
- data/test/unit/support/shared/pd_driver_examples.rb +243 -0
- data/test/unit/synced_folder_test.rb +37 -0
- data/vagrant-parallels.gemspec +5 -5
- metadata +39 -32
- data/lib/vagrant-parallels/action/match_mac_address.rb +0 -28
- data/lib/vagrant-parallels/action/register_template.rb +0 -24
- data/lib/vagrant-parallels/action/unregister_template.rb +0 -26
- data/test/support/isolated_environment.rb +0 -46
- data/test/support/tempdir.rb +0 -43
- data/test/unit/driver/prl_ctl_test.rb +0 -148
@@ -261,11 +261,8 @@ module VagrantPlugins
|
|
261
261
|
# If the VM is NOT created yet, then do the setup steps
|
262
262
|
if !env[:result]
|
263
263
|
b2.use CheckAccessible
|
264
|
-
b2.use RegisterTemplate
|
265
264
|
b2.use Customize, "pre-import"
|
266
265
|
b2.use Import
|
267
|
-
b2.use UnregisterTemplate
|
268
|
-
b2.use MatchMACAddress
|
269
266
|
end
|
270
267
|
end
|
271
268
|
b.use action_start
|
@@ -288,7 +285,6 @@ module VagrantPlugins
|
|
288
285
|
autoload :Import, File.expand_path("../action/import", __FILE__)
|
289
286
|
autoload :IsSuspended, File.expand_path("../action/is_suspended", __FILE__)
|
290
287
|
autoload :IsRunning, File.expand_path("../action/is_running", __FILE__)
|
291
|
-
autoload :MatchMACAddress, File.expand_path("../action/match_mac_address", __FILE__)
|
292
288
|
autoload :MessageAlreadyRunning, File.expand_path("../action/message_already_running", __FILE__)
|
293
289
|
autoload :MessageNotCreated, File.expand_path("../action/message_not_created", __FILE__)
|
294
290
|
autoload :MessageNotRunning, File.expand_path("../action/message_not_running", __FILE__)
|
@@ -298,13 +294,10 @@ module VagrantPlugins
|
|
298
294
|
autoload :PackageConfigFiles, File.expand_path("../action/package_config_files", __FILE__)
|
299
295
|
autoload :PrepareNFSSettings, File.expand_path("../action/prepare_nfs_settings", __FILE__)
|
300
296
|
autoload :PrepareNFSValidIds, File.expand_path("../action/prepare_nfs_valid_ids", __FILE__)
|
301
|
-
autoload :RegisterTemplate, File.expand_path("../action/register_template", __FILE__)
|
302
297
|
autoload :Resume, File.expand_path("../action/resume", __FILE__)
|
303
298
|
autoload :SetupPackageFiles, File.expand_path("../action/setup_package_files", __FILE__)
|
304
299
|
autoload :SetName, File.expand_path("../action/set_name", __FILE__)
|
305
300
|
autoload :Suspend, File.expand_path("../action/suspend", __FILE__)
|
306
|
-
autoload :UnregisterTemplate, File.expand_path("../action/unregister_template", __FILE__)
|
307
|
-
|
308
301
|
end
|
309
302
|
end
|
310
303
|
end
|
@@ -12,7 +12,7 @@ module VagrantPlugins
|
|
12
12
|
# is a very bad situation and can only be fixed by the user. It
|
13
13
|
# also prohibits us from actually doing anything with the virtual
|
14
14
|
# machine, so we raise an error.
|
15
|
-
raise
|
15
|
+
raise VagrantPlugins::Parallels::Errors::VMInaccessible
|
16
16
|
end
|
17
17
|
|
18
18
|
@app.call(env)
|
@@ -4,9 +4,17 @@ module VagrantPlugins
|
|
4
4
|
class CheckGuestTools
|
5
5
|
def initialize(app, env)
|
6
6
|
@app = app
|
7
|
+
@logger = Log4r::Logger.new("vagrant::plugins::parallels::check_guest_tools")
|
7
8
|
end
|
8
9
|
|
9
10
|
def call(env)
|
11
|
+
if !env[:machine].provider_config.check_guest_tools
|
12
|
+
@logger.info("Not checking guest tools because configuration")
|
13
|
+
return @app.call(env)
|
14
|
+
end
|
15
|
+
|
16
|
+
env[:ui].info(I18n.t("vagrant_parallels.parallels.checking_guest_tools"))
|
17
|
+
|
10
18
|
tools_version = env[:machine].provider.driver.read_guest_tools_version
|
11
19
|
if !tools_version
|
12
20
|
env[:ui].warn I18n.t("vagrant_parallels.actions.vm.check_guest_tools.not_detected")
|
@@ -14,8 +22,8 @@ module VagrantPlugins
|
|
14
22
|
pd_version = env[:machine].provider.driver.version
|
15
23
|
unless pd_version.start_with? tools_version
|
16
24
|
env[:ui].warn(I18n.t("vagrant_parallels.actions.vm.check_guest_tools.version_mismatch",
|
17
|
-
tools_version
|
18
|
-
parallels_version
|
25
|
+
:tools_version => tools_version,
|
26
|
+
:parallels_version => pd_version))
|
19
27
|
end
|
20
28
|
end
|
21
29
|
|
@@ -9,7 +9,7 @@ module VagrantPlugins
|
|
9
9
|
def call(env)
|
10
10
|
# Delete all disabled network adapters
|
11
11
|
env[:ui].info I18n.t("vagrant.actions.vm.clear_network_interfaces.deleting")
|
12
|
-
env[:machine].provider.driver.
|
12
|
+
env[:machine].provider.driver.delete_disabled_adapters
|
13
13
|
|
14
14
|
@app.call(env)
|
15
15
|
end
|
@@ -25,11 +25,13 @@ module VagrantPlugins
|
|
25
25
|
arg.to_s
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
begin
|
29
|
+
env[:machine].provider.driver.execute_command(
|
30
|
+
processed_command + [retryable: true])
|
31
|
+
rescue VagrantPlugins::Parallels::Errors::PrlCtlError => e
|
30
32
|
raise Vagrant::Errors::VMCustomizationFailed, {
|
31
|
-
|
32
|
-
|
33
|
+
:command => command,
|
34
|
+
:error => e.inspect
|
33
35
|
}
|
34
36
|
end
|
35
37
|
end
|
@@ -2,50 +2,94 @@ module VagrantPlugins
|
|
2
2
|
module Parallels
|
3
3
|
module Action
|
4
4
|
class Export
|
5
|
-
include Util
|
6
|
-
|
7
5
|
def initialize(app, env)
|
8
6
|
@app = app
|
7
|
+
@logger = Log4r::Logger.new("vagrant::plugins::parallels::export")
|
9
8
|
end
|
10
9
|
|
11
10
|
def call(env)
|
12
11
|
@env = env
|
12
|
+
if env[:machine].provider.state.id != :stopped
|
13
|
+
raise Vagrant::Errors::VMPowerOffToPackage
|
14
|
+
end
|
15
|
+
|
16
|
+
name = "#{env[:root_path].basename.to_s}_#{env[:machine].name}"
|
17
|
+
name.gsub!(/[^-a-z0-9_]/i, "")
|
18
|
+
|
19
|
+
# Check the name is not in use
|
20
|
+
if @env[:machine].provider.driver.read_vms.has_key?(@template_name)
|
21
|
+
@template_name << rand(100000).to_s
|
22
|
+
end
|
13
23
|
|
14
|
-
raise Vagrant::Errors::VMPowerOffToPackage if \
|
15
|
-
@env[:machine].provider.state.id != :stopped
|
16
24
|
|
17
|
-
|
18
|
-
|
25
|
+
@template_name = gen_template_name
|
26
|
+
@template_uuid = export
|
27
|
+
compact_template
|
28
|
+
unregister_template
|
19
29
|
|
20
30
|
@app.call(env)
|
21
31
|
end
|
22
32
|
|
23
|
-
def
|
24
|
-
|
33
|
+
def recover(env)
|
34
|
+
@env = env
|
35
|
+
unregister_template
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def gen_template_name
|
41
|
+
# Use configured name if it is specified, or generate the new one
|
42
|
+
name = @env[:machine].provider_config.name
|
43
|
+
if !name
|
44
|
+
name = "#{@env[:root_path].basename.to_s}_#{@env[:machine].name}"
|
45
|
+
name.gsub!(/[^-a-z0-9_]/i, "")
|
46
|
+
end
|
47
|
+
tpl_name = "#{name}_box"
|
25
48
|
|
49
|
+
# Ensure that the name is not in use
|
50
|
+
if @env[:machine].provider.driver.read_vms.has_key?(tpl_name)
|
51
|
+
tpl_name << "_#{rand(1000)}"
|
52
|
+
end
|
53
|
+
|
54
|
+
tpl_name
|
55
|
+
end
|
56
|
+
|
57
|
+
def export
|
26
58
|
@env[:ui].info I18n.t("vagrant.actions.vm.export.exporting")
|
27
|
-
|
59
|
+
tpl_uuid = @env[:machine].provider.driver.export(@env["export.temp_dir"], @template_name) do |progress|
|
28
60
|
@env[:ui].clear_line
|
29
61
|
@env[:ui].report_progress(progress, 100, false)
|
62
|
+
|
63
|
+
# # If we got interrupted, then the import could have been interrupted.
|
64
|
+
# Just rise an exception and then 'recover' will be called to cleanup.
|
65
|
+
raise Vagrant::Errors::VagrantInterrupt if @env[:interrupted]
|
30
66
|
end
|
31
67
|
|
32
68
|
# Clear the line a final time so the next data can appear
|
33
69
|
# alone on the line.
|
34
70
|
@env[:ui].clear_line
|
71
|
+
|
72
|
+
tpl_uuid
|
35
73
|
end
|
36
74
|
|
37
|
-
def
|
75
|
+
def compact_template
|
38
76
|
@env[:ui].info I18n.t("vagrant_parallels.actions.vm.export.compacting")
|
39
|
-
@env[:machine].provider.driver.compact(@
|
77
|
+
@env[:machine].provider.driver.compact(@template_uuid) do |progress|
|
40
78
|
@env[:ui].clear_line
|
41
79
|
@env[:ui].report_progress(progress, 100, false)
|
42
80
|
end
|
43
|
-
@env[:machine].provider.driver.unregister(@temp_vm_uuid)
|
44
81
|
|
45
82
|
# Clear the line a final time so the next data can appear
|
46
83
|
# alone on the line.
|
47
84
|
@env[:ui].clear_line
|
48
85
|
end
|
86
|
+
|
87
|
+
def unregister_template
|
88
|
+
if @env[:machine].provider.driver.registered?(@template_uuid)
|
89
|
+
@logger.info("Unregister the box template: '#{@template_uuid}'")
|
90
|
+
@env[:machine].provider.driver.unregister(@template_uuid)
|
91
|
+
end
|
92
|
+
end
|
49
93
|
end
|
50
94
|
end
|
51
95
|
end
|
@@ -2,41 +2,17 @@ module VagrantPlugins
|
|
2
2
|
module Parallels
|
3
3
|
module Action
|
4
4
|
class Import
|
5
|
-
|
6
|
-
include Util
|
7
|
-
|
8
5
|
def initialize(app, env)
|
9
6
|
@app = app
|
7
|
+
@logger = Log4r::Logger.new("vagrant::plugins::parallels::import")
|
10
8
|
end
|
11
9
|
|
12
|
-
#TODO: Clean up registered VM on interupt
|
13
10
|
def call(env)
|
14
|
-
env
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# Verify the name is not taken
|
20
|
-
if env[:machine].provider.driver.read_all_names.has_key?(vm_name)
|
21
|
-
raise Vagrant::Errors::VMNameExists, :name => vm_name
|
22
|
-
end
|
23
|
-
|
24
|
-
# Import the virtual machine
|
25
|
-
template_path = File.realpath(Pathname.glob(env[:machine].box.directory.join('*.pvm')).first)
|
26
|
-
template_uuid = env[:machine].provider.driver.read_all_paths[template_path]
|
27
|
-
|
28
|
-
env[:machine].id = env[:machine].provider.driver.import(template_uuid, vm_name) do |progress|
|
29
|
-
env[:ui].clear_line
|
30
|
-
env[:ui].report_progress(progress, 100, false)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Clear the line one last time since the progress meter doesn't disappear
|
34
|
-
# immediately.
|
35
|
-
env[:ui].clear_line
|
36
|
-
|
37
|
-
# If we got interrupted, then the import could have been
|
38
|
-
# interrupted and its not a big deal. Just return out.
|
39
|
-
return if env[:interrupted]
|
11
|
+
@env = env
|
12
|
+
@template_path = File.realpath(Pathname.glob(env[:machine].box.directory.join('*.pvm')).first)
|
13
|
+
@template_uuid = register_template
|
14
|
+
import
|
15
|
+
unregister_template
|
40
16
|
|
41
17
|
# Flag as erroneous and return if import failed
|
42
18
|
raise Vagrant::Errors::VMImportFailure if !env[:machine].id
|
@@ -46,8 +22,13 @@ module VagrantPlugins
|
|
46
22
|
end
|
47
23
|
|
48
24
|
def recover(env)
|
25
|
+
@env = env
|
26
|
+
# We should to unregister template
|
27
|
+
unregister_template
|
28
|
+
|
49
29
|
if env[:machine].provider.state.id != :not_created
|
50
30
|
return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
|
31
|
+
return if env["vagrant_parallels.error"].is_a?(VagrantPlugins::Parallels::Errors::VagrantParallelsError)
|
51
32
|
|
52
33
|
# If we're not supposed to destroy on error then just return
|
53
34
|
return if !env[:destroy_on_error]
|
@@ -61,6 +42,44 @@ module VagrantPlugins
|
|
61
42
|
env[:action_runner].run(Action.action_destroy, destroy_env)
|
62
43
|
end
|
63
44
|
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def register_template
|
49
|
+
if !@env[:machine].provider.driver.read_vms_paths.has_key?(@template_path)
|
50
|
+
@logger.info("Register the box template: '#{@template_path}'")
|
51
|
+
@env[:machine].provider.driver.register(@template_path)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Return the uuid of registered template
|
55
|
+
@env[:machine].provider.driver.read_vms_paths[@template_path]
|
56
|
+
end
|
57
|
+
|
58
|
+
def import
|
59
|
+
@env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
|
60
|
+
:name => @env[:machine].box.name)
|
61
|
+
|
62
|
+
# Import the virtual machine
|
63
|
+
@env[:machine].id = @env[:machine].provider.driver.import(@template_uuid) do |progress|
|
64
|
+
@env[:ui].clear_line
|
65
|
+
@env[:ui].report_progress(progress, 100, false)
|
66
|
+
|
67
|
+
# # If we got interrupted, then the import could have been interrupted.
|
68
|
+
# Just rise an exception and then 'recover' will be called to cleanup.
|
69
|
+
raise Vagrant::Errors::VagrantInterrupt if @env[:interrupted]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Clear the line one last time since the progress meter doesn't disappear
|
73
|
+
# immediately.
|
74
|
+
@env[:ui].clear_line
|
75
|
+
end
|
76
|
+
|
77
|
+
def unregister_template
|
78
|
+
if @env[:machine].provider.driver.registered?(@template_uuid)
|
79
|
+
@logger.info("Unregister the box template: '#{@template_uuid}'")
|
80
|
+
@env[:machine].provider.driver.unregister(@template_uuid)
|
81
|
+
end
|
82
|
+
end
|
64
83
|
end
|
65
84
|
end
|
66
85
|
end
|
@@ -24,11 +24,15 @@ module VagrantPlugins
|
|
24
24
|
|
25
25
|
def call(env)
|
26
26
|
@env = env
|
27
|
+
|
27
28
|
# Get the list of network adapters from the configuration
|
28
29
|
network_adapters_config = env[:machine].provider_config.network_adapters.dup
|
29
30
|
|
31
|
+
# Get maximum number of network adapters
|
32
|
+
max_adapters = env[:machine].provider.driver.max_network_adapters
|
33
|
+
|
30
34
|
# Assign the adapter slot for each high-level network
|
31
|
-
available_slots = Set.new(0
|
35
|
+
available_slots = Set.new(0...max_adapters)
|
32
36
|
network_adapters_config.each do |slot, _data|
|
33
37
|
available_slots.delete(slot)
|
34
38
|
end
|
@@ -56,10 +60,10 @@ module VagrantPlugins
|
|
56
60
|
data = nil
|
57
61
|
if type == :private_network
|
58
62
|
# private_network = hostonly
|
59
|
-
data
|
63
|
+
data = [:hostonly, options]
|
60
64
|
elsif type == :public_network
|
61
65
|
# public_network = bridged
|
62
|
-
data
|
66
|
+
data = [:bridged, options]
|
63
67
|
end
|
64
68
|
|
65
69
|
# Store it!
|
@@ -69,6 +73,7 @@ module VagrantPlugins
|
|
69
73
|
|
70
74
|
@logger.info("Determining adapters and compiling network configuration...")
|
71
75
|
adapters = []
|
76
|
+
networks = []
|
72
77
|
network_adapters_config.each do |slot, data|
|
73
78
|
type = data[0]
|
74
79
|
options = data[1]
|
@@ -84,29 +89,53 @@ module VagrantPlugins
|
|
84
89
|
adapter = send("#{type}_adapter", config)
|
85
90
|
adapters << adapter
|
86
91
|
@logger.debug("Adapter configuration: #{adapter.inspect}")
|
92
|
+
|
93
|
+
# Get the network configuration
|
94
|
+
network = send("#{type}_network_config", config)
|
95
|
+
network[:auto_config] = config[:auto_config]
|
96
|
+
networks << network
|
87
97
|
end
|
88
98
|
|
89
99
|
if !adapters.empty?
|
90
100
|
# Enable the adapters
|
91
101
|
@logger.info("Enabling adapters...")
|
92
|
-
env[:ui].info
|
102
|
+
env[:ui].info(I18n.t("vagrant.actions.vm.network.preparing"))
|
103
|
+
adapters.each do |adapter|
|
104
|
+
env[:ui].info(I18n.t(
|
105
|
+
"vagrant_parallels.parallels.network_adapter",
|
106
|
+
adapter: adapter[:adapter].to_s,
|
107
|
+
type: adapter[:type].to_s,
|
108
|
+
extra: "",
|
109
|
+
))
|
110
|
+
end
|
111
|
+
|
93
112
|
env[:machine].provider.driver.enable_adapters(adapters)
|
94
113
|
end
|
95
114
|
|
96
115
|
# Continue the middleware chain.
|
97
116
|
@app.call(env)
|
98
117
|
|
99
|
-
|
118
|
+
# If we have networks to configure, then we configure it now, since
|
119
|
+
# that requires the machine to be up and running.
|
120
|
+
if !adapters.empty? && !networks.empty?
|
121
|
+
assign_interface_numbers(networks, adapters)
|
100
122
|
|
101
|
-
|
102
|
-
|
103
|
-
|
123
|
+
# Only configure the networks the user requested us to configure
|
124
|
+
networks_to_configure = networks.select { |n| n[:auto_config] }
|
125
|
+
if !networks_to_configure.empty?
|
126
|
+
env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
|
127
|
+
env[:machine].guest.capability(:configure_networks, networks_to_configure)
|
128
|
+
end
|
104
129
|
end
|
130
|
+
end
|
105
131
|
|
132
|
+
def bridged_config(options)
|
106
133
|
return {
|
107
|
-
|
108
|
-
|
109
|
-
|
134
|
+
:auto_config => true,
|
135
|
+
:bridge => nil,
|
136
|
+
:mac => nil,
|
137
|
+
:nic_type => nil,
|
138
|
+
:use_dhcp_assigned_default_route => false
|
110
139
|
}.merge(options || {})
|
111
140
|
end
|
112
141
|
|
@@ -175,24 +204,40 @@ module VagrantPlugins
|
|
175
204
|
|
176
205
|
# Given the choice we can now define the adapter we're using
|
177
206
|
return {
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
207
|
+
:adapter => config[:adapter],
|
208
|
+
:type => :bridged,
|
209
|
+
:bridge => chosen_bridge[:name],
|
210
|
+
:bound_to => chosen_bridge[:bound_to],
|
211
|
+
:mac_address => config[:mac],
|
212
|
+
:nic_type => config[:nic_type]
|
213
|
+
}
|
214
|
+
end
|
215
|
+
|
216
|
+
def bridged_network_config(config)
|
217
|
+
if config[:ip]
|
218
|
+
options = {
|
219
|
+
:auto_config => true,
|
220
|
+
:mac => nil,
|
221
|
+
:netmask => "255.255.255.0",
|
222
|
+
:type => :static
|
223
|
+
}.merge(config)
|
224
|
+
options[:type] = options[:type].to_sym
|
225
|
+
return options
|
226
|
+
end
|
227
|
+
|
228
|
+
return {
|
229
|
+
:type => :dhcp,
|
230
|
+
:use_dhcp_assigned_default_route => config[:use_dhcp_assigned_default_route]
|
187
231
|
}
|
188
232
|
end
|
189
233
|
|
190
234
|
def hostonly_config(options)
|
191
235
|
options = {
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
236
|
+
:auto_config => true,
|
237
|
+
:mac => nil,
|
238
|
+
:nic_type => nil,
|
239
|
+
:netmask => "255.255.255.0",
|
240
|
+
:type => :static
|
196
241
|
}.merge(options)
|
197
242
|
|
198
243
|
# Make sure the type is a symbol
|
@@ -229,14 +274,14 @@ module VagrantPlugins
|
|
229
274
|
dhcp_options = {}
|
230
275
|
if options[:type] == :dhcp
|
231
276
|
# Calculate the DHCP server IP, which is the network address
|
232
|
-
# with the final octet +
|
277
|
+
# with the final octet + 1. So "172.28.0.0" turns into "172.28.0.1"
|
233
278
|
dhcp_ip = ip_parts.dup
|
234
|
-
dhcp_ip[3] +=
|
279
|
+
dhcp_ip[3] += 1
|
235
280
|
dhcp_options[:dhcp_ip] ||= dhcp_ip.join(".")
|
236
281
|
|
237
282
|
# Calculate the lower and upper bound for the DHCP server
|
238
283
|
dhcp_lower = ip_parts.dup
|
239
|
-
dhcp_lower[3] +=
|
284
|
+
dhcp_lower[3] += 2
|
240
285
|
dhcp_options[:dhcp_lower] ||= dhcp_lower.join(".")
|
241
286
|
|
242
287
|
dhcp_upper = ip_parts.dup
|
@@ -245,12 +290,13 @@ module VagrantPlugins
|
|
245
290
|
end
|
246
291
|
|
247
292
|
return {
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
293
|
+
:adapter_ip => options[:adapter_ip],
|
294
|
+
:auto_config => options[:auto_config],
|
295
|
+
:ip => options[:ip],
|
296
|
+
:mac => options[:mac],
|
297
|
+
:netmask => options[:netmask],
|
298
|
+
:nic_type => options[:nic_type],
|
299
|
+
:type => options[:type]
|
254
300
|
}.merge(dhcp_options)
|
255
301
|
end
|
256
302
|
|
@@ -273,35 +319,78 @@ module VagrantPlugins
|
|
273
319
|
end
|
274
320
|
|
275
321
|
return {
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
:dhcp => interface[:dhcp],
|
283
|
-
:ip => config[:ip],
|
284
|
-
:netmask => config[:netmask],
|
322
|
+
:adapter => config[:adapter],
|
323
|
+
:hostonly => interface[:name],
|
324
|
+
:bound_to => interface[:bound_to],
|
325
|
+
:mac => config[:mac],
|
326
|
+
:nic_type => config[:nic_type],
|
327
|
+
:type => :hostonly
|
285
328
|
}
|
286
329
|
end
|
287
330
|
|
331
|
+
def hostonly_network_config(config)
|
332
|
+
return {
|
333
|
+
:type => config[:type],
|
334
|
+
:adapter_ip => config[:adapter_ip],
|
335
|
+
:ip => config[:ip],
|
336
|
+
:netmask => config[:netmask]
|
337
|
+
}
|
338
|
+
end
|
339
|
+
|
340
|
+
|
288
341
|
def shared_config(options)
|
289
|
-
return
|
342
|
+
return {
|
343
|
+
:auto_config => false
|
344
|
+
}
|
290
345
|
end
|
291
346
|
|
292
347
|
def shared_adapter(config)
|
293
348
|
return {
|
294
|
-
|
295
|
-
|
296
|
-
:type => :shared,
|
297
|
-
:dhcp => true,
|
298
|
-
:nic_type => "e1000"
|
349
|
+
:adapter => config[:adapter],
|
350
|
+
:type => :shared
|
299
351
|
}
|
300
352
|
end
|
301
353
|
|
354
|
+
def shared_network_config(config)
|
355
|
+
return {}
|
356
|
+
end
|
357
|
+
|
302
358
|
#-----------------------------------------------------------------
|
303
359
|
# Misc. helpers
|
304
360
|
#-----------------------------------------------------------------
|
361
|
+
# Assigns the actual interface number of a network based on the
|
362
|
+
# enabled NICs on the virtual machine.
|
363
|
+
#
|
364
|
+
# This interface number is used by the guest to configure the
|
365
|
+
# NIC on the guest VM.
|
366
|
+
#
|
367
|
+
# The networks are modified in place by adding an ":interface"
|
368
|
+
# field to each.
|
369
|
+
def assign_interface_numbers(networks, adapters)
|
370
|
+
current = 0
|
371
|
+
adapter_to_interface = {}
|
372
|
+
|
373
|
+
# Make a first pass to assign interface numbers by adapter location
|
374
|
+
vm_adapters = @env[:machine].provider.driver.read_network_interfaces
|
375
|
+
vm_adapters.sort.each do |number, adapter|
|
376
|
+
if adapter[:type] != :none
|
377
|
+
# Not used, so assign the interface number and increment
|
378
|
+
adapter_to_interface[number] = current
|
379
|
+
current += 1
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# Make a pass through the adapters to assign the :interface
|
384
|
+
# key to each network configuration.
|
385
|
+
adapters.each_index do |i|
|
386
|
+
adapter = adapters[i]
|
387
|
+
network = networks[i]
|
388
|
+
|
389
|
+
# Figure out the interface number by simple lookup
|
390
|
+
network[:interface] = adapter_to_interface[adapter[:adapter]]
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
305
394
|
# This determines the next free network name
|
306
395
|
def next_network_name
|
307
396
|
# Get the list of numbers
|