vagrant-libvirt 0.0.42 → 0.2.1

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.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +393 -147
  3. data/lib/vagrant-libvirt/action.rb +3 -2
  4. data/lib/vagrant-libvirt/action/create_domain.rb +87 -37
  5. data/lib/vagrant-libvirt/action/create_domain_volume.rb +19 -14
  6. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +9 -5
  7. data/lib/vagrant-libvirt/action/create_networks.rb +7 -2
  8. data/lib/vagrant-libvirt/action/destroy_domain.rb +1 -1
  9. data/lib/vagrant-libvirt/action/destroy_networks.rb +5 -0
  10. data/lib/vagrant-libvirt/action/forward_ports.rb +10 -8
  11. data/lib/vagrant-libvirt/action/halt_domain.rb +1 -1
  12. data/lib/vagrant-libvirt/action/handle_box_image.rb +26 -15
  13. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +9 -4
  14. data/lib/vagrant-libvirt/action/package_domain.rb +58 -12
  15. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +3 -9
  16. data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +19 -9
  17. data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +2 -2
  18. data/lib/vagrant-libvirt/action/remove_stale_volume.rb +17 -11
  19. data/lib/vagrant-libvirt/action/set_boot_order.rb +2 -2
  20. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +6 -9
  21. data/lib/vagrant-libvirt/action/start_domain.rb +2 -2
  22. data/lib/vagrant-libvirt/action/wait_till_up.rb +31 -16
  23. data/lib/vagrant-libvirt/cap/public_address.rb +16 -0
  24. data/lib/vagrant-libvirt/cap/synced_folder.rb +3 -3
  25. data/lib/vagrant-libvirt/config.rb +177 -29
  26. data/lib/vagrant-libvirt/driver.rb +31 -2
  27. data/lib/vagrant-libvirt/errors.rb +5 -1
  28. data/lib/vagrant-libvirt/plugin.rb +7 -2
  29. data/lib/vagrant-libvirt/templates/default_storage_pool.xml.erb +3 -3
  30. data/lib/vagrant-libvirt/templates/domain.xml.erb +48 -8
  31. data/lib/vagrant-libvirt/util.rb +1 -0
  32. data/lib/vagrant-libvirt/util/erb_template.rb +6 -7
  33. data/lib/vagrant-libvirt/util/network_util.rb +33 -13
  34. data/lib/vagrant-libvirt/util/nfs.rb +17 -0
  35. data/lib/vagrant-libvirt/util/storage_util.rb +27 -0
  36. data/lib/vagrant-libvirt/version.rb +1 -1
  37. data/locales/en.yml +8 -4
  38. data/spec/support/environment_helper.rb +1 -1
  39. data/spec/support/libvirt_context.rb +1 -1
  40. data/spec/support/sharedcontext.rb +2 -2
  41. data/spec/unit/action/destroy_domain_spec.rb +2 -2
  42. data/spec/unit/action/set_name_of_domain_spec.rb +3 -3
  43. data/spec/unit/config_spec.rb +173 -0
  44. data/spec/unit/templates/domain_all_settings.xml +20 -4
  45. data/spec/unit/templates/domain_custom_cpu_model.xml +48 -0
  46. data/spec/unit/templates/domain_defaults.xml +2 -0
  47. data/spec/unit/templates/domain_spec.rb +26 -2
  48. metadata +24 -32
  49. data/.coveralls.yml +0 -1
  50. data/.github/issue_template.md +0 -37
  51. data/.gitignore +0 -21
  52. data/.travis.yml +0 -24
  53. data/Gemfile +0 -26
  54. data/Rakefile +0 -8
  55. data/example_box/README.md +0 -29
  56. data/example_box/Vagrantfile +0 -60
  57. data/example_box/metadata.json +0 -5
  58. data/tools/create_box.sh +0 -130
  59. data/tools/prepare_redhat_for_box.sh +0 -119
  60. data/vagrant-libvirt.gemspec +0 -54
@@ -19,7 +19,7 @@ module VagrantPlugins
19
19
  begin
