vagrant-unbundled 2.2.7.0 → 2.2.16.0

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +42 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
@@ -8,10 +8,12 @@ require "vagrant/config/v2/util"
8
8
  require "vagrant/util/platform"
9
9
  require "vagrant/util/presence"
10
10
  require "vagrant/util/experimental"
11
+ require "vagrant/util/map_command_options"
11
12
 
12
13
  require File.expand_path("../vm_provisioner", __FILE__)
13
14
  require File.expand_path("../vm_subvm", __FILE__)
14
15
  require File.expand_path("../disk", __FILE__)
16
+ require File.expand_path("../cloud_init", __FILE__)
15
17
 
16
18
  module VagrantPlugins
17
19
  module Kernel_V2
@@ -21,6 +23,8 @@ module VagrantPlugins
21
23
  DEFAULT_VM_NAME = :default
22
24
 
23
25
  attr_accessor :allowed_synced_folder_types
26
+ attr_accessor :allow_fstab_modification
27
+ attr_accessor :allow_hosts_modification
24
28
  attr_accessor :base_mac
25
29
  attr_accessor :base_address
26
30
  attr_accessor :boot_timeout
@@ -37,6 +41,7 @@ module VagrantPlugins
37
41
  attr_accessor :box_download_client_cert
38
42
  attr_accessor :box_download_insecure
39
43
  attr_accessor :box_download_location_trusted
44
+ attr_accessor :box_download_options
40
45
  attr_accessor :communicator
41
46
  attr_accessor :graceful_halt_timeout
42
47
  attr_accessor :guest
@@ -45,6 +50,8 @@ module VagrantPlugins
45
50
  attr_accessor :usable_port_range
46
51
  attr_reader :provisioners
47
52
  attr_reader :disks
53
+ attr_reader :cloud_init_configs
54
+ attr_reader :box_extra_download_options
48
55
 
49
56
  # This is an experimental feature that isn't public yet.
50
57
  attr_accessor :clone
@@ -53,6 +60,7 @@ module VagrantPlugins
53
60
  @logger = Log4r::Logger.new("vagrant::config::vm")
54
61
 
55
62
  @allowed_synced_folder_types = UNSET_VALUE
63
+ @allow_fstab_modification = UNSET_VALUE
56
64
  @base_mac = UNSET_VALUE
57
65
  @base_address = UNSET_VALUE
58
66
  @boot_timeout = UNSET_VALUE
@@ -66,8 +74,11 @@ module VagrantPlugins
66
74
  @box_download_client_cert = UNSET_VALUE
67
75
  @box_download_insecure = UNSET_VALUE
68
76
  @box_download_location_trusted = UNSET_VALUE
77
+ @box_download_options = UNSET_VALUE
78
+ @box_extra_download_options = UNSET_VALUE
69
79
  @box_url = UNSET_VALUE
70
80
  @box_version = UNSET_VALUE
81
+ @allow_hosts_modification = UNSET_VALUE
71
82
  @clone = UNSET_VALUE
72
83
  @communicator = UNSET_VALUE
73
84
  @graceful_halt_timeout = UNSET_VALUE
@@ -76,6 +87,7 @@ module VagrantPlugins
76
87
  @post_up_message = UNSET_VALUE
77
88
  @provisioners = []
78
89
  @disks = []
90
+ @cloud_init_configs = []
79
91
  @usable_port_range = UNSET_VALUE
80
92
 
81
93
  # Internal state
@@ -148,6 +160,28 @@ module VagrantPlugins
148
160
  end
149
161
  result.instance_variable_set(:@disks, new_disks)
150
162
 
163
+ # Merge defined cloud_init_configs
164
+ other_cloud_init_configs = other.instance_variable_get(:@cloud_init_configs)
165
+ new_cloud_init_configs = []
166
+ @cloud_init_configs.each do |p|
167
+ other_p = other_cloud_init_configs.find { |o| p.id == o.id }
168
+ if other_p
169
+ # there is an override. take it.
170
+ other_p.config = p.config.merge(other_p.config)
171
+
172
+ # Remove duplicate disk config from other
173
+ p = other_p
174
+ other_cloud_init_configs.delete(other_p)
175
+ end
176
+
177
+ # there is an override, merge it into the
178
+ new_cloud_init_configs << p.dup
179
+ end
180
+ other_cloud_init_configs.each do |p|
181
+ new_cloud_init_configs << p.dup
182
+ end
183
+ result.instance_variable_set(:@cloud_init_configs, new_cloud_init_configs)
184
+
151
185
  # Merge the providers by prepending any configuration blocks we
