vagrant-libvirt 0.6.3 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -13
  3. data/lib/vagrant-libvirt/action/cleanup_on_failure.rb +76 -0
  4. data/lib/vagrant-libvirt/action/create_domain.rb +56 -10
  5. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +5 -1
  6. data/lib/vagrant-libvirt/action/create_networks.rb +24 -0
  7. data/lib/vagrant-libvirt/action/destroy_domain.rb +106 -21
  8. data/lib/vagrant-libvirt/action/destroy_networks.rb +1 -1
  9. data/lib/vagrant-libvirt/action/forward_ports.rb +12 -11
  10. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +1 -1
  11. data/lib/vagrant-libvirt/action/start_domain.rb +36 -0
  12. data/lib/vagrant-libvirt/action/wait_till_up.rb +6 -32
  13. data/lib/vagrant-libvirt/action.rb +72 -83
  14. data/lib/vagrant-libvirt/config.rb +85 -30
  15. data/lib/vagrant-libvirt/driver.rb +11 -9
  16. data/lib/vagrant-libvirt/errors.rb +12 -0
  17. data/lib/vagrant-libvirt/templates/domain.xml.erb +228 -218
  18. data/lib/vagrant-libvirt/templates/private_network.xml.erb +4 -1
  19. data/lib/vagrant-libvirt/util/network_util.rb +15 -3
  20. data/lib/vagrant-libvirt/util/nfs.rb +2 -0
  21. data/lib/vagrant-libvirt/util/resolvers.rb +80 -0
  22. data/lib/vagrant-libvirt/version +1 -1
  23. data/locales/en.yml +17 -0
  24. data/spec/spec_helper.rb +36 -23
  25. data/spec/support/libvirt_context.rb +7 -4
  26. data/spec/support/sharedcontext.rb +1 -1
  27. data/spec/unit/action/cleanup_on_failure_spec.rb +131 -0
  28. data/spec/unit/action/create_domain_spec/additional_disks_domain.xml +6 -18
  29. data/spec/unit/action/create_domain_spec/custom_disk_settings.xml +43 -0
  30. data/spec/unit/action/create_domain_spec/default_domain.xml +6 -18
  31. data/spec/unit/action/create_domain_spec/two_disk_settings.xml +49 -0
  32. data/spec/unit/action/create_domain_spec.rb +51 -7
  33. data/spec/unit/action/create_domain_volume_spec.rb +5 -3
  34. data/spec/unit/action/destroy_domain_spec/additional_disks_domain.xml +47 -0
  35. data/spec/unit/action/destroy_domain_spec/box_multiple_disks.xml +55 -0
  36. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks.xml +72 -0
  37. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks_no_aliases.xml +67 -0
  38. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_disks.xml +67 -0
  39. data/spec/unit/action/destroy_domain_spec/cdrom_domain.xml +48 -0
  40. data/spec/unit/action/destroy_domain_spec.rb +134 -30
  41. data/spec/unit/action/forward_ports_spec.rb +10 -2
  42. data/spec/unit/action/prepare_nfs_settings_spec.rb +59 -0
  43. data/spec/unit/action/shutdown_domain_spec.rb +1 -1
  44. data/spec/unit/action/start_domain_spec/clock_timer_rtc.xml +6 -18
  45. data/spec/unit/action/start_domain_spec/default.xml +6 -18
  46. data/spec/unit/action/start_domain_spec/default_added_tpm_path.xml +6 -18
  47. data/spec/unit/action/start_domain_spec/default_added_tpm_version.xml +6 -18
  48. data/spec/unit/action/start_domain_spec/existing.xml +1 -1
  49. data/spec/unit/action/wait_till_up_spec.rb +4 -43
  50. data/spec/unit/action_spec.rb +2 -0
  51. data/spec/unit/config_spec.rb +133 -26
  52. data/spec/unit/driver_spec.rb +154 -10
  53. data/spec/unit/templates/domain_all_settings.xml +56 -77
  54. data/spec/unit/templates/domain_cpu_mode_passthrough.xml +39 -0
  55. data/spec/unit/templates/domain_custom_cpu_model.xml +6 -18
  56. data/spec/unit/templates/domain_defaults.xml +6 -18
  57. data/spec/unit/templates/domain_spec.rb +39 -13
  58. data/spec/unit/templates/tpm/version_1.2.xml +6 -18
  59. data/spec/unit/templates/tpm/version_2.0.xml +6 -18
  60. data/spec/unit/util/resolvers_spec.rb +116 -0
  61. metadata +40 -41