20
20
  env[:machine].guest.capability(:halt)
21
21
  rescue
22
- @logger.info('Trying libvirt graceful shutdown.')
22
+ @logger.info('Trying Libvirt graceful shutdown.')
23
23
  domain.shutdown
24
24
  end
25
25
 
@@ -4,6 +4,9 @@ module VagrantPlugins
4
4
  module ProviderLibvirt
5
5
  module Action
6
6
  class HandleBoxImage
7
+ include VagrantPlugins::ProviderLibvirt::Util::StorageUtil
8
+
9
+
7
10
  @@lock = Mutex.new
8
11
 
9
12
  def initialize(app, _env)
@@ -31,11 +34,12 @@ module VagrantPlugins
31
34
  config = env[:machine].provider_config
32
35
  box_image_file = env[:machine].box.directory.join('box.img').to_s
33
36
  env[:box_volume_name] = env[:machine].box.name.to_s.dup.gsub('/', '-VAGRANTSLASH-')
34
- env[:box_volume_name] << "_vagrant_box_image_#{begin
35
- env[:machine].box.version.to_s
36
- rescue
37
- ''
38
- end}.img"
37
+ env[:box_volume_name] << "_vagrant_box_image_#{
38
+ begin
39
+ env[:machine].box.version.to_s
40
+ rescue
41
+ ''
42
+ end}.img"
39
43
 
40
44
  # Override box_virtual_size
41
45
  if config.machine_virtual_size
@@ -44,7 +48,7 @@ module VagrantPlugins
44
48
  # is not supported and will be ignored
45
49
  env[:ui].warn I18n.t(
46
50
  'vagrant_libvirt.warnings.ignoring_virtual_size_too_small',
47
- requested: config.machine_virtual_size, minimum: box_virtual_size
51
+ requested: config.machine_virtual_size, minimum: box_virtual_size
48
52
  )
49
53
  else
50
54
  env[:ui].info I18n.t('vagrant_libvirt.manual_resize_required')
@@ -59,9 +63,10 @@ module VagrantPlugins
59
63
  # locking all subsequent actions as well.
60
64
  @@lock.synchronize do
61
65
  # Don't continue if image already exists in storage pool.
62
- break if ProviderLibvirt::Util::Collection.find_matching(
63
- env[:machine].provider.driver.connection.volumes.all, env[:box_volume_name]
64
- )
66
+ box_volume = env[:machine].provider.driver.connection.volumes.all(
67
+ name: env[:box_volume_name]
68
+ ).first
69
+ break if box_volume && box_volume.id
65
70
 
66
71
  # Box is not available as a storage pool volume. Create and upload
67
72
  # it as a copy of local box image.
@@ -75,13 +80,19 @@ module VagrantPlugins
75
80
  message = "Creating volume #{env[:box_volume_name]}"
76
81
  message << " in storage pool #{config.storage_pool_name}."
77
82
  @logger.info(message)
83
+
84
+ @storage_volume_uid = storage_uid env
85
+ @storage_volume_gid = storage_gid env
86
+
78
87
  begin
79
88
  fog_volume = env[:machine].provider.driver.connection.volumes.create(
80
- name: env[:box_volume_name],
81
- allocation: "#{box_image_size / 1024 / 1024}M",
82
- capacity: "#{box_virtual_size}G",
83
- format_type: box_format,
84
- pool_name: config.storage_pool_name
89
+ name: env[:box_volume_name],
90
+ allocation: "#{box_image_size / 1024 / 1024}M",
91
+ capacity: "#{box_virtual_size}G",
92
+ format_type: box_format,
93
+ owner: @storage_volume_uid,
94
+ group: @storage_volume_gid,
95
+ pool_name: config.storage_pool_name
85
96
  )
86
97
  rescue Fog::Errors::Error => e
87
98
  raise Errors::FogCreateVolumeError,
@@ -115,7 +126,7 @@ module VagrantPlugins
115
126
 
116
127
  protected
117
128
 