152
186
  # have for providers onto the new configuration.
153
187
  other_providers = other.instance_variable_get(:@__providers)
@@ -243,6 +277,11 @@ module VagrantPlugins
243
277
 
244
278
  options ||= {}
245
279
 
280
+ if options[:nfs]
281
+ options[:type] = :nfs
282
+ options.delete(:nfs)
283
+ end
284
+
246
285
  if options.has_key?(:name)
247
286
  synced_folder_name = options.delete(:name)
248
287
  else
@@ -366,7 +405,7 @@ module VagrantPlugins
366
405
 
367
406
  if Vagrant::Util::Experimental.feature_enabled?("dependency_provisioners")
368
407
  opts = {before: before, after: after}
369
- prov = VagrantConfigProvisioner.new(name, type.to_sym, opts)
408
+ prov = VagrantConfigProvisioner.new(name, type.to_sym, **opts)
370
409
  else
371
410
  prov = VagrantConfigProvisioner.new(name, type.to_sym)
372
411
  end
@@ -376,7 +415,9 @@ module VagrantPlugins
376
415
  prov.preserve_order = !!options.delete(:preserve_order) if \
377
416
  options.key?(:preserve_order)
378
417
  prov.run = options.delete(:run) if options.key?(:run)
379
- prov.add_config(options, &block)
418
+ prov.communicator_required = options.delete(:communicator_required) if options.key?(:communicator_required)
419
+
420
+ prov.add_config(**options, &block)
380
421
  nil
381
422
  end
382
423
 
@@ -431,16 +472,41 @@ module VagrantPlugins
431
472
  disk_config.set_options(options)
432
473
 
433
474
  # Add provider config
434
- disk_config.add_provider_config(provider_options, &block)
475
+ disk_config.add_provider_config(**provider_options, &block)
435
476
 
436
- if !Vagrant::Util::Experimental.feature_enabled?("disk_base_config")
437
- @logger.warn("Disk config defined, but experimental feature is not enabled. To use this feature, enable it with the experimental flag `disk_base_config`. Disk will not be added to internal config, and will be ignored.")
477
+ if !Vagrant::Util::Experimental.feature_enabled?("disks")
478
+ @logger.warn("Disk config defined, but experimental feature is not enabled. To use this feature, enable it with the experimental flag `disks`. Disk will not be added to internal config, and will be ignored.")
438
479
  return
439
480
  end
440
481
 
441
482
  @disks << disk_config
442
483
  end
443
484
 
485
+ # Stores config options for cloud_init
486
+ #
487
+ # @param [Symbol] type
488
+ # @param [Hash] options
489
+ # @param [Block] block
490
+ def cloud_init(type=nil, **options, &block)
491
+ type = type.to_sym if type
492
+
493
+ cloud_init_config = VagrantConfigCloudInit.new(type)
494
+
495
+ if block_given?
496
+ block.call(cloud_init_config, VagrantConfigCloudInit)
497
+ else
498
+ # config is hash
499
+ cloud_init_config.set_options(options)
500
+ end
501
+
502
+ if !Vagrant::Util::Experimental.feature_enabled?("cloud_init")
503
+ @logger.warn("cloud_init config defined, but experimental feature is not enabled. To use this feature, enable it with the experimental flag `cloud_init`. cloud_init config will not be added to internal config, and will be ignored.")
504
+ return
505
+ end
506
+
507
+ @cloud_init_configs << cloud_init_config
508
+ end
509
+
444
510
  #-------------------------------------------------------------------
445
511
  # Internal methods, don't call these.
446
512
  #-------------------------------------------------------------------
@@ -467,6 +533,9 @@ module VagrantPlugins
467
533
  @box_download_location_trusted = false if @box_download_location_trusted == UNSET_VALUE
468
534
  @box_url = nil if @box_url == UNSET_VALUE
469
535
  @box_version = nil if @box_version == UNSET_VALUE
536
+ @box_download_options = {} if @box_download_options == UNSET_VALUE
537
+ @box_extra_download_options = Vagrant::Util::MapCommandOptions.map_to_command_options(@box_download_options)
538
+ @allow_hosts_modification = true if @allow_hosts_modification == UNSET_VALUE
470
539
  @clone = nil if @clone == UNSET_VALUE
471
540
  @communicator = nil if @communicator == UNSET_VALUE
472
541
  @graceful_halt_timeout = 60 if @graceful_halt_timeout == UNSET_VALUE
@@ -590,15 +659,6 @@ module VagrantPlugins
590
659
 
591
660
  current_dir_shared = false