@@ -47,7 +47,7 @@ module VagrantPlugins
47
47
  )
48
48
  rescue Libvirt::RetrieveError => e
49
49
  # this network is already destroyed, so move on
50
- if e.message =~ /Network not found/
50
+ if e.libvirt_code == ProviderLibvirt::Util::ErrorCodes::VIR_ERR_NO_NETWORK
51
51
  @logger.info 'It is already undefined'
52
52
  next
53
53
  # some other error occured, so raise it again
@@ -87,12 +87,13 @@ module VagrantPlugins
87
87
  gateway_ports)
88
88
  ssh_info = machine.ssh_info
89
89
  params = %W(
90
+ -n
90
91
  -L
91
92
  #{host_ip}:#{host_port}:#{guest_ip}:#{guest_port}
92
93
  -N
93
94
  #{ssh_info[:host]}
94
- ).join(' ')
95
- params += ' -g' if gateway_ports
95
+ )
96
+ params += '-g' if gateway_ports
96
97
 
97
98
  options = (%W(
98
99
  User=#{ssh_info[:username]}
@@ -105,32 +106,32 @@ module VagrantPlugins
105
106
  ForwardX11=#{ssh_info[:forward_x11] ? 'yes' : 'no'}
106
107
  IdentitiesOnly=#{ssh_info[:keys_only] ? 'yes' : 'no'}
107
108
  ) + ssh_info[:private_key_path].map do |pk|
108
- "IdentityFile='\"#{pk}\"'"
109
- end).map { |s| "-o #{s}" }.join(' ')
109
+ "IdentityFile=\"#{pk}\""
110
+ end
111
+ ).map { |s| ['-o', s] }.flatten
110
112
 
111
- options += " -o ProxyCommand=\"#{ssh_info[:proxy_command]}\"" if machine.provider_config.proxy_command
113
+ options += ['-o', "ProxyCommand=\"#{ssh_info[:proxy_command]}\""] if machine.provider_config.proxy_command
114
+
115
+ ssh_cmd = ['ssh'] + options + params
112
116
 
113
117
  # TODO: instead of this, try and lock and get the stdin from spawn...
114
- ssh_cmd = ''
115
118
  if host_port <= 1024
116
119
  @@lock.synchronize do
117
120
  # TODO: add i18n
118
121
  env[:ui].info 'Requesting sudo for host port(s) <= 1024'
119
122
  r = system('sudo -v')
120
123
  if r
121
- ssh_cmd += 'sudo ' # add sudo prefix
124
+ ssh_cmd.unshift('sudo') # add sudo prefix
122
125
  end
123
126
  end
124
127
  end
125
128
 
126
- ssh_cmd += "ssh -n #{options} #{params}"
127
-
128
- @logger.debug "Forwarding port with `#{ssh_cmd}`"
129
+ @logger.debug "Forwarding port with `#{ssh_cmd.join(' ')}`"
129
130
  log_file = ssh_forward_log_file(
130
131
  env[:machine], host_ip, host_port, guest_ip, guest_port,
131
132
  )
132
133
  @logger.info "Logging to #{log_file}"
133
- spawn(ssh_cmd, [:out, :err] => [log_file, 'w'], :pgroup => true)
134
+ spawn(*ssh_cmd, [:out, :err] => [log_file, 'w'], :pgroup => true)
134
135
  end
135
136
 
136
137
  def ssh_forward_log_file(machine, host_ip, host_port, guest_ip, guest_port)
@@ -59,7 +59,7 @@ module VagrantPlugins
59
59
  command = "ip=$(which ip); ${ip:-/sbin/ip} addr show | grep -i 'inet ' | grep -v '127.0.0.1' | tr -s ' ' | cut -d' ' -f3 | cut -d'/' -f 1"
60
60
  result = ''
61
61
  machine.communicate.execute(command) do |type, data|
62
- result << data if type == :stdout
62
+ result += data if type == :stdout
63
63
  end
64
64
 
65
65
  ips = result.chomp.split("\n").uniq
@@ -222,6 +222,24 @@ module VagrantPlugins
222
222
  graphics.attributes['passwd'] = config.graphics_passwd
223
223
  end