118
- # Fog libvirt currently doesn't support uploading images to storage
129
+ # Fog Libvirt currently doesn't support uploading images to storage
119
130
  # pool volumes. Use ruby-libvirt client instead.
120
131
  def upload_image(image_file, pool_name, volume_name, env)
121
132
  image_size = File.size(image_file) # B
@@ -5,6 +5,8 @@ module VagrantPlugins
5
5
  module Action
6
6
  class HandleStoragePool
7
7
  include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
8
+ include VagrantPlugins::ProviderLibvirt::Util::StorageUtil
9
+
8
10
 
9
11
  @@lock = Mutex.new
10
12
 
@@ -22,9 +24,9 @@ module VagrantPlugins
22
24
  # locking all subsequent actions as well.
23
25
  @@lock.synchronize do
24
26
  # Check for storage pool, where box image should be created
25
- break if ProviderLibvirt::Util::Collection.find_matching(
26
- env[:machine].provider.driver.connection.pools.all, config.storage_pool_name
27
- )
27
+ break unless env[:machine].provider.driver.connection.pools.all(
28
+ name: config.storage_pool_name
29
+ ).empty?
28
30
 
29
31
  @logger.info("No storage pool '#{config.storage_pool_name}' is available.")
30
32
 
@@ -34,9 +36,12 @@ module VagrantPlugins
34
36
 
35
37
  @logger.info("Creating storage pool 'default'")
36
38
 
37
- # Fog libvirt currently doesn't support creating pools. Use
39
+ # Fog Libvirt currently doesn't support creating pools. Use
38
40
  # ruby-libvirt client directly.
39
41
  begin
42
+ @storage_pool_path = storage_pool_path(env)
43
+ @storage_pool_uid = storage_uid(env)
44
+ @storage_pool_gid = storage_gid(env)
40
45
  libvirt_pool = env[:machine].provider.driver.connection.client.define_storage_pool_xml(
41
46
  to_xml('default_storage_pool')
42
47
  )
@@ -1,9 +1,10 @@
1
+ require 'fileutils'
1
2
  require 'log4r'
2
3
 
3
4
  module VagrantPlugins
4
5
  module ProviderLibvirt
5
6
  module Action
6
- # Action for create new box for libvirt provider
7
+ # Action for create new box for Libvirt provider
7
8
  class PackageDomain
8
9
  def initialize(app, env)
9
10
  @logger = Log4r::Logger.new('vagrant_libvirt::action::package_domain')
@@ -21,24 +22,31 @@ module VagrantPlugins
21
22
  root_disk = domain.volumes.select do |x|
22
23
  x.name == libvirt_domain.name + '.img'
23
24
  end.first
25
+ raise Errors::NoDomainVolume if root_disk.nil?
24
26
  boxname = env['package.output']
25
27
  raise "#{boxname}: Already exists" if File.exist?(boxname)
26
28
  @tmp_dir = Dir.pwd + '/_tmp_package'
27
29
  @tmp_img = @tmp_dir + '/box.img'
28
- Dir.mkdir(@tmp_dir)
29
- if File.readable?(root_disk.path)
30
- backing = `qemu-img info "#{root_disk.path}" | grep 'backing file:' | cut -d ':' -f2`.chomp
31
- else
32
- env[:ui].error("Require set read access to #{root_disk.path}. sudo chmod a+r #{root_disk.path}")
33
- FileUtils.rm_rf(@tmp_dir)
34
- raise 'Have no access'
30
+ FileUtils.mkdir_p(@tmp_dir)
31
+ env[:ui].info("Downloading #{root_disk.name} to #{@tmp_img}")
32
+ ret = download_image(@tmp_img, env[:machine].provider_config.storage_pool_name,
33
+ root_disk.name, env) do |progress,image_size|
34
+ env[:ui].clear_line
35
+ env[:ui].report_progress(progress, image_size, false)
36
+ end
37
+ # Clear the line one last time since the progress meter doesn't
38
+ # disappear immediately.
39
+ env[:ui].clear_line
40
+ backing = `qemu-img info "#{@tmp_img}" | grep 'backing file:' | cut -d ':' -f2`.chomp
41
+ if backing
42
+ env[:ui].info('Image has backing image, copying image and rebasing ...')
43
+ `qemu-img rebase -p -b "" #{@tmp_img}`
35
44
  end
