vagrant-unbundled 2.2.9.0 → 2.2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -0
  3. data/README.md +5 -5
  4. data/contrib/README.md +1 -0
  5. data/contrib/sudoers/linux-suse +2 -2
  6. data/contrib/zsh/_vagrant +736 -0
  7. data/contrib/zsh/generate_zsh_completion.rb +166 -0
  8. data/lib/vagrant/action.rb +3 -0
  9. data/lib/vagrant/action/builder.rb +52 -18
  10. data/lib/vagrant/action/builtin/box_add.rb +6 -5
  11. data/lib/vagrant/action/builtin/cloud_init_setup.rb +127 -0
  12. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  13. data/lib/vagrant/action/builtin/handle_box.rb +1 -1
  14. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +13 -13
  15. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  16. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  17. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  18. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  19. data/lib/vagrant/action/builtin/synced_folders.rb +10 -0
  20. data/lib/vagrant/action/builtin/trigger.rb +3 -2
  21. data/lib/vagrant/action/hook.rb +59 -24
  22. data/lib/vagrant/action/warden.rb +25 -5
  23. data/lib/vagrant/box.rb +5 -4
  24. data/lib/vagrant/bundler.rb +6 -1
  25. data/lib/vagrant/errors.rb +37 -1
  26. data/lib/vagrant/machine.rb +47 -0
  27. data/lib/vagrant/machine_index.rb +27 -1
  28. data/lib/vagrant/plugin/v2/command.rb +5 -1
  29. data/lib/vagrant/plugin/v2/components.rb +6 -0
  30. data/lib/vagrant/plugin/v2/manager.rb +14 -0
  31. data/lib/vagrant/plugin/v2/plugin.rb +12 -0
  32. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  33. data/lib/vagrant/plugin/v2/trigger.rb +6 -5
  34. data/lib/vagrant/ui.rb +1 -1
  35. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  36. data/lib/vagrant/util/caps.rb +48 -0
  37. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  38. data/lib/vagrant/util/directory.rb +19 -0
  39. data/lib/vagrant/util/downloader.rb +3 -3
  40. data/lib/vagrant/util/guest_hosts.rb +68 -0
  41. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  42. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  43. data/lib/vagrant/util/is_port_open.rb +8 -19
  44. data/lib/vagrant/util/network_ip.rb +11 -1
  45. data/lib/vagrant/util/powershell.rb +1 -1
  46. data/lib/vagrant/util/subprocess.rb +9 -1
  47. data/lib/vagrant/vagrantfile.rb +1 -1
  48. data/plugins/commands/autocomplete/command/install.rb +49 -0
  49. data/plugins/commands/autocomplete/command/root.rb +64 -0
  50. data/plugins/commands/autocomplete/plugin.rb +18 -0
  51. data/plugins/commands/destroy/command.rb +6 -2
  52. data/plugins/communicators/ssh/communicator.rb +7 -1
  53. data/plugins/communicators/winrm/helper.rb +1 -1
  54. data/plugins/communicators/winssh/communicator.rb +1 -1
  55. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  56. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  57. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  58. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  59. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  60. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  61. data/plugins/guests/debian/cap/change_host_name.rb +11 -11
  62. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  63. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  64. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  65. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  66. data/plugins/guests/haiku/plugin.rb +15 -0
  67. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  68. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +4 -11
  69. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +62 -0
  70. data/plugins/guests/linux/plugin.rb +10 -0
  71. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  72. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  73. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  74. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  75. data/plugins/guests/redhat/cap/change_host_name.rb +10 -5
  76. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  77. data/plugins/guests/solaris11/plugin.rb +5 -0
  78. data/plugins/guests/suse/cap/change_host_name.rb +12 -11
  79. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  80. data/plugins/hosts/darwin/plugin.rb +10 -0
  81. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  82. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  83. data/plugins/hosts/linux/plugin.rb +10 -0
  84. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  85. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  86. data/plugins/hosts/windows/plugin.rb +15 -0
  87. data/plugins/kernel_v2/config/cloud_init.rb +126 -0
  88. data/plugins/kernel_v2/config/disk.rb +40 -18
  89. data/plugins/kernel_v2/config/vm.rb +122 -13
  90. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  91. data/plugins/kernel_v2/config/vm_trigger.rb +5 -1
  92. data/plugins/providers/docker/action.rb +8 -17
  93. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  94. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  95. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  96. data/plugins/providers/docker/communicator.rb +1 -1
  97. data/plugins/providers/docker/driver.rb +35 -0
  98. data/plugins/providers/docker/plugin.rb +5 -0
  99. data/plugins/providers/hyperv/action.rb +2 -0
  100. data/plugins/providers/hyperv/action/configure.rb +8 -0
  101. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  102. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  103. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  104. data/plugins/providers/hyperv/config.rb +5 -0
  105. data/plugins/providers/hyperv/driver.rb +80 -0
  106. data/plugins/providers/hyperv/plugin.rb +25 -0
  107. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  108. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  109. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  110. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  111. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  112. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  113. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  114. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  115. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  116. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +8 -0
  117. data/plugins/providers/virtualbox/action.rb +12 -1
  118. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  119. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +40 -9
  120. data/plugins/providers/virtualbox/cap/configure_disks.rb +230 -77
  121. data/plugins/providers/virtualbox/cap/mount_options.rb +35 -0
  122. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +10 -3
  123. data/plugins/providers/virtualbox/driver/meta.rb +3 -0
  124. data/plugins/providers/virtualbox/driver/version_5_0.rb +96 -21
  125. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  126. data/plugins/providers/virtualbox/model/storage_controller_array.rb +100 -0
  127. data/plugins/providers/virtualbox/plugin.rb +18 -1
  128. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  129. data/plugins/provisioners/container/client.rb +1 -1
  130. data/plugins/provisioners/shell/provisioner.rb +15 -9
  131. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  132. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  133. data/plugins/synced_folders/smb/cap/mount_options.rb +36 -0
  134. data/plugins/synced_folders/smb/plugin.rb +10 -0
  135. data/plugins/synced_folders/smb/synced_folder.rb +1 -1
  136. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  137. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  138. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  139. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  140. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  141. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  142. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  143. data/templates/guests/linux/etc_fstab.erb +6 -0
  144. data/templates/locales/en.yml +121 -11
  145. data/templates/locales/providers_docker.yml +4 -0
  146. data/vagrant.gemspec +8 -7
  147. data/version.txt +1 -1
  148. metadata +1492 -1309