224
224
  end
225
+ graphics_gl = REXML::XPath.first(xml_descr, '/domain/devices/graphics/gl')
226
+ if graphics_gl.nil?
227
+ if config.graphics_gl
228
+ graphics_gl = REXML::Element.new('gl', REXML::XPath.first(xml_descr, '/domain/devices/graphics'))
229
+ graphics_gl.attributes['enable'] = 'yes'
230
+ descr_changed = true
231
+ end
232
+ else
233
+ if config.graphics_gl
234
+ if graphics_gl.attributes['enable'] != 'yes'
235
+ graphics_gl.attributes['enable'] = 'yes'
236
+ descr_changed = true
237
+ end
238
+ else
239
+ graphics_gl.parent.delete_element(graphics_gl)
240
+ descr_changed = true
241
+ end
242
+ end
225
243
  else
226
244
  # graphics_type = none, remove entire element
227
245
  graphics.parent.delete_element(graphics) unless graphics.nil?
@@ -280,6 +298,24 @@ module VagrantPlugins
280
298
  video_model.attributes['vram'] = config.video_vram
281
299
  end
282
300
  end
301
+ video_accel = REXML::XPath.first(xml_descr, '/domain/devices/video/model/acceleration')
302
+ if video_accel.nil?
303
+ if config.video_accel3d
304
+ video_accel = REXML::Element.new('acceleration', REXML::XPath.first(xml_descr, '/domain/devices/video/model'))
305
+ video_accel.attributes['accel3d'] = 'yes'
306
+ descr_changed = true
307
+ end
308
+ else
309
+ if config.video_accel3d
310
+ if video_accel.attributes['accel3d'] != 'yes'
311
+ video_accel.attributes['accel3d'] = 'yes'
312
+ descr_changed = true
313
+ end
314
+ else
315
+ video_accel.parent.delete_element(video_accel)
316
+ descr_changed = true
317
+ end
318
+ end
283
319
  end
284
320
 
285
321
  # Sound device
@@ -22,60 +22,34 @@ module VagrantPlugins
22
22
  # Initialize metrics if they haven't been
23
23
  env[:metrics] ||= {}
24
24
 
25
- # Get domain object
26
- domain = env[:machine].provider.driver.get_domain(env[:machine])
25
+ driver = env[:machine].provider.driver
26
+ domain = driver.get_domain(env[:machine])
27
+
27
28
  if domain.nil?
28
29
  raise Errors::NoDomainError,
29
30
  error_message: "Domain #{env[:machine].id} not found"
30
31
  end
31
32
 
32
- # Wait for domain to obtain an ip address. Ip address is searched
33
- # from arp table, either locally or remotely via ssh, if Libvirt
34
- # connection was done via ssh.
35
33
  env[:ip_address] = nil
36
34
  @logger.debug("Searching for IP for MAC address: #{domain.mac}")
37
35
  env[:ui].info(I18n.t('vagrant_libvirt.waiting_for_ip'))
38
36
 
37
+ # Wait for domain to obtain an ip address. Ip address is searched
38
+ # from dhcp leases table via libvirt, or via qemu agent if enabled.
39
39
  env[:metrics]['instance_ip_time'] = Util::Timer.time do
40
40
  retryable(on: Fog::Errors::TimeoutError, tries: 300) do
41
41
  # just return if interrupted and let the warden call recover
42
42
  return if env[:interrupted]
43
43
 
44
44
  # Wait for domain to obtain an ip address
45
- env[:ip_address] = env[:machine].provider.driver.get_domain_ipaddress(env[:machine], domain)
45
+ env[:ip_address] = driver.get_domain_ipaddress(env[:machine], domain)
46
46
  end
47
47
  end
48
-
49
48
  @logger.info("Got IP address #{env[:ip_address]}")
50
49
  @logger.info("Time for getting IP: #{env[:metrics]['instance_ip_time']}")
51
50
 
52
51
  @app.call(env)
53
52
  end
