vagrant-unbundled 2.2.7.0 → 2.2.16.0

Sign up to get free protection for your applications and to get access to all the features.
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")