vagrantup 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e00fcfbb23193067c2a4afea59ae386dea208b0d
4
- data.tar.gz: ca231121eaa851f69dfd8b360358bd4804b394ae
3
+ metadata.gz: 5aa9368fc2e24fa94ec18e65cd73d03e00def5e8
4
+ data.tar.gz: 1fafad8a7216fe1f52d1a08ccea1bcf8c11cb494
5
5
  SHA512:
6
- metadata.gz: bd27ea5ad68e7fdc28fe857b0e0ee4c55dbdbf201169d5a046d11dde5153d2dbc5d0068afc0ada829dbcfbd6139634fea92486c0165f517e81920e4f4360518a
7
- data.tar.gz: c224f537f42011a882d432fd6d14202958ab4f91af54c33256c4b57f4d37a20dfb559f4676d8b9aa04063631b110ef0eb7af366a57ef1f6f92589f2c4ab72fac
6
+ metadata.gz: f350c801e88b083f615cf660ff20052cd3366c6fbba307cb9fc9a30b746966428b11630b69163c11b15d15b3a17fb9645d436e07428ebdddaba68d6d63c0cf3a
7
+ data.tar.gz: b926631edb087fdea0689d3dd3dc1738172f29156792b01f07907b8bf15b723ba469cabd61dc30d008b6f3576b3d41b6390b2bff4242316935890cf03b757e09
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.0.4 (September 13, 2012)
2
+
3
+ - VirtualBox 4.2 driver. [GH-1120]
4
+ - Correct `ssh-config` help to use `--host`, not `-h`.
5
+ - Use "127.0.0.1" instead of "localhost" for port checking to fix problem
6
+ where "localhost" is not properly setup. [GH-1057]
7
+ - Disable read timeout on Net::HTTP to avoid `rbuf_fill` error. [GH-1072]
8
+ - Retry SSH on `EHOSTUNREACH` errors.
9
+ - Add missing translation for "saving" state. [GH-1110]
10
+
1
11
  ## 1.0.3 (May 1, 2012)
2
12
 
3
13
  - Don't enable NAT DNS proxy on machines where resolv.conf already points
@@ -33,7 +33,7 @@ module Vagrant
33
33
  hostport = options[:hostport].to_i
34
34
  hostport = current[options[:name]] if current.has_key?(options[:name])
35
35
 
36
- if existing.include?(hostport) || is_port_open?("localhost", hostport)
36
+ if existing.include?(hostport) || is_port_open?("127.0.0.1", hostport)
37
37
  # We have a collision! Handle it
38
38
  send("handle_#{handler}".to_sym, options, existing)
39
39
  end
@@ -135,7 +135,7 @@ module Vagrant
135
135
 
136
136
  # Make a first pass to assign interface numbers by adapter location
137
137
  vm_adapters = @env[:vm].driver.read_network_interfaces
138
- vm_adapters.each do |number, adapter|
138
+ vm_adapters.sort.each do |number, adapter|
139
139
  if adapter[:type] != :none
140
140
  # Not used, so assign the interface number and increment
141
141
  adapter_to_interface[number] = current
@@ -11,11 +11,11 @@ module Vagrant
11
11
  options = {}
12
12
 
13
13
  opts = OptionParser.new do |opts|
14
- opts.banner = "Usage: vagrant ssh-config [vm-name] [-h name]"
14
+ opts.banner = "Usage: vagrant ssh-config [vm-name] [--host name]"
15
15
 
16
16
  opts.separator ""
17
17
 
18
- opts.on("--host COMMAND", "Name the host for the config..") do |h|
18
+ opts.on("--host NAME", "Name the host for the config..") do |h|
19
19
  options[:host] = h
20
20
  end
21
21
  end
@@ -131,8 +131,17 @@ module Vagrant
131
131
  # Connect to SSH, giving it a few tries
132
132
  connection = nil
133
133
  begin
134
+ # These are the exceptions that we retry because they represent
135
+ # errors that are generally fixed from a retry and don't
136
+ # necessarily represent immediate failure cases.
137
+ exceptions = [
138
+ Errno::ECONNREFUSED,
139
+ Errno::EHOSTUNREACH,
140
+ Net::SSH::Disconnect,
141
+ Timeout::Error
142
+ ]
143
+
134
144
  @logger.info("Connecting to SSH: #{ssh_info[:host]}:#{ssh_info[:port]}")
135
- exceptions = [Errno::ECONNREFUSED, Net::SSH::Disconnect]
136
145
  connection = retryable(:tries => @vm.config.ssh.max_tries, :on => exceptions) do