@@ -0,0 +1,30 @@
1
+ module Vagrant
2
+ module Action
3
+ module Builtin
4
+ class CloudInitWait
5
+
6
+ def initialize(app, env)
7
+ @app = app
8
+ @logger = Log4r::Logger.new("vagrant::action::builtin::cloudinitwait")
9
+ end
10
+
11
+ def call(env)
12
+ machine = env[:machine]
13
+ cloud_init_wait_cmd = "cloud-init status --wait"
14
+ if !machine.config.vm.cloud_init_configs.empty?
15
+ if machine.communicate.test("command -v cloud-init")
16
+ env[:ui].output(I18n.t("vagrant.cloud_init_waiting"))
17
+ result = machine.communicate.sudo(cloud_init_wait_cmd, error_check: false)
18
+ if result != 0
19
+ raise Vagrant::Errors::CloudInitCommandFailed, cmd: cloud_init_wait_cmd, guest_name: machine.name
20
+ end
21
+ else
22
+ raise Vagrant::Errors::CloudInitNotFound, guest_name: machine.name
23
+ end
24
+ end
25
+ @app.call(env)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -20,7 +20,7 @@ module Vagrant
20
20
  def call(env)
21
21
  machine = env[:machine]
22
22
 
23
- if !machine.config.vm.box
23
+ if !machine.config.vm.box || machine.config.vm.box.to_s.empty?
24
24
  @logger.info("Skipping HandleBox because no box is set")
25
25
  return @app.call(env)
26
26
  end
@@ -4,6 +4,7 @@ require "log4r"
4
4
  require "socket"
5
5
 
6
6
  require "vagrant/util/is_port_open"
7
+ require "vagrant/util/ipv4_interfaces"
7
8
 
8
9
  module Vagrant
9
10
  module Action
@@ -26,6 +27,7 @@ module Vagrant
26
27
  #
27
28
  class HandleForwardedPortCollisions
28
29
  include Util::IsPortOpen
30
+ include Util::IPv4Interfaces
29
31
 
30
32
  def initialize(app, env)
31
33
  @app = app