592
661
  @__synced_folders.each do |id, options|
593
- if options[:nfs]
594
- options[:type] = :nfs
595
- end
596
-
597
- # Ignore NFS on Windows
598
- if options[:type] == :nfs && Vagrant::Util::Platform.windows?
599
- options.delete(:type)
600
- end
601
-
602
662
  if options[:hostpath] == '.'
603
663
  current_dir_shared = true
604
664
  end
@@ -608,6 +668,10 @@ module VagrantPlugins
608
668
  d.finalize!
609
669
  end
610
670
 
671
+ @cloud_init_configs.each do |c|
672
+ c.finalize!
673
+ end
674
+
611
675
  if !current_dir_shared && !@__synced_folders["/vagrant"]
612
676
  synced_folder(".", "/vagrant")
613
677
  end
@@ -662,6 +726,17 @@ module VagrantPlugins
662
726
  def validate(machine, ignore_provider=nil)
663
727
  errors = _detected_errors
664
728
 
729
+ if @allow_fstab_modification == UNSET_VALUE
730
+ machine.synced_folders.types.each do |impl_name|
731
+ inst = machine.synced_folders.type(impl_name)
732
+ if inst.capability?(:default_fstab_modification) && inst.capability(:default_fstab_modification) == false
733
+ @allow_fstab_modification = false
734
+ break
735
+ end
736
+ end
737
+ @allow_fstab_modification = true if @allow_fstab_modification == UNSET_VALUE
738
+ end
739
+
665
740
  if !box && !clone && !machine.provider_options[:box_optional]
666
741
  errors << I18n.t("vagrant.config.vm.box_missing")
667
742
  end
@@ -670,6 +745,10 @@ module VagrantPlugins
670
745
  errors << I18n.t("vagrant.config.vm.clone_and_box")
671
746
  end
672
747
 
748
+ if box && box.empty?
749
+ errors << I18n.t("vagrant.config.vm.box_empty", machine_name: machine.name)
750
+ end
751
+
673
752
  errors << I18n.t("vagrant.config.vm.hostname_invalid_characters", name: machine.name) if \
674
753
  @hostname && @hostname !~ /^[a-z0-9][-.a-z0-9]*$/i
675
754
 
@@ -714,6 +793,19 @@ module VagrantPlugins
714
793
  end
715
794
  end
716
795
 
796
+ if !box_download_options.is_a?(Hash)
797
+ errors << I18n.t("vagrant.config.vm.box_download_options_type", type: box_download_options.class.to_s)
798
+ end
799
+
800
+ box_download_options.each do |k, v|
801
+ # If the value is truthy and
802
+ # if `box_extra_download_options` does not include the key
803
+ # then the conversion to extra download options produced an error
804
+ if v && !box_extra_download_options.include?("--#{k}")
805
+ errors << I18n.t("vagrant.config.vm.box_download_options_not_converted", missing_key: k)
806
+ end
807
+ end
808
+
717
809
  used_guest_paths = Set.new
718
810
  @__synced_folders.each do |id, options|
719
811
  # If the shared folder is disabled then don't worry about validating it
@@ -755,9 +847,14 @@ module VagrantPlugins
755
847
  errors << I18n.t("vagrant.config.vm.shared_folder_mount_options_array")
756
848
  end
757
849
 
758
- # One day remove this probably.
759
- if options[:extra]
760
- errors << "The 'extra' flag on synced folders is now 'mount_options'"
850
+ if options[:type]
851
+ plugins = Vagrant.plugin("2").manager.synced_folders
852
+ impl_class = plugins[options[:type]]
853
+ if !impl_class
854
+ errors << I18n.t("vagrant.config.vm.shared_folder_invalid_option_type",
855
+ type: options[:type],
856
+ options: plugins.keys.join(', '))
857
+ end
761
858
  end
762
859
  end
763
860
 
@@ -767,7 +864,17 @@ module VagrantPlugins
767
864
  valid_network_types = [:forwarded_port, :private_network, :public_network]
768
865
 
769
866
  port_range=(1..65535)
867
+ has_hostname_config = false
770
868
  networks.each do |type, options|
869
+ if options[:hostname]
870
+ if has_hostname_config
871
+ errors << I18n.t("vagrant.config.vm.multiple_networks_set_hostname")
872
+ end
873
+ if options[:ip] == nil
874
+ errors << I18n.t("vagrant.config.vm.network_with_hostname_must_set_ip")
875
+ end
876
+ has_hostname_config = true
877
+ end
771
878
  if !valid_network_types.include?(type)