36
- env[:ui].info('Image has backing image, copying image and rebasing ...')
37
- FileUtils.cp(root_disk.path, @tmp_img)
38
- `qemu-img rebase -p -b "" #{@tmp_img}`
39
45
  # remove hw association with interface
40
46
  # working for centos with lvs default disks
41
- `virt-sysprep --no-logfile --operations defaults,-ssh-userdir -a #{@tmp_img}`
47
+ options = ENV.fetch('VAGRANT_LIBVIRT_VIRT_SYSPREP_OPTIONS', '')
48
+ operations = ENV.fetch('VAGRANT_LIBVIRT_VIRT_SYSPREP_OPERATIONS', 'defaults,-ssh-userdir')
49
+ `virt-sysprep --no-logfile --operations #{operations} -a #{@tmp_img} #{options}`
42
50
  # add any user provided file
43
51
  extra = ''
44
52
  @tmp_include = @tmp_dir + '/_include'
@@ -99,6 +107,44 @@ module VagrantPlugins
99
107
  }
100
108
  EOF
101
109
  end
110
+
111
+ protected
112
+
113
+ # Fog libvirt currently doesn't support downloading images from storage
114
+ # pool volumes. Use ruby-libvirt client instead.
115
+ def download_image(image_file, pool_name, volume_name, env)
116
+ begin
117
+ pool = env[:machine].provider.driver.connection.client.lookup_storage_pool_by_name(
118
+ pool_name
119
+ )
120
+ volume = pool.lookup_volume_by_name(volume_name)
121
+ image_size = volume.info.allocation # B
122
+
123
+ stream = env[:machine].provider.driver.connection.client.stream
124
+
125
+ # Use length of 0 to download remaining contents after offset
126
+ volume.download(stream, offset = 0, length = 0)
127
+
128
+ buf_size = 1024 * 250 # 250K, copied from upload_image in handle_box_image.rb
129
+ progress = 0
130
+ retval = stream.recv(buf_size)
131
+ open(image_file, 'wb') do |io|
132
+ while (retval.at(0) > 0)
133
+ recvd = io.write(retval.at(1))
134
+ progress += recvd
135
+ yield [progress, image_size]
136
+ retval = stream.recv(buf_size)
137
+ end
138
+ end
139
+ rescue => e
140
+ raise Errors::ImageDownloadError,
141
+ volume_name: volume_name,
142
+ pool_name: pool_name,
143
+ error_message: e.message
144
+ end
145
+
146
+ progress == image_size
147
+ end
102
148
  end
103
149
  end
104
150
  end
@@ -1,12 +1,13 @@
1
1
  require 'nokogiri'
2
2
  require 'socket'
3
3
  require 'timeout'
4
+ require 'vagrant-libvirt/util/nfs'
4
5
 
5
6
  module VagrantPlugins
6
7
  module ProviderLibvirt
7
8
  module Action
8
9
  class PrepareNFSSettings
9
- include Vagrant::Action::Builtin::MixinSyncedFolders
10
+ include VagrantPlugins::ProviderLibvirt::Util::Nfs
10
11
 
11
12
  def initialize(app, _env)
12
13
  @app = app
@@ -28,13 +29,6 @@ module VagrantPlugins
28
29
  end
29
30
  end
30
31
 
31
- # We're using NFS if we have any synced folder with NFS configured. If
32
- # we are not using NFS we don't need to do the extra work to
33
- # populate these fields in the environment.
34
- def using_nfs?
35
- !!synced_folders(@machine)[:nfs]
36
- end
37
-
38
32
  # Returns the IP address of the host
39
33
  #
40
34
  # @param [Machine] machine
@@ -79,7 +73,7 @@ module VagrantPlugins
79
73
  # Check if we can open a connection to the host
80
74
  def ping(host, timeout = 3)