@@ -121,6 +123,7 @@ module Vagrant
121
123
  in_use = is_forwarded_already(extra_in_use, host_port, host_ip) ||
122
124
  call_port_checker(port_checker, host_ip, host_port) ||
123
125
  lease_check(host_ip, host_port)
126
+
124
127
  if in_use
125
128
  if !repair || !options[:auto_correct]
126
129
  raise Errors::ForwardPortCollision,
@@ -243,22 +246,19 @@ module Vagrant
243
246
  return extra_in_use.fetch(hostport).include?(hostip)
244
247
  end
245
248
 
246
- def ipv4_interfaces
247
- Socket.getifaddrs.select do |ifaddr|
248
- ifaddr.addr && ifaddr.addr.ipv4?
249
- end.map do |ifaddr|
250
- [ifaddr.name, ifaddr.addr.ip_address]
251
- end
249
+ def port_check(host_ip, host_port)
250
+ self.class.port_check(@machine, host_ip, host_port)
252
251
  end
253
252
 
254
- def port_check(host_ip, host_port)
253
+ def self.port_check(machine, host_ip, host_port)
254
+ @logger = Log4r::Logger.new("vagrant::action::builtin::handle_port_collisions")
255
255
  # If no host_ip is specified, intention taken to be listen on all interfaces.
256
256
  test_host_ip = host_ip || "0.0.0.0"
257
257
  if Util::Platform.windows? && test_host_ip == "0.0.0.0"
258
258
  @logger.debug("Testing port #{host_port} on all IPv4 interfaces...")
259
- available_interfaces = ipv4_interfaces.select do |interface|
259
+ available_interfaces = Vagrant::Util::IPv4Interfaces.ipv4_interfaces.select do |interface|
260
260
  @logger.debug("Testing #{interface[0]} with IP address #{interface[1]}")
261
- !is_port_open?(interface[1], host_port)
261
+ !Vagrant::Util::IsPortOpen.is_port_open?(interface[1], host_port)
262
262
  end
263
263
  if available_interfaces.empty?
264
264
  @logger.debug("Cannot forward port #{host_port} on any interfaces.")
@@ -269,11 +269,11 @@ module Vagrant
269
269
  end
270
270
  else
271
271
  # Do a regular check
272
- if test_host_ip == "0.0.0.0" || ipv4_interfaces.detect { |iface| iface[1] == test_host_ip }
273
- is_port_open?(test_host_ip, host_port)
274
- else
275
- raise Errors::ForwardPortHostIPNotFound, name: @machine.name, host_ip: host_ip
272
+ if test_host_ip != "0.0.0.0" && !Addrinfo.ip(test_host_ip).ipv4_loopback? &&
273
+ Vagrant::Util::IPv4Interfaces.ipv4_interfaces.none? { |iface| iface[1] == test_host_ip }
274
+ @logger.warn("host IP address is not local to this device host_ip=#{test_host_ip}")
276
275
  end
276
+ Vagrant::Util::IsPortOpen.is_port_open?(test_host_ip, host_port)
277
277
  end
278
278
  end
279
279
 
@@ -0,0 +1,36 @@
1
+ module Vagrant
2
+ module Action
3
+ module Builtin
4
+ # This middleware is used with Call to test if this machine
5
+ # has available provisioners
6
+ class HasProvisioner
7
+ def initialize(app, env)
8
+ @app = app
9
+ @logger = Log4r::Logger.new("vagrant::action::builtin::has_provisioner")
10
+ end
11
+
12
+ def call(env)
13
+ machine = env[:machine]
14
+
15
+ if machine.provider.capability?(:has_communicator)
16
+ has_communicator = machine.provider.capability(:has_communicator)
17
+ else
18
+ has_communicator = true
19
+ end
20
+
21
+ env[:skip] = []
22
+ if !has_communicator
23
+ machine.config.vm.provisioners.each do |p|
24
+ if p.communicator_required
25
+ env[:skip].push(p)
26
+ @logger.info("Skipping running provisioner #{p.name || 'no name'}, type: #{p.type}")
27
+ p.run = :never
28
+ end
29
+ end
30
+ end
31
+ @app.call(env)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -49,6 +49,7 @@ module Vagrant
49
49
  run: provisioner.run,
50
50
  before: provisioner.before,
51
51
  after: provisioner.after,