772
879
  errors << I18n.t("vagrant.config.vm.network_type_invalid",
773
880
  type: type.to_s)
@@ -810,7 +917,7 @@ module VagrantPlugins
810
917
  end
811
918
 
812
919
  # Validate disks
813
- # Check if there is more than one primrary disk defined and throw an error
920
+ # Check if there is more than one primary disk defined and throw an error
814
921
  primary_disks = @disks.select { |d| d.primary && d.type == :disk }
815
922
  if primary_disks.size > 1
816
923
  errors << I18n.t("vagrant.config.vm.multiple_primary_disks_error",
@@ -818,14 +925,29 @@ module VagrantPlugins
818
925
  end
819
926
 
820
927
  disk_names = @disks.map { |d| d.name }
821
- duplicate_names = disk_names.detect{ |d| disk_names.count(d) > 1 }
822
- if duplicate_names && duplicate_names.size
928
+ duplicate_names = disk_names.find_all { |d| disk_names.count(d) > 1 }
929
+ if duplicate_names.any?
823
930
  errors << I18n.t("vagrant.config.vm.multiple_disk_names_error",
824
- name: duplicate_names)
931
+ name: machine.name,
932
+ disk_names: duplicate_names.uniq.join("\n"))
933
+ end
934
+
935
+ disk_files = @disks.map { |d| d.file }
936
+ duplicate_files = disk_files.find_all { |d| d && disk_files.count(d) > 1 }
937
+ if duplicate_files.any?
938
+ errors << I18n.t("vagrant.config.vm.multiple_disk_files_error",
939
+ name: machine.name,
940
+ disk_files: duplicate_files.uniq.join("\n"))
825
941
  end
826
942
 
827
943
  @disks.each do |d|
828
944
  error = d.validate(machine)
945
+ errors.concat(error) if !error.empty?
946
+ end
947
+
948
+ # Validate clout_init_configs
949
+ @cloud_init_configs.each do |c|
950
+ error = c.validate(machine)
829
951
  errors.concat error if !error.empty?
830
952
  end
831
953
 
@@ -903,6 +1025,18 @@ module VagrantPlugins
903
1025
  end
904
1026
  end
905
1027
 
1028
+ if ![TrueClass, FalseClass].include?(@allow_fstab_modification.class)
1029
+ errors["vm"] << I18n.t("vagrant.config.vm.config_type",
1030
+ option: "allow_fstab_modification", given: @allow_fstab_modification.class, required: "Boolean"
1031
+ )
1032
+ end
1033
+
1034
+ if ![TrueClass, FalseClass].include?(@allow_hosts_modification.class)
1035
+ errors["vm"] << I18n.t("vagrant.config.vm.config_type",
1036
+ option: "allow_hosts_modification", given: @allow_hosts_modification.class, required: "Boolean"
1037
+ )
1038
+ end
1039
+
906
1040
  errors
907
1041
  end
908
1042
 
@@ -56,6 +56,12 @@ module VagrantPlugins
56
56
  # @return [String, Symbol]
57
57
  attr_accessor :after
58
58
 
59
+ # Boolean, when true signifies that some communicator must
60
+ # be available in order for the provisioner to run.
61
+ #
62
+ # @return [Boolean]
63
+ attr_accessor :communicator_required
64
+
59
65
  def initialize(name, type, **options)
60
66
  @logger = Log4r::Logger.new("vagrant::config::vm::provisioner")
61
67
  @logger.debug("Provisioner defined: #{name}")
@@ -69,6 +75,7 @@ module VagrantPlugins
69
75
  @type = type
70
76
  @before = options[:before]
71
77
  @after = options[:after]
78
+ @communicator_required = options.fetch(:communicator_required, true)
72
79
 
73
80
  # Attempt to find the provisioner...
74
81
  if !Vagrant.plugin("2").manager.provisioners[type]
@@ -118,6 +125,10 @@ module VagrantPlugins
118
125
 
119
126
  provisioner_names = provisioners.map { |i| i.name.to_s if i.name != name }.compact
120
127
 
128
+ if ![TrueClass, FalseClass].include?(@communicator_required.class)
129
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "communicator_required", type: "boolean")
130
+ end
131
+
121
132
  if @before && @after
122
133
  errors << I18n.t("vagrant.provisioners.base.both_before_after_set")
123
134
  end
@@ -127,7 +138,7 @@ module VagrantPlugins
127
138
  if @before.is_a?(Symbol) && !VALID_BEFORE_AFTER_TYPES.include?(@before)
128
139
  errors << I18n.t("vagrant.provisioners.base.invalid_alias_value", opt: "before", alias: VALID_BEFORE_AFTER_TYPES.join(", "))