81
75
  ::Timeout.timeout(timeout) do
82
- s = TCPSocket.new(host, 'echo')
76
+ s = TCPSocket.new(host, 'ssh')
83
77
  s.close
84
78
  end
85
79
  true
@@ -1,22 +1,32 @@
1
+ require 'vagrant-libvirt/util/nfs'
1
2
  require 'yaml'
3
+
2
4
  module VagrantPlugins
3
5
  module ProviderLibvirt
4
6
  module Action
5
7
  class PruneNFSExports
8
+ include VagrantPlugins::ProviderLibvirt::Util::Nfs
9
+
6
10
  def initialize(app, _env)
11
+ @logger = Log4r::Logger.new('vagrant_libvirt::action::prune_nfs_exports')
7
12
  @app = app
8
13
  end
9
14
 
10
15
  def call(env)
11
- if env[:host]
12
- uuid = env[:machine].id
13
- # get all uuids
14
- uuids = env[:machine].provider.driver.connection.servers.all.map(&:id)
15
- # not exiisted in array will removed from nfs
16
- uuids.delete(uuid)
17
- env[:host].capability(
18
- :nfs_prune, env[:machine].ui, uuids
19
- )
16
+ @machine = env[:machine]
17
+
18
+ if using_nfs?
19
+ @logger.info('Using NFS, prunning NFS settings from host')
20
+ if env[:host]
21
+ uuid = env[:machine].id
22
+ # get all uuids
23
+ uuids = env[:machine].provider.driver.connection.servers.all.map(&:id)
24
+ # not exiisted in array will removed from nfs
25
+ uuids.delete(uuid)
26
+ env[:host].capability(
27
+ :nfs_prune, env[:machine].ui, uuids
28
+ )
29
+ end
20
30
  end
21
31
 
22
32
  @app.call(env)
@@ -10,8 +10,8 @@ module VagrantPlugins
10
10
  end
11
11
 
12
12
  def call(env)
13
- env[:ui].info('Vagrant-libvirt plugin removed box only from you LOCAL ~/.vagrant/boxes directory')
14
- env[:ui].info('From libvirt storage pool you have to delete image manually(virsh, virt-manager or by any other tool)')
13
+ env[:ui].info('Vagrant-libvirt plugin removed box only from your LOCAL ~/.vagrant/boxes directory')
14
+ env[:ui].info('From Libvirt storage pool you have to delete image manually(virsh, virt-manager or by any other tool)')
15
15
  @app.call(env)
16
16
  end
17
17
  end
@@ -16,13 +16,19 @@ module VagrantPlugins
16
16
 
17
17
  def call(env)
18
18
  # Remove stale server volume
19
- env[:ui].info(I18n.t('vagrant_libvirt.remove_stale_volume'))
20
-
21
19
  config = env[:machine].provider_config
22
20
  # Check for storage pool, where box image should be created
23
- fog_pool = ProviderLibvirt::Util::Collection.find_matching(
24
- env[:machine].provider.driver.connection.pools.all, config.storage_pool_name
25
- )
21
+ fog_pool = env[:machine].provider.driver.connection.pools.all(
22
+ name: config.storage_pool_name
23
+ ).first
24
+
25
+ env[:result] = nil
26
+
27
+ if not fog_pool
28
+ @logger.debug("**** Pool #{config.storage_pool_name} not found")
29
+ return @app.call(env)
30
+ end
31
+
26
32
  @logger.debug("**** Pool #{fog_pool.name}")
27
33
 
28
34
  # This is name of newly created image for vm.
@@ -30,17 +36,17 @@ module VagrantPlugins
30
36
  @logger.debug("**** Volume name #{name}")
31
37
 
32
38
  # remove root storage
33
- box_volume = ProviderLibvirt::Util::Collection.find_matching(
34
- env[:machine].provider.driver.connection.volumes.all, name
35
- )
36
- if box_volume && box_volume.pool_name == fog_pool.name
39
+ box_volume = env[:machine].provider.driver.connection.volumes.all(
40
+ name: name
41
+ ).find { |x| x.pool_name == fog_pool.name }
42
+ if box_volume && box_volume.id
43
+ env[:ui].info(I18n.t('vagrant_libvirt.remove_stale_volume'))
37
44
  @logger.info("Deleting volume #{box_volume.key}")