137
146
  Net::SSH.start(ssh_info[:host], ssh_info[:username], opts)
138
147
  end
@@ -19,6 +19,7 @@ module Vagrant
19
19
  proxy_uri = resolve_proxy(uri)
20
20
 
21
21
  http = Net::HTTP.new(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
22
+ http.read_timeout = nil # Disable the read timeout, just let it try to download
22
23
 
23
24
  if uri.scheme == "https"
24
25
  http.use_ssl = true
@@ -44,7 +44,8 @@ module Vagrant
44
44
  @logger.debug("Finding driver for VirtualBox version: #{@version}")
45
45
  driver_map = {
46
46
  "4.0" => VirtualBox_4_0,
47
- "4.1" => VirtualBox_4_1
47
+ "4.1" => VirtualBox_4_1,
48
+ "4.2" => VirtualBox_4_2
48
49
  }
49
50
 
50
51
  driver_klass = nil
@@ -0,0 +1,459 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/driver/virtualbox_base'
4
+
5
+ module Vagrant
6
+ module Driver
7
+ # Driver for VirtualBox 4.2.x
8
+ class VirtualBox_4_2 < VirtualBoxBase
9
+ def initialize(uuid)
10
+ super()
11
+
12
+ @logger = Log4r::Logger.new("vagrant::driver::virtualbox_4_2")
13
+ @uuid = uuid
14
+ end
15
+
16
+ def clear_forwarded_ports
17
+ args = []
18
+ read_forwarded_ports(@uuid).each do |nic, name, _, _|
19
+ args.concat(["--natpf#{nic}", "delete", name])
20
+ end
21
+
22
+ execute("modifyvm", @uuid, *args) if !args.empty?
23
+ end
24
+
25
+ def clear_shared_folders
26
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
27
+ info.split("\n").each do |line|
28
+ if line =~ /^SharedFolderNameMachineMapping\d+="(.+?)"$/
29
+ execute("sharedfolder", "remove", @uuid, "--name", $1.to_s)
30
+ end
31
+ end
32
+ end
33
+
34
+ def create_dhcp_server(network, options)
35
+ execute("dhcpserver", "add", "--ifname", network,
36
+ "--ip", options[:dhcp_ip],
37
+ "--netmask", options[:netmask],
38
+ "--lowerip", options[:dhcp_lower],
39
+ "--upperip", options[:dhcp_upper],
40
+ "--enable")
41
+ end
42
+
43
+ def create_host_only_network(options)
44
+ # Create the interface
45
+ execute("hostonlyif", "create") =~ /^Interface '(.+?)' was successfully created$/
46
+ name = $1.to_s
47
+
48
+ # Configure it
49
+ execute("hostonlyif", "ipconfig", name,
50
+ "--ip", options[:adapter_ip],
51
+ "--netmask", options[:netmask])
52
+
53
+ # Return the details
54
+ return {
55
+ :name => name,
56
+ :ip => options[:adapter_ip],
57
+ :netmask => options[:netmask],
58
+ :dhcp => nil
59
+ }
60
+ end
61
+
62
+ def delete
63
+ execute("unregistervm", @uuid, "--delete")
64
+ end
65
+
66
+ def delete_unused_host_only_networks
67
+ networks = []
68
+ execute("list", "hostonlyifs").split("\n").each do |line|
69
+ networks << $1.to_s if line =~ /^Name:\s+(.+?)$/
70
+ end
71
+
72
+ execute("list", "vms").split("\n").each do |line|
73
+ if line =~ /^".+?"\s+\{(.+?)\}$/
74
+ info = execute("showvminfo", $1.to_s, "--machinereadable", :retryable => true)
75
+ info.split("\n").each do |line|
76
+ if line =~ /^hostonlyadapter\d+="(.+?)"$/
77
+ networks.delete($1.to_s)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ networks.each do |name|
84
+ # First try to remove any DHCP servers attached. We use `raw` because
85
+ # it is okay if this fails. It usually means that a DHCP server was
86
+ # never attached.
87
+ raw("dhcpserver", "remove", "--ifname", name)
88
+
89
+ # Delete the actual host only network interface.
90
+ execute("hostonlyif", "remove", name)
91
+ end
92
+ end
93
+
94
+ def discard_saved_state
95
+ execute("discardstate", @uuid)
96
+ end
97
+
98
+ def enable_adapters(adapters)
99
+ args = []
100
+ adapters.each do |adapter|
101
+ args.concat(["--nic#{adapter[:adapter]}", adapter[:type].to_s])
102
+
103
+ if adapter[:bridge]
104
+ args.concat(["--bridgeadapter#{adapter[:adapter]}",
105
+ adapter[:bridge]])
106
+ end
107
+
108
+ if adapter[:hostonly]
109
+ args.concat(["--hostonlyadapter#{adapter[:adapter]}",
110
+ adapter[:hostonly]])
111
+ end
112
+
113
+ if adapter[:mac_address]
114
+ args.concat(["--macaddress#{adapter[:adapter]}",
115
+ adapter[:mac_address]])
116
+ end
117
+
118
+ if adapter[:nic_type]
119
+ args.concat(["--nictype#{adapter[:adapter]}", adapter[:nic_type].to_s])
120
+ end
121
+ end
122
+
123
+ execute("modifyvm", @uuid, *args)
124
+ end
125
+
126
+ def execute_command(command)
127
+ raw(*command)
128
+ end
129
+
130
+ def export(path)
131
+ # TODO: Progress
132
+ execute("export", @uuid, "--output", path.to_s)
133
+ end
134
+
135
+ def forward_ports(ports)
136
+ args = []
137
+ ports.each do |options|
138
+ pf_builder = [options[:name],
139
+ options[:protocol] || "tcp",
140
+ "",
141
+ options[:hostport],
142
+ "",
143
+ options[:guestport]]
144
+
145
+ args.concat(["--natpf#{options[:adapter] || 1}",
146
+ pf_builder.join(",")])
147
+ end
148
+
149
+ execute("modifyvm", @uuid, *args) if !args.empty?
150
+ end
151
+
152
+ def halt
153
+ execute("controlvm", @uuid, "poweroff")
154
+ end
155
+
156
+ def import(ovf)
157
+ output = ""
158
+ total = ""
159
+ last = 0
160
+ execute("import", ovf) do |type, data|
161
+ if type == :stdout
162
+ # Keep track of the stdout so that we can get the VM name
163
+ output << data
164
+ elsif type == :stderr
165
+ # Append the data so we can see the full view
166
+ total << data
167
+
168
+ # Break up the lines. We can't get the progress until we see an "OK"
169
+ lines = total.split("\n")
170
+ if lines.include?("OK.")
171
+ # The progress of the import will be in the last line. Do a greedy
172
+ # regular expression to find what we're looking for.
173
+ if lines.last =~ /.+(\d{2})%/
174
+ current = $1.to_i
175
+ if current > last
176
+ last = current
177
+ yield current if block_given?
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ # Find the name of the VM name
185
+ if output !~ /Suggested VM name "(.+?)"/
186
+ @logger.error("Couldn't find VM name in the output.")
187
+ return nil
188
+ end
189
+
190
+ name = $1.to_s
191
+
192
+ output = execute("list", "vms")
193
+ if output =~ /^"#{Regexp.escape(name)}" \{(.+?)\}$/
194
+ return $1.to_s
195
+ end
196
+
197
+ nil
198
+ end
199
+
200
+ def read_forwarded_ports(uuid=nil, active_only=false)
201
+ uuid ||= @uuid
202
+
203
+ @logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
204
+
205
+ results = []
206
+ current_nic = nil
207
+ info = execute("showvminfo", uuid, "--machinereadable", :retryable => true)
208
+ info.split("\n").each do |line|
209
+ # This is how we find the nic that a FP is attached to,
210
+ # since this comes first.
211
+ current_nic = $1.to_i if line =~ /^nic(\d+)=".+?"$/
212
+
213
+ # If we care about active VMs only, then we check the state
214
+ # to verify the VM is running.
215
+ if active_only && line =~ /^VMState="(.+?)"$/ && $1.to_s != "running"
216
+ return []
217
+ end
218
+
219
+ # Parse out the forwarded port information
220
+ if line =~ /^Forwarding.+?="(.+?),.+?,.*?,(.+?),.*?,(.+?)"$/
221
+ result = [current_nic, $1.to_s, $2.to_i, $3.to_i]
222
+ @logger.debug(" - #{result.inspect}")
223
+ results << result
224
+ end
225
+ end
226
+
227
+ results
228
+ end
229
+
230
+ def read_bridged_interfaces
231
+ execute("list", "bridgedifs").split("\n\n").collect do |block|
232
+ info = {}
233
+
234
+ block.split("\n").each do |line|
235
+ if line =~ /^Name:\s+(.+?)$/
236
+ info[:name] = $1.to_s
237
+ elsif line =~ /^IPAddress:\s+(.+?)$/
238
+ info[:ip] = $1.to_s
239
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
240
+ info[:netmask] = $1.to_s
241
+ elsif line =~ /^Status:\s+(.+?)$/
242
+ info[:status] = $1.to_s
243
+ end
244
+ end
245
+
246
+ # Return the info to build up the results
247
+ info
248
+ end
249
+ end
250
+
251
+ def read_guest_additions_version
252
+ output = execute("guestproperty", "get", @uuid, "/VirtualBox/GuestAdd/Version",
253
+ :retryable => true)
254
+ if output =~ /^Value: (.+?)$/
255
+ # Split the version by _ since some distro versions modify it
256
+ # to look like this: 4.1.2_ubuntu, and the distro part isn't
257
+ # too important.
258
+ value = $1.to_s
259
+ return value.split("_").first
260
+ end
261
+
262
+ return nil
263
+ end
264
+
265
+ def read_host_only_interfaces
266
+ dhcp = {}
267
+ execute("list", "dhcpservers", :retryable => true).split("\n\n").each do |block|
268
+ info = {}
269
+
270
+ block.split("\n").each do |line|
271
+ if line =~ /^NetworkName:\s+HostInterfaceNetworking-(.+?)$/
272
+ info[:network] = $1.to_s
273
+ elsif line =~ /^IP:\s+(.+?)$/
274
+ info[:ip] = $1.to_s
275
+ elsif line =~ /^lowerIPAddress:\s+(.+?)$/
276
+ info[:lower] = $1.to_s
277
+ elsif line =~ /^upperIPAddress:\s+(.+?)$/
278
+ info[:upper] = $1.to_s
279
+ end
280
+ end
281
+
282
+ # Set the DHCP info
283
+ dhcp[info[:network]] = info
284
+ end
285
+
286
+ execute("list", "hostonlyifs", :retryable => true).split("\n\n").collect do |block|
287
+ info = {}
288
+
289
+ block.split("\n").each do |line|
290
+ if line =~ /^Name:\s+(.+?)$/
291
+ info[:name] = $1.to_s
292
+ elsif line =~ /^IPAddress:\s+(.+?)$/
293
+ info[:ip] = $1.to_s
294
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
295
+ info[:netmask] = $1.to_s
296
+ elsif line =~ /^Status:\s+(.+?)$/
297
+ info[:status] = $1.to_s
298
+ end
299
+ end
300
+
301
+ # Set the DHCP info if it exists
302
+ info[:dhcp] = dhcp[info[:name]] if dhcp[info[:name]]
303
+
304
+ info
305
+ end
306
+ end
307
+
308
+ def read_mac_address
309
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
310
+ info.split("\n").each do |line|
311
+ return $1.to_s if line =~ /^macaddress1="(.+?)"$/
312
+ end
313
+
314
+ nil
315
+ end
316
+
317
+ def read_machine_folder
318
+ execute("list", "systemproperties", :retryable => true).split("\n").each do |line|
319
+ if line =~ /^Default machine folder:\s+(.+?)$/i
320
+ return $1.to_s
321
+ end
322
+ end
323
+
324
+ nil
325
+ end
326
+
327
+ def read_network_interfaces
328
+ nics = {}
329
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
330
+ info.split("\n").each do |line|
331
+ if line =~ /^nic(\d+)="(.+?)"$/
332
+ adapter = $1.to_i
333
+ type = $2.to_sym
334
+
335
+ nics[adapter] ||= {}
336
+ nics[adapter][:type] = type
337
+ elsif line =~ /^hostonlyadapter(\d+)="(.+?)"$/
338
+ adapter = $1.to_i
339
+ network = $2.to_s
340
+
341
+ nics[adapter] ||= {}
342
+ nics[adapter][:hostonly] = network
343
+ elsif line =~ /^bridgeadapter(\d+)="(.+?)"$/
344
+ adapter = $1.to_i
345
+ network = $2.to_s
346
+
347
+ nics[adapter] ||= {}
348
+ nics[adapter][:bridge] = network
349
+ end
350
+ end
351
+
352
+ nics
353
+ end
354
+
355
+ def read_state
356
+ output = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
357
+ if output =~ /^name="<inaccessible>"$/
358
+ return :inaccessible
359
+ elsif output =~ /^VMState="(.+?)"$/
360
+ return $1.to_sym
361
+ end
362
+
363
+ nil
364
+ end
365
+
366
+ def read_used_ports
367
+ ports = []
368
+ execute("list", "vms", :retryable => true).split("\n").each do |line|
369
+ if line =~ /^".+?" \{(.+?)\}$/
370
+ uuid = $1.to_s
371
+
372
+ # Ignore our own used ports
373
+ next if uuid == @uuid
374
+
375
+ read_forwarded_ports(uuid, true).each do |_, _, hostport, _|
376
+ ports << hostport
377
+ end
378
+ end
379
+ end
380
+
381
+ ports
382
+ end
383
+
384
+ def read_vms
385
+ results = []
386
+ execute("list", "vms", :retryable => true).split("\n").each do |line|
387
+ if line =~ /^".+?" \{(.+?)\}$/
388
+ results << $1.to_s
389
+ end
390
+ end
391
+
392
+ results
393
+ end
394
+
395
+ def set_mac_address(mac)
396
+ execute("modifyvm", @uuid, "--macaddress1", mac)
397
+ end
398
+
399
+ def set_name(name)
400
+ execute("modifyvm", @uuid, "--name", name)
401
+ end
402
+
403
+ def share_folders(folders)
404
+ folders.each do |folder|
405
+ args = ["--name",
406
+ folder[:name],
407
+ "--hostpath",
408
+ folder[:hostpath]]
409
+ args << "--transient" if folder.has_key?(:transient) && folder[:transient]
410
+ execute("sharedfolder", "add", @uuid, *args)
411
+ end
412
+ end
413
+
414
+ def ssh_port(expected_port)
415
+ @logger.debug("Searching for SSH port: #{expected_port.inspect}")
416
+
417
+ # Look for the forwarded port only by comparing the guest port
418
+ read_forwarded_ports.each do |_, _, hostport, guestport|
419
+ return hostport if guestport == expected_port
420
+ end
421
+
422
+ nil
423
+ end
424
+
425
+ def start(mode)
426
+ command = ["startvm", @uuid, "--type", mode.to_s]
427
+ r = raw(*command)
428
+
429
+ if r.exit_code == 0 || r.stdout =~ /VM ".+?" has been successfully started/
430
+ # Some systems return an exit code 1 for some reason. For that
431
+ # we depend on the output.
432
+ return true
433
+ end
434
+
435
+ # If we reached this point then it didn't work out.
436
+ raise Errors::VBoxManageError, :command => command.inspect
437
+ end
438
+
439
+ def suspend
440
+ execute("controlvm", @uuid, "savestate")
441
+ end
442
+
443
+ def verify!
444
+ # This command sometimes fails if kernel drivers aren't properly loaded
445
+ # so we just run the command and verify that it succeeded.
446
+ execute("list", "hostonlyifs")
447
+ end
448
+
449
+ def verify_image(path)
450
+ r = raw("import", path.to_s, "--dry-run")
451
+ return r.exit_code == 0
452
+ end
453
+
454
+ def vm_exists?(uuid)
455
+ raw("showvminfo", uuid).exit_code == 0
456
+ end
457
+ end
458
+ end
459
+ end
@@ -3,5 +3,6 @@ module Vagrant
3
3
  autoload :VirtualBox, 'vagrant/driver/virtualbox'
4
4
  autoload :VirtualBox_4_0, 'vagrant/driver/virtualbox_4_0'
5
5
  autoload :VirtualBox_4_1, 'vagrant/driver/virtualbox_4_1'
6
+ autoload :VirtualBox_4_2, 'vagrant/driver/virtualbox_4_2'
6
7
  end
7
8
  end
@@ -2,5 +2,5 @@ module Vagrant
2
2
  # This will always be up to date with the current version of Vagrant,
3
3
  # since it is used to generate the gemspec and is also the source of
4
4
  # the version for `vagrant -v`
5
- VERSION = "1.0.3"
5
+ VERSION = "1.0.4"
6
6
  end
@@ -299,6 +299,10 @@ en:
299
299
  shut it down forcefully, or you can run `vagrant suspend` to simply
300
300
  suspend the virtual machine. In either case, to restart it again,
301
301
  simply run `vagrant up`.
302
+ saving: |-
303
+ The VM is currently saving its state. In a few moments this state
304
+ should transition to "saved." Please run `vagrant status` again
305
+ in a few seconds.
302
306
  saved: |-
303
307
  To resume this VM, simply run `vagrant up`.
304
308
  stuck: |-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrantup
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitchell Hashimoto
@@ -343,6 +343,7 @@ files:
343
343
  - lib/vagrant/driver/virtualbox.rb
344
344
  - lib/vagrant/driver/virtualbox_4_0.rb
345
345
  - lib/vagrant/driver/virtualbox_4_1.rb
346
+ - lib/vagrant/driver/virtualbox_4_2.rb
346
347
  - lib/vagrant/driver/virtualbox_base.rb
347
348
  - lib/vagrant/environment.rb
348
349
  - lib/vagrant/errors.rb