54
-
55
- def recover(env)
56
- # Undo the import
57
- terminate(env)
58
- end
59
-
60
- def terminate(env)
61
- if env[:machine].state.id != :not_created
62
- # If we're not supposed to destroy on error then just return
63
- return unless env[:destroy_on_error]
64
-
65
- if env[:halt_on_error]
66
- halt_env = env.dup
67
- halt_env.delete(:interrupted)
68
- halt_env[:config_validate] = false
69
- env[:action_runner].run(Action.action_halt, halt_env)
70
- else
71
- destroy_env = env.dup
72
- destroy_env.delete(:interrupted)
73
- destroy_env[:config_validate] = false
74
- destroy_env[:force_confirm_destroy] = true
75
- env[:action_runner].run(Action.action_destroy, destroy_env)
76
- end
77
- end
78
- end
79
53
  end
80
54
  end
81
55
  end
@@ -6,6 +6,58 @@ require 'log4r'
6
6
  module VagrantPlugins
7
7
  module ProviderLibvirt
8
8
  module Action
9
+ action_root = Pathname.new(File.expand_path('../action', __FILE__))
10
+ autoload :CleanupOnFailure, action_root.join('cleanup_on_failure')
11
+ autoload :ClearForwardedPorts, action_root.join('forward_ports')
12
+ autoload :CreateDomain, action_root.join('create_domain')
13
+ autoload :CreateDomainVolume, action_root.join('create_domain_volume')
14
+ autoload :CreateNetworkInterfaces, action_root.join('create_network_interfaces')
15
+ autoload :CreateNetworks, action_root.join('create_networks')
16
+ autoload :CleanMachineFolder, action_root.join('clean_machine_folder')
17
+ autoload :DestroyDomain, action_root.join('destroy_domain')
18
+ autoload :DestroyNetworks, action_root.join('destroy_networks')
19
+ autoload :ForwardPorts, action_root.join('forward_ports')
20
+ autoload :HaltDomain, action_root.join('halt_domain')
21
+ autoload :HandleBoxImage, action_root.join('handle_box_image')
22
+ autoload :HandleStoragePool, action_root.join('handle_storage_pool')
23
+ autoload :IsCreated, action_root.join('is_created')
24
+ autoload :IsRunning, action_root.join('is_running')
25
+ autoload :IsSuspended, action_root.join('is_suspended')
26
+ autoload :MessageAlreadyCreated, action_root.join('message_already_created')
27
+ autoload :MessageNotCreated, action_root.join('message_not_created')
28
+ autoload :MessageNotRunning, action_root.join('message_not_running')
29
+ autoload :MessageNotSuspended, action_root.join('message_not_suspended')
30
+ autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
31
+ autoload :PackageDomain, action_root.join('package_domain')
32
+ autoload :PrepareNFSSettings, action_root.join('prepare_nfs_settings')
33
+ autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
34
+ autoload :PruneNFSExports, action_root.join('prune_nfs_exports')
35
+ autoload :ReadMacAddresses, action_root.join('read_mac_addresses')
36
+ autoload :RemoveLibvirtImage, action_root.join('remove_libvirt_image')
37
+ autoload :RemoveStaleVolume, action_root.join('remove_stale_volume')
38
+ autoload :ResumeDomain, action_root.join('resume_domain')
39
+ autoload :SetNameOfDomain, action_root.join('set_name_of_domain')
40
+ autoload :SetBootOrder, action_root.join('set_boot_order')
41
+ autoload :SetupComplete, action_root.join('cleanup_on_failure')
42
+ # I don't think we need it anymore
43
+ autoload :ShareFolders, action_root.join('share_folders')
44
+ autoload :ShutdownDomain, action_root.join('shutdown_domain')
45
+ autoload :StartDomain, action_root.join('start_domain')
46
+ autoload :StartShutdownTimer, action_root.join('shutdown_domain')
47
+ autoload :SuspendDomain, action_root.join('suspend_domain')
48
+ autoload :TimedProvision, action_root.join('timed_provision')
49
+ autoload :WaitTillUp, action_root.join('wait_till_up')
50
+
51
+ autoload :HandleBox, 'vagrant/action/builtin/handle_box'
52
+ autoload :Package, 'vagrant/action/general/package'
53
+ autoload :PackageSetupFiles, 'vagrant/action/general/package_setup_files'
54
+ autoload :PackageSetupFolders, 'vagrant/action/general/package_setup_folders'
55
+ autoload :ProvisionerCleanup, 'vagrant/action/builtin/provisioner_cleanup'
56
+ autoload :SSHRun, 'vagrant/action/builtin/ssh_run'
57
+ autoload :SyncedFolderCleanup, 'vagrant/action/builtin/synced_folder_cleanup'
58
+ autoload :SyncedFolders, 'vagrant/action/builtin/synced_folders'
59
+ autoload :WaitForCommunicator, 'vagrant/action/builtin/wait_for_communicator'
60
+
9
61
  # Include the built-in & general modules so we can use them as top-level things.