38
45
  box_volume.destroy
39
46
  env[:result] = box_volume
40
47
  else
41
- env[:result] = nil
48
+ @logger.debug("**** Volume #{name} not found in pool #{fog_pool.name}")
42
49
  end
43
-
44
50
  # Continue the middleware chain.
45
51
  @app.call(env)
46
52
  end
@@ -33,7 +33,7 @@ module VagrantPlugins
33
33
  if @boot_order.count >= 1
34
34
 
35
35
  # If a domain is initially defined with no box or disk or
36
- # with an explicit boot order, libvirt adds <boot dev="foo">
36
+ # with an explicit boot order, Libvirt adds <boot dev="foo">
37
37
  # This conflicts with an explicit boot_order configuration,
38
38
  # so we need to remove it from the domain xml and feed it back.
39
39
  # Also see https://bugzilla.redhat.com/show_bug.cgi?id=1248514
@@ -66,7 +66,7 @@ module VagrantPlugins
66
66
  logger_msg(node, index)
67
67
  end
68
68
 
69
- # Finally redefine the domain XML through libvirt
69
+ # Finally redefine the domain XML through Libvirt
70
70
  # to apply the boot ordering
71
71
  env[:machine].provider
72
72
  .driver
@@ -13,20 +13,17 @@ module VagrantPlugins
13
13
  env[:domain_name] = build_domain_name(env)
14
14
 
15
15
  begin
16
- @logger.info("Looking for domain #{env[:domain_name]} through list " \
17
- "#{env[:machine].provider.driver.connection.servers.all}")
16
+ @logger.info("Looking for domain #{env[:domain_name]}")
18
17
  # Check if the domain name is not already taken
19
18
 