129
140
  elsif !@before.is_a?(String) && !VALID_BEFORE_AFTER_TYPES.include?(@before)
130
- errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "before")
141
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "before", type: "string")
131
142
  end
132
143
 
133
144
  if !provisioner_names.include?(@before)
@@ -153,7 +164,7 @@ module VagrantPlugins
153
164
  if @after.is_a?(Symbol)
154
165
  errors << I18n.t("vagrant.provisioners.base.invalid_alias_value", opt: "after", alias: VALID_BEFORE_AFTER_TYPES.join(", "))
155
166
  elsif !@after.is_a?(String)
156
- errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "after")
167
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "after", type: "string")
157
168
  end
158
169
 
159
170
  if !provisioner_names.include?(@after)
@@ -114,7 +114,11 @@ module VagrantPlugins
114
114
 
115
115
  # Internal options
116
116
  @id = SecureRandom.uuid
117
- @command = command.to_sym
117
+ if command.respond_to?(:to_sym)
118
+ @command = command.to_sym
119
+ else
120
+ @command = command
121
+ end
118
122
  @ruby_block = UNSET_VALUE
119
123
 
120
124
  @logger.debug("Trigger defined for: #{command}")
@@ -214,10 +218,7 @@ module VagrantPlugins
214
218
  end
215
219
 
216
220
  if @type == :command || !@type
217
- commands = []
218
- Vagrant.plugin("2").manager.commands.each do |key,data|
219
- commands.push(key)
220
- end
221
+ commands = Vagrant.plugin("2").manager.commands.keys.map(&:to_s)
221
222
 
222
223
  if !commands.include?(@command) && @command != :all
223
224
  machine.ui.warn(I18n.t("vagrant.config.triggers.bad_command_warning",
@@ -66,14 +66,8 @@ module VagrantPlugins
66
66
  next
67
67
  end
68
68
 
69
- b3.use Call, HasSSH do |env3, b4|
70
- if env3[:result]
71
- b4.use Provision
72
- else
73
- b4.use Message,
74
- I18n.t("docker_provider.messages.provision_no_ssh"),
75
- post: true
76
- end
69
+ b3.use Call, HasProvisioner do |env3, b4|
70
+ b4.use Provision
77
71
  end
78
72
  end
79
73
  end
@@ -216,14 +210,8 @@ module VagrantPlugins
216
210
  Vagrant::Action::Builder.new.tap do |b|
217
211
  b.use Call, IsState, :running do |env, b2|
218
212
  if env[:machine_action] != :run_command
219
- b2.use Call, HasSSH do |env2, b3|
220
- if env2[:result]
221
- b3.use Provision
222
- else
223
- b3.use Message,
224
- I18n.t("docker_provider.messages.provision_no_ssh"),
225
- post: true
226
- end
213
+ b2.use Call, HasProvisioner do |env2, b3|
214
+ b3.use Provision
227
215
  end
228
216
  end
229
217
 
@@ -251,14 +239,16 @@ module VagrantPlugins
251
239
  if env[:machine_action] != :run_command
252
240
  # If the container is NOT created yet, then do some setup steps
253
241
  # necessary for creating it.
242
+
254
243
  b2.use Call, IsState, :preparing do |env2, b3|
255
244
  if env2[:result]
256
245
  b3.use EnvSet, port_collision_repair: true
257
246
  b3.use HostMachinePortWarning
258
247
  b3.use HostMachinePortChecker
248
+ b3.use ForwardedPorts # This action converts the `ports` param into proper network configs
249
+ b3.use PrepareForwardedPortCollisionParams
259
250
  b3.use HandleForwardedPortCollisions
260
251
  b3.use SyncedFolders
261
- b3.use ForwardedPorts
262
252
  b3.use Pull
263
253
  b3.use Create
264
254
  b3.use WaitForRunning
@@ -313,6 +303,7 @@ module VagrantPlugins
313
303
  autoload :IsBuild, action_root.join("is_build")
314
304
  autoload :IsHostMachineCreated, action_root.join("is_host_machine_created")
315
305
  autoload :Login, action_root.join("login")
306
+ autoload :PrepareForwardedPortCollisionParams, action_root.join("prepare_forwarded_port_collision_params")
316
307
  autoload :PrepareNetworks, action_root.join("prepare_networks")
317
308
  autoload :PrepareNFSValidIds, action_root.join("prepare_nfs_valid_ids")
318
309
  autoload :PrepareNFSSettings, action_root.join("prepare_nfs_settings")