10
62
  include Vagrant::Action::Builtin
11
63
  include Vagrant::Action::General
@@ -24,44 +76,42 @@ module VagrantPlugins
24
76
  b.use ConfigValidate
25
77
  b.use BoxCheckOutdated
26
78
  b.use Call, IsCreated do |env, b2|
79
+ b2.use CleanupOnFailure
80
+ b2.use Provision
81
+
27
82
  # Create VM if not yet created.
28
83
  if !env[:result]
29
84
  b2.use SetNameOfDomain
85
+
30
86
  if !env[:machine].config.vm.box
31
87
  b2.use CreateDomain
32
88
  b2.use CreateNetworks
33
89
  b2.use CreateNetworkInterfaces
34
- b2.use SetBootOrder
35
- b2.use StartDomain
90
+
91
+ b2.use action_start
92
+
93
+ b2.use SetupComplete
36
94
  else
37
95
  b2.use HandleStoragePool
38
96
  b2.use HandleBox
39
97
  b2.use HandleBoxImage
40
98
  b2.use CreateDomainVolume
41
99
  b2.use CreateDomain
42
-
43
- b2.use Provision
44
- b2.use PrepareNFSValidIds
45
- b2.use SyncedFolderCleanup
46
- b2.use SyncedFolders
47
- b2.use PrepareNFSSettings
48
- b2.use ShareFolders
49
100
  b2.use CreateNetworks
50
101
  b2.use CreateNetworkInterfaces
51
- b2.use SetBootOrder
52
102
 
53
- b2.use StartDomain
54
- b2.use WaitTillUp
55
- b2.use WaitForCommunicator, [:running]
103
+ b2.use action_start
56
104
 
57
- b2.use ForwardPorts
58
105
  b2.use SetHostname
59
- # b2.use SyncFolders
60
106
  end
61
107
  else
62
108
  env[:halt_on_error] = true
109
+ b2.use CreateNetworks
63
110
  b2.use action_start
64
111
  end
112
+
113
+ # corresponding action to CleanupOnFailure
114
+ b2.use SetupComplete
65
115
  end
66
116
  end
67
117
  end
@@ -69,7 +119,7 @@ module VagrantPlugins
69
119
  # Assuming VM is created, just start it. This action is not called
70
120
  # directly by any subcommand. VM can be suspended, already running or in
71
121
  # poweroff state.
72
- def self.action_start
122
+ private_class_method def self.action_start
73
123
  Vagrant::Action::Builder.new.tap do |b|
74
124
  b.use ConfigValidate
75
125
  b.use Call, IsRunning do |env, b2|
@@ -82,28 +132,23 @@ module VagrantPlugins
82
132
  b2.use Call, IsSuspended do |env2, b3|
83
133
  # if vm is suspended resume it then exit
84
134
  if env2[:result]
85
- b3.use CreateNetworks
86
135
  b3.use ResumeDomain
87
136
  next
88
137
  end
89
138
 
90
139
  if !env[:machine].config.vm.box
91
140
  # With no box, we just care about network creation and starting it
92
- b3.use CreateNetworks
93
141
  b3.use SetBootOrder
94
142
  b3.use StartDomain
95
143
  else
96
144
  # VM is not running or suspended.
97
-
98
- b3.use Provision
99
-
100
- # Ensure networks are created and active
101
- b3.use CreateNetworks
102
- b3.use SetBootOrder
103
-
104
145
  b3.use PrepareNFSValidIds
105
146
  b3.use SyncedFolderCleanup
106
147
  b3.use SyncedFolders
148
+ b3.use PrepareNFSSettings
149
+ b3.use ShareFolders
150
+
151
+ b3.use SetBootOrder
107
152
 
108
153
  # Start it..
109
154
  b3.use StartDomain
@@ -114,8 +159,6 @@ module VagrantPlugins
114
159
  b3.use WaitForCommunicator, [:running]
115
160
 
116
161
  b3.use ForwardPorts
117
- b3.use PrepareNFSSettings
118
- b3.use ShareFolders
119
162
  end
120
163
  end
121
164
  end