20
- domain = ProviderLibvirt::Util::Collection.find_matching(
21
- env[:machine].provider.driver.connection.servers.all, env[:domain_name]
19
+ domain = env[:machine].provider.driver.connection.servers.all(
20
+ name: env[:domain_name]
22
21
  )
23
- rescue Fog::Errors::Error => e
22
+ rescue Libvirt::RetrieveError => e
24
23
  @logger.info(e.to_s)
25
24
  domain = nil
26
25
  end
27
26
 
28
- @logger.info("Looking for domain #{env[:domain_name]}")
29
-
30
27
  unless domain.nil?
31
28
  raise ProviderLibvirt::Errors::DomainNameExists,
32
29
  domain_name: env[:domain_name]
@@ -41,7 +38,7 @@ module VagrantPlugins
41
38
  # parsable and sortable by epoch time
42
39
  # @example
43
40
  # development-centos-6-chef-11_1404488971_3b7a569e2fd7c554b852
44
- # @return [String] libvirt domain name
41
+ # @return [String] Libvirt domain name
45
42
  def build_domain_name(env)
46
43
  config = env[:machine].provider_config
47
44
  domain_name =
@@ -51,7 +48,7 @@ module VagrantPlugins
51
48
  # don't have any prefix, not even "_"
52
49
  ''
53
50
  else
54
- config.default_prefix.to_s.dup.concat('_')
51
+ config.default_prefix.to_s.dup
55
52
  end
56
53
  domain_name << env[:machine].name.to_s
57
54
  domain_name.gsub!(/[^-a-z0-9_\.]/i, '')
@@ -23,7 +23,7 @@ module VagrantPlugins
23
23
 
24
24
  libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
25
25
 
26
- # libvirt API doesn't support modifying memory on NUMA enabled CPUs
26
+ # Libvirt API doesn't support modifying memory on NUMA enabled CPUs
27
27
  # http://libvirt.org/git/?p=libvirt.git;a=commit;h=d174394105cf00ed266bf729ddf461c21637c736
28
28
  if config.numa_nodes == nil
29
29
  if config.memory.to_i * 1024 != libvirt_domain.max_memory
@@ -68,7 +68,7 @@ module VagrantPlugins
68
68
  end
69
69
 
70
70
  # vCpu count
71
- if config.cpus.to_i != libvirt_domain.vcpus.length
71
+ if config.cpus.to_i != libvirt_domain.num_vcpus(0)
72
72
  descr_changed = true
73
73
  REXML::XPath.first(xml_descr, '/domain/vcpu').text = config.cpus
74
74
  end
@@ -28,25 +28,42 @@ module VagrantPlugins
28
28
  end
29
29
 
30
30
  # Wait for domain to obtain an ip address. Ip address is searched
31
- # from arp table, either localy or remotely via ssh, if libvirt
31
+ # from arp table, either locally or remotely via ssh, if Libvirt
32
32
  # connection was done via ssh.
33
33
  env[:ip_address] = nil
34
- env[:metrics]['instance_ip_time'] = Util::Timer.time do
35
- @logger.debug("Searching for IP for MAC address: #{domain.mac}")
36
- env[:ui].info(I18n.t('vagrant_libvirt.waiting_for_ip'))
37
- retryable(on: Fog::Errors::TimeoutError, tries: 300) do
38
- # If we're interrupted don't worry about waiting
39
- return terminate(env) if env[:interrupted]
34
+ @logger.debug("Searching for IP for MAC address: #{domain.mac}")
35
+ env[:ui].info(I18n.t('vagrant_libvirt.waiting_for_ip'))
36
+
37
+ if env[:machine].provider_config.qemu_use_session
38
+ env[:metrics]['instance_ip_time'] = Util::Timer.time do
39
+ retryable(on: Fog::Errors::TimeoutError, tries: 300) do
40
+ # just return if interrupted and let the warden call recover
41
+ return if env[:interrupted]
42
+
43
+ # Wait for domain to obtain an ip address
44
+ domain.wait_for(2) do
45
+ env[:ip_address] = env[:machine].provider.driver.get_ipaddress_system(domain.mac)
46
+ !env[:ip_address].nil?
47
+ end
48
+ end
49
+ end
50
+ else
51
+ env[:metrics]['instance_ip_time'] = Util::Timer.time do
52
+ retryable(on: Fog::Errors::TimeoutError, tries: 300) do
53
+ # just return if interrupted and let the warden call recover
54
+ return if env[:interrupted]
40
55
 
41
- # Wait for domain to obtain an ip address
42
- domain.wait_for(2) do
43
- addresses.each_pair do |_type, ip|
44
- env[:ip_address] = ip[0] unless ip[0].nil?
56
+ # Wait for domain to obtain an ip address
57
+ domain.wait_for(2) do
58
+ addresses.each_pair do |_type, ip|
59
+ env[:ip_address] = ip[0] unless ip[0].nil?
60
+ end
61
+ !env[:ip_address].nil?
45
62
  end
46
- !env[:ip_address].nil?
47
63
  end
48
64
  end
49
65
  end
66
+
50
67
  @logger.info("Got IP address #{env[:ip_address]}")
51
68
  @logger.info("Time for getting IP: #{env[:metrics]['instance_ip_time']}")
52
69
 
@@ -67,8 +84,8 @@ module VagrantPlugins
67
84
  end
68
85
  end
69
86
  end
70
- # if interrupted above, just terminate immediately
71
- return terminate(env) if env[:interrupted]
87
+ # just return if interrupted and let the warden call recover
88
+ return if env[:interrupted]
72
89
  @logger.info("Time for SSH ready: #{env[:metrics]['instance_ssh_time']}")
73
90
 
74
91
  # Booted and ready for use.
@@ -78,8 +95,6 @@ module VagrantPlugins
78
95
  end
79
96
 
80
97
  def recover(env)
81
- return if env['vagrant.error'].is_a?(Vagrant::Errors::VagrantError)
82
-
83
98
  # Undo the import
84
99
  terminate(env)
85
100
  end