52
+ communicator_required: provisioner.communicator_required,
52
53
  }
53
54
 
54
55
  # Return the result
@@ -72,7 +72,7 @@ module Vagrant
72
72
  #
73
73
  # @param [Machine] machine The machine that the folders belong to
74
74
  # @param [Hash] folders The result from a {#synced_folders} call.
75
- def save_synced_folders(machine, folders, **opts)
75
+ def save_synced_folders(machine, folders, opts={})
76
76
  if opts[:merge]
77
77
  existing = cached_synced_folders(machine)
78
78
  if existing
@@ -97,11 +97,8 @@ module Vagrant
97
97
  end
98
98
  end
99
99
 
100
- folder_data = JSON.dump(folders)
101
-
102
- # Scrub any register credentials from the synced folders
103
- # configuration data to prevent accidental leakage
104
- folder_data = Util::CredentialScrubber.desensitize(folder_data)
100
+ # Remove implementation instances
101
+ folder_data = JSON.dump(folders.to_h)
105
102
 
106
103
  machine.data_dir.join("synced_folders").open("w") do |f|
107
104
  f.write(folder_data)
@@ -124,7 +121,7 @@ module Vagrant
124
121
  end
125
122
 
126
123
  config_folders = config.synced_folders
127
- folders = {}
124
+ folders = Vagrant::Plugin::V2::SyncedFolder::Collection.new
128
125
 
129
126
  # Determine all the synced folders as well as the implementation
130
127
  # they're going to use.
@@ -181,8 +178,10 @@ module Vagrant
181
178
 
182
179
  # Apply the scoped hash overrides to get the options
183
180
  folders.dup.each do |impl_name, fs|
181
+ impl = plugins[impl_name].first.new._initialize(machine, impl_name)
184
182
  new_fs = {}
185
183
  fs.each do |id, data|
184
+ data[:plugin] = impl
186
185
  id = data[:id] if data[:id]
187
186
  new_fs[id] = scoped_hash_override(data, impl_name)
188
187
  end
@@ -190,7 +189,7 @@ module Vagrant
190
189
  folders[impl_name] = new_fs
191
190
  end
192
191
 
193
- return folders
192
+ folders
194
193
  end
195
194
 
196
195
  # This finds the difference between two lists of synced folder
@@ -239,26 +238,26 @@ module Vagrant
239
238
  protected
240
239
 
241
240
  def cached_synced_folders(machine)
242
- JSON.parse(machine.data_dir.join("synced_folders").read).tap do |r|
243
- # We have to do all sorts of things to make the proper things
244
- # symbols and
245
- r.keys.each do |k|
246
- r[k].each do |ik, v|
247
- v.keys.each do |vk|
248
- v[vk.to_sym] = v[vk]
249
- v.delete(vk)
250
- end
241
+ import = JSON.parse(machine.data_dir.join("synced_folders").read)
242
+ import.each do |type, folders|
243
+ impl = plugins[type.to_sym].first.new._initialize(machine, type.to_sym)
244
+ folders.each { |_, v| v[:plugin] = impl }
245
+ end
246
+ # Symbolize the keys we want as symbols
247
+ import.keys.dup.each do |k|
248
+ import[k].values.each do |item|
249
+ item.keys.dup.each do |ik|
250
+ item[ik.to_sym] = item.delete(ik)
251
251
  end
252
-
253
- r[k.to_sym] = r[k]
254
- r.delete(k)
255
252
  end
253
+ import[k.to_sym] = import.delete(k)
256
254
  end
255
+ Vagrant::Plugin::V2::SyncedFolder::Collection[import]
257
256
  rescue Errno::ENOENT
258
257
  # If the file doesn't exist, we probably just have a machine created
259
258
  # by a version of Vagrant that didn't cache shared folders. Report no
260
259
  # shared folders to be safe.
261
- return {}
260
+ Vagrant::Plugin::V2::SyncedFolder::Collection.new
262
261
  end
263
262
  end
264
263
  end
@@ -10,15 +10,19 @@ module Vagrant
10
10
  class SetHostname
11
11
  def initialize(app, env)
12
12
  @app = app
13
+ @logger = Log4r::Logger.new("vagrant::action::builtin::set_hostname")
13
14
  end
14
15
 
15
16
  def call(env)
16
17
  @app.call(env)