@@ -264,7 +307,6 @@ module VagrantPlugins
264
307
  end
265
308
 
266
309
  b3.use Provision
267
- # b3.use SyncFolders
268
310
  end
269
311
  end
270
312
  end
@@ -310,6 +352,8 @@ module VagrantPlugins
310
352
  end
311
353
  b3.use CreateNetworks
312
354
  b3.use ResumeDomain
355
+ b3.use Provision
356
+ b3.use WaitForCommunicator, [:running]
313
357
  end
314
358
  end
315
359
  end
@@ -342,61 +386,6 @@ module VagrantPlugins
342
386
  end
343
387
  end
344
388
 
345
- action_root = Pathname.new(File.expand_path('../action', __FILE__))
346
- autoload :PackageDomain, action_root.join('package_domain')
347
- autoload :CreateDomain, action_root.join('create_domain')
348
- autoload :CreateDomainVolume, action_root.join('create_domain_volume')
349
- autoload :CreateNetworkInterfaces, action_root.join('create_network_interfaces')
350
- autoload :CreateNetworks, action_root.join('create_networks')
351
- autoload :CleanMachineFolder, action_root.join('clean_machine_folder')
352
- autoload :DestroyDomain, action_root.join('destroy_domain')
353
- autoload :DestroyNetworks, action_root.join('destroy_networks')
354
- autoload :ForwardPorts, action_root.join('forward_ports')
355
- autoload :ClearForwardedPorts, action_root.join('forward_ports')
356
- autoload :HaltDomain, action_root.join('halt_domain')
357
- autoload :StartShutdownTimer, action_root.join('shutdown_domain')
358
- autoload :ShutdownDomain, action_root.join('shutdown_domain')
359
- autoload :HandleBoxImage, action_root.join('handle_box_image')
360
- autoload :HandleStoragePool, action_root.join('handle_storage_pool')
361
- autoload :RemoveLibvirtImage, action_root.join('remove_libvirt_image')
362
- autoload :IsCreated, action_root.join('is_created')
363
- autoload :IsRunning, action_root.join('is_running')
364
- autoload :IsSuspended, action_root.join('is_suspended')
365
- autoload :MessageAlreadyCreated, action_root.join('message_already_created')
366
- autoload :MessageNotCreated, action_root.join('message_not_created')
367
- autoload :MessageNotRunning, action_root.join('message_not_running')
368
- autoload :MessageNotSuspended, action_root.join('message_not_suspended')
369
- autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
370
-
371
- autoload :RemoveStaleVolume, action_root.join('remove_stale_volume')
372
-
373
- autoload :PrepareNFSSettings, action_root.join('prepare_nfs_settings')
374
- autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
375
- autoload :PruneNFSExports, action_root.join('prune_nfs_exports')
376
-
377
- autoload :ReadMacAddresses, action_root.join('read_mac_addresses')
378
- autoload :ResumeDomain, action_root.join('resume_domain')
379
- autoload :SetNameOfDomain, action_root.join('set_name_of_domain')
380
- autoload :SetBootOrder, action_root.join('set_boot_order')
381
-
382
- # I don't think we need it anymore
383
- autoload :ShareFolders, action_root.join('share_folders')
384
- autoload :StartDomain, action_root.join('start_domain')
385
- autoload :SuspendDomain, action_root.join('suspend_domain')
386
- autoload :TimedProvision, action_root.join('timed_provision')
387
-
388
- autoload :WaitTillUp, action_root.join('wait_till_up')
389
- autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
390
-
391
- autoload :Package, 'vagrant/action/general/package'
392
- autoload :PackageSetupFiles, 'vagrant/action/general/package_setup_files'
393
- autoload :PackageSetupFolders, 'vagrant/action/general/package_setup_folders'
394
- autoload :SSHRun, 'vagrant/action/builtin/ssh_run'
395
- autoload :HandleBox, 'vagrant/action/builtin/handle_box'
396
- autoload :SyncedFolders, 'vagrant/action/builtin/synced_folders'
397
- autoload :SyncedFolderCleanup, 'vagrant/action/builtin/synced_folder_cleanup'
398
- autoload :ProvisionerCleanup, 'vagrant/action/builtin/provisioner_cleanup'
399
- autoload :WaitForCommunicator, 'vagrant/action/builtin/wait_for_communicator'
400
389
  end
401
390
  end
402
391
  end