17
18
 
18
19
  hostname = env[:machine].config.vm.hostname
19
- if !hostname.nil?
20
+ allow_hosts_modification = env[:machine].config.vm.allow_hosts_modification
21
+ if !hostname.nil? && allow_hosts_modification
20
22
  env[:ui].info I18n.t("vagrant.actions.vm.hostname.setting")
21
23
  env[:machine].guest.capability(:change_host_name, hostname)
24
+ else
25
+ @logger.info("`allow_hosts_modification` set to false. Hosts modification has been disabled, skiping changing hostname.")
22
26
  end
23
27
  end
24
28
  end
@@ -128,6 +128,16 @@ module Vagrant
128
128
  # Save the synced folders
129
129
  save_synced_folders(env[:machine], original_folders, **save_opts)
130
130
  end
131
+
132
+ # Persist the mounts by adding them to fstab
133
+ if env[:machine].guest.capability?(:persist_mount_shared_folder)
134
+ if env[:machine].config.vm.allow_fstab_modification
135
+ fstab_folders = original_folders
136
+ else
137
+ fstab_folders = nil
138
+ end
139
+ env[:machine].guest.capability(:persist_mount_shared_folder, fstab_folders)
140
+ end
131
141
  end
132
142
  end
133
143
  end
@@ -8,13 +8,14 @@ module Vagrant
8
8
  # @param [Vagrant::Plugin::V2::Triger] triggers Trigger object
9
9
  # @param [Symbol] timing When trigger should fire (:before/:after)
10
10
  # @param [Symbol] type Type of trigger
11
- def initialize(app, env, name, triggers, timing, type=:action)
11
+ def initialize(app, env, name, triggers, timing, type=:action, all: false)
12
12
  @app = app
13
13
  @env = env
14
14
  @triggers = triggers
15
15
  @name = name
16
16
  @timing = timing
17
17
  @type = type
18
+ @all = all
18
19
 
19
20
  if ![:before, :after].include?(timing)
20
21
  raise ArgumentError,
@@ -26,7 +27,7 @@ module Vagrant
26
27
  machine = env[:machine]
27
28
  machine_name = machine.name if machine
28
29
 
29
- @triggers.fire(@name, @timing, machine_name, @type)
30
+ @triggers.fire(@name, @timing, machine_name, @type, all: @all)
30
31
  # Carry on
31
32
  @app.call(env)
32
33
  end
@@ -7,23 +7,23 @@ module Vagrant
7
7
  # This is a hash of the middleware to prepend to a certain
8
8
  # other middleware.
9
9
  #
10
- # @return [Hash<Class, Array<Class>>]
10
+ # @return [Hash<Class, Array<Builder::StackItem>>]
11
11
  attr_reader :before_hooks
12
12
 
13
13
  # This is a hash of the middleware to append to a certain other
14
14
  # middleware.
15
15
  #
16
- # @return [Hash<Class, Array<Class>>]
16
+ # @return [Hash<Class, Array<Builder::StackItem>>]
17
17
  attr_reader :after_hooks
18
18
 
19
19
  # This is a list of the hooks to just prepend to the beginning
20
20
  #
21
- # @return [Array<Class>]
21
+ # @return [Array<Builder::StackItem>]
22
22
  attr_reader :prepend_hooks
23
23
 
24
24
  # This is a list of the hooks to just append to the end
25
25
  #
26
- # @return [Array<Class>]
26
+ # @return [Array<Builder::StackItem>]
27
27
  attr_reader :append_hooks
28
28
 
29
29
  def initialize
@@ -37,16 +37,32 @@ module Vagrant
37
37
  #
38
38
  # @param [Class] existing The existing middleware.
39
39
  # @param [Class] new The new middleware.
40
- def before(existing, new, *args, &block)
41
- @before_hooks[existing] << [new, args, block]
40
+ def before(existing, new, *args, **keywords, &block)
41
+ item = Builder::StackItem.new(
42
+ middleware: new,
43
+ arguments: Builder::MiddlewareArguments.new(
44
+ parameters: args,
45
+ keywords: keywords,
46
+ block: block
47
+ )
48
+ )
49
+ @before_hooks[existing] << item
42
50
  end
43
51
 
44
52
  # Add a middleware after an existing middleware.
45
53
  #
46
54
  # @param [Class] existing The existing middleware.
47
55
  # @param [Class] new The new middleware.
48
- def after(existing, new, *args, &block)
49
- @after_hooks[existing] << [new, args, block]
56
+ def after(existing, new, *args, **keywords, &block)
57
+ item = Builder::StackItem.new(
58
+ middleware: new,
59
+ arguments: Builder::MiddlewareArguments.new(
60
+ parameters: args,
61
+ keywords: keywords,
62
+ block: block
63
+ )
64
+ )
65
+ @after_hooks[existing] << item
50
66
  end
51
67
 
52
68
  # Append a middleware to the end of the stack. Note that if the
@@ -54,15 +70,31 @@ module Vagrant
54
70
  # be run.
55
71
  #
56
72
  # @param [Class] new The middleware to append.
57
- def append(new, *args, &block)
58
- @append_hooks << [new, args, block]
73
+ def append(new, *args, **keywords, &block)
74
+ item = Builder::StackItem.new(
75
+ middleware: new,
76
+ arguments: Builder::MiddlewareArguments.new(
77
+ parameters: args,
78
+ keywords: keywords,
79
+ block: block
80
+ )
81
+ )
82
+ @append_hooks << item
59
83
  end
60
84
 
61
85
  # Prepend a middleware to the beginning of the stack.
62
86
  #
63
87
  # @param [Class] new The new middleware to prepend.
64
- def prepend(new, *args, &block)
65
- @prepend_hooks << [new, args, block]
88
+ def prepend(new, *args, **keywords, &block)
89
+ item = Builder::StackItem.new(
90
+ middleware: new,
91
+ arguments: Builder::MiddlewareArguments.new(
92
+ parameters: args,
93
+ keywords: keywords,
94
+ block: block
95
+ )
96
+ )
97
+ @prepend_hooks << item
66
98
  end
67
99
 
68
100
  # @return [Boolean]
@@ -77,27 +109,28 @@ module Vagrant
77
109
  # called directly.
78
110
  #
79
111
  # @param [Builder] builder
80
- def apply(builder, options=nil)
81
- options ||= {}
82
-
112
+ def apply(builder, options={})
83
113
  if !options[:no_prepend_or_append]
84
114
  # Prepends first
85
- @prepend_hooks.each do |klass, args, block|
115
+ @prepend_hooks.each do |item|
86
116
  if options[:root]
87
117
  idx = builder.index(options[:root])
88
118
  else
89
119
  idx = 0
90
120
  end
91
- builder.insert(idx, klass, *args, &block)
121
+ builder.insert(idx, item.middleware, *item.arguments.parameters,
122
+ **item.arguments.keywords, &item.arguments.block)
92
123
  end
93
124
 
94
125
  # Appends
95
- @append_hooks.each do |klass, args, block|
126
+ @append_hooks.each do |item|
96
127
  if options[:root]
97
128
  idx = builder.index(options[:root])
98
- builder.insert(idx + 1, klass, *args, &block)
129
+ builder.insert(idx + 1, item.middleware, *item.arguments.parameters,
130
+ **item.arguments.keywords, &item.arguments.block)
99
131
  else
100
- builder.use(klass, *args, &block)
132
+ builder.use(item.middleware, *item.arguments.parameters,
133
+ **item.arguments.keywords, &item.arguments.block)
101
134
  end
102
135
  end
103
136
  end
@@ -106,8 +139,9 @@ module Vagrant
106
139
  @before_hooks.each do |key, list|
107
140
  next if !builder.index(key)
108
141
 
109
- list.each do |klass, args, block|
110
- builder.insert_before(key, klass, *args, &block)
142
+ list.each do |item|
143
+ builder.insert_before(key, item.middleware, *item.arguments.parameters,
144
+ **item.arguments.keywords, &item.arguments.block)
111
145
  end
112
146
  end
113
147
 
@@ -115,8 +149,9 @@ module Vagrant
115
149
  @after_hooks.each do |key, list|
116
150
  next if !builder.index(key)
117
151
 
118
- list.each do |klass, args, block|
119
- builder.insert_after(key, klass, *args, &block)
152
+ list.each do |item|
153
+ builder.insert_after(key, item.middleware, *item.arguments.parameters,
154
+ **item.arguments.keywords, &item.arguments.block)
120
155
  end
121
156
  end
122
157
  end