vagrant-unbundled 2.2.6.2 → 2.2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +14 -0
  3. data/CHANGELOG.md +213 -2
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +23 -0
  8. data/contrib/README.md +1 -0
  9. data/contrib/bash/completion.sh +13 -1
  10. data/contrib/sudoers/linux-suse +2 -2
  11. data/contrib/zsh/_vagrant +738 -0
  12. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  13. data/lib/vagrant.rb +25 -4
  14. data/lib/vagrant/action.rb +8 -0
  15. data/lib/vagrant/action/builder.rb +184 -38
  16. data/lib/vagrant/action/builtin/box_add.rb +20 -8
  17. data/lib/vagrant/action/builtin/box_check_outdated.rb +12 -15
  18. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  19. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  20. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  21. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  22. data/lib/vagrant/action/builtin/disk.rb +52 -0
  23. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  24. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  25. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  26. data/lib/vagrant/action/builtin/mixin_provisioners.rb +20 -1
  27. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  28. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  29. data/lib/vagrant/action/builtin/ssh_run.rb +21 -3
  30. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  31. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  32. data/lib/vagrant/action/hook.rb +76 -23
  33. data/lib/vagrant/action/runner.rb +12 -27
  34. data/lib/vagrant/action/warden.rb +28 -22
  35. data/lib/vagrant/box.rb +11 -4
  36. data/lib/vagrant/box_collection.rb +1 -1
  37. data/lib/vagrant/box_metadata.rb +17 -3
  38. data/lib/vagrant/bundler.rb +298 -59
  39. data/lib/vagrant/cli.rb +4 -2
  40. data/lib/vagrant/errors.rb +61 -1
  41. data/lib/vagrant/machine.rb +64 -11
  42. data/lib/vagrant/machine_index.rb +28 -1
  43. data/lib/vagrant/plugin/manager.rb +25 -14
  44. data/lib/vagrant/plugin/v2/command.rb +7 -2
  45. data/lib/vagrant/plugin/v2/components.rb +6 -0
  46. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  47. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  48. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  49. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  50. data/lib/vagrant/shared_helpers.rb +36 -0
  51. data/lib/vagrant/ui.rb +51 -5
  52. data/lib/vagrant/util.rb +1 -0
  53. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  54. data/lib/vagrant/util/caps.rb +48 -0
  55. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  56. data/lib/vagrant/util/curl_helper.rb +8 -5
  57. data/lib/vagrant/util/directory.rb +19 -0
  58. data/lib/vagrant/util/downloader.rb +10 -5
  59. data/lib/vagrant/util/file_checksum.rb +6 -2
  60. data/lib/vagrant/util/guest_hosts.rb +68 -0
  61. data/lib/vagrant/util/guest_inspection.rb +9 -1
  62. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  63. data/lib/vagrant/util/io.rb +7 -27
  64. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  65. data/lib/vagrant/util/is_port_open.rb +8 -20
  66. data/lib/vagrant/util/map_command_options.rb +33 -0
  67. data/lib/vagrant/util/mime.rb +92 -0
  68. data/lib/vagrant/util/network_ip.rb +11 -1
  69. data/lib/vagrant/util/numeric.rb +69 -0
  70. data/lib/vagrant/util/platform.rb +10 -2
  71. data/lib/vagrant/util/powershell.rb +1 -1
  72. data/lib/vagrant/util/subprocess.rb +9 -1
  73. data/lib/vagrant/util/template_renderer.rb +2 -2
  74. data/lib/vagrant/util/uploader.rb +7 -4
  75. data/lib/vagrant/vagrantfile.rb +1 -1
  76. data/plugins/commands/autocomplete/command/install.rb +49 -0
  77. data/plugins/commands/autocomplete/command/root.rb +64 -0
  78. data/plugins/commands/autocomplete/plugin.rb +18 -0
  79. data/plugins/commands/box/command/outdated.rb +14 -2
  80. data/plugins/commands/cap/command.rb +5 -1
  81. data/plugins/commands/cloud/auth/login.rb +20 -23
  82. data/plugins/commands/cloud/auth/logout.rb +2 -10
  83. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +57 -0
  84. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  85. data/plugins/commands/cloud/box/create.rb +33 -29
  86. data/plugins/commands/cloud/box/delete.rb +30 -24
  87. data/plugins/commands/cloud/box/show.rb +41 -31
  88. data/plugins/commands/cloud/box/update.rb +34 -26
  89. data/plugins/commands/cloud/client/client.rb +50 -81
  90. data/plugins/commands/cloud/list.rb +3 -4
  91. data/plugins/commands/cloud/locales/en.yml +10 -10
  92. data/plugins/commands/cloud/plugin.rb +10 -0
  93. data/plugins/commands/cloud/provider/create.rb +38 -28
  94. data/plugins/commands/cloud/provider/delete.rb +39 -29
  95. data/plugins/commands/cloud/provider/update.rb +37 -28
  96. data/plugins/commands/cloud/provider/upload.rb +44 -34
  97. data/plugins/commands/cloud/publish.rb +185 -108
  98. data/plugins/commands/cloud/search.rb +34 -21
  99. data/plugins/commands/cloud/util.rb +266 -162
  100. data/plugins/commands/cloud/version/create.rb +33 -28
  101. data/plugins/commands/cloud/version/delete.rb +35 -28
  102. data/plugins/commands/cloud/version/release.rb +35 -29
  103. data/plugins/commands/cloud/version/revoke.rb +36 -29
  104. data/plugins/commands/cloud/version/update.rb +29 -25
  105. data/plugins/commands/destroy/command.rb +6 -2
  106. data/plugins/commands/login/plugin.rb +0 -13
  107. data/plugins/commands/snapshot/command/save.rb +13 -8
  108. data/plugins/commands/ssh_config/command.rb +1 -1
  109. data/plugins/communicators/ssh/communicator.rb +25 -24
  110. data/plugins/communicators/winrm/config.rb +1 -1
  111. data/plugins/communicators/winrm/helper.rb +1 -1
  112. data/plugins/communicators/winrm/shell.rb +1 -1
  113. data/plugins/communicators/winssh/communicator.rb +126 -38
  114. data/plugins/communicators/winssh/config.rb +3 -7
  115. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  116. data/plugins/guests/alpine/cap/rsync.rb +1 -1
  117. data/plugins/guests/alpine/plugin.rb +16 -0
  118. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  119. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  120. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  121. data/plugins/guests/arch/cap/smb.rb +1 -1
  122. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  123. data/plugins/guests/centos/cap/flavor.rb +24 -0
  124. data/plugins/guests/centos/guest.rb +9 -0
  125. data/plugins/guests/centos/plugin.rb +20 -0
  126. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  127. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  128. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  129. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +109 -13
  130. data/plugins/guests/darwin/plugin.rb +15 -0
  131. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  132. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  133. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  134. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  135. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  136. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  137. data/plugins/guests/haiku/plugin.rb +15 -0
  138. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  139. data/plugins/guests/linux/cap/halt.rb +9 -1
  140. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  141. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  142. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +75 -0
  143. data/plugins/guests/linux/cap/reboot.rb +53 -0
  144. data/plugins/guests/linux/plugin.rb +20 -0
  145. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  146. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  147. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  148. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  149. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  150. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  151. data/plugins/guests/redhat/cap/nfs_client.rb +2 -2
  152. data/plugins/guests/redhat/cap/smb.rb +20 -0
  153. data/plugins/guests/redhat/plugin.rb +5 -0
  154. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  155. data/plugins/guests/solaris11/plugin.rb +5 -0
  156. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  157. data/plugins/guests/windows/cap/public_key.rb +3 -3
  158. data/plugins/guests/windows/cap/reboot.rb +10 -5
  159. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  160. data/plugins/hosts/darwin/cap/nfs.rb +11 -0
  161. data/plugins/hosts/darwin/plugin.rb +15 -0
  162. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/linux/cap/nfs.rb +21 -2
  164. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  165. data/plugins/hosts/linux/plugin.rb +10 -0
  166. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  167. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  168. data/plugins/hosts/windows/plugin.rb +15 -0
  169. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  170. data/plugins/kernel_v2/config/disk.rb +221 -0
  171. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  172. data/plugins/kernel_v2/config/vm.rb +230 -15
  173. data/plugins/kernel_v2/config/vm_provisioner.rb +17 -3
  174. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  175. data/plugins/providers/docker/action.rb +8 -17
  176. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  177. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  178. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  179. data/plugins/providers/docker/communicator.rb +1 -1
  180. data/plugins/providers/docker/driver.rb +73 -10
  181. data/plugins/providers/docker/errors.rb +4 -0
  182. data/plugins/providers/docker/executor/local.rb +7 -1
  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 +14 -1
  205. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +10 -1
  206. data/plugins/providers/virtualbox/action/export.rb +4 -2
  207. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  208. data/plugins/providers/virtualbox/action/import.rb +8 -4
  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 +35 -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 +17 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +39 -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 +38 -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/arch/ansible_install.rb +20 -3
  227. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +4 -5
  228. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +2 -2
  229. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +2 -2
  230. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +8 -4
  231. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +2 -2
  232. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +2 -1
  233. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +3 -3
  234. data/plugins/provisioners/ansible/plugin.rb +5 -0
  235. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  236. data/plugins/provisioners/container/client.rb +203 -0
  237. data/plugins/provisioners/container/config.rb +83 -0
  238. data/plugins/provisioners/container/installer.rb +13 -0
  239. data/plugins/provisioners/container/plugin.rb +23 -0
  240. data/plugins/provisioners/container/provisioner.rb +28 -0
  241. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  242. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  243. data/plugins/provisioners/docker/client.rb +4 -175
  244. data/plugins/provisioners/docker/config.rb +2 -72
  245. data/plugins/provisioners/docker/installer.rb +3 -5
  246. data/plugins/provisioners/docker/plugin.rb +6 -6
  247. data/plugins/provisioners/docker/provisioner.rb +4 -10
  248. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  249. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  250. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  251. data/plugins/provisioners/podman/client.rb +12 -0
  252. data/plugins/provisioners/podman/config.rb +28 -0
  253. data/plugins/provisioners/podman/installer.rb +33 -0
  254. data/plugins/provisioners/podman/plugin.rb +38 -0
  255. data/plugins/provisioners/podman/provisioner.rb +52 -0
  256. data/plugins/provisioners/salt/provisioner.rb +4 -0
  257. data/plugins/provisioners/shell/config.rb +1 -6
  258. data/plugins/provisioners/shell/provisioner.rb +61 -26
  259. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  260. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  261. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  262. data/plugins/synced_folders/smb/plugin.rb +20 -0
  263. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  264. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  265. data/scripts/website_push_www.sh +1 -1
  266. data/templates/commands/init/Vagrantfile.erb +1 -1
  267. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  268. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  269. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  270. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  271. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  272. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  273. data/templates/guests/linux/etc_fstab.erb +6 -0
  274. data/templates/locales/en.yml +235 -6
  275. data/templates/locales/providers_docker.yml +6 -0
  276. data/templates/nfs/exports_darwin.erb +7 -0
  277. data/vagrant.gemspec +14 -15
  278. data/version.txt +1 -1
  279. metadata +3577 -3855
  280. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  281. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  282. data/plugins/commands/login/client.rb +0 -253
  283. data/plugins/commands/login/command.rb +0 -137
  284. data/plugins/commands/login/errors.rb +0 -24
  285. data/plugins/commands/login/locales/en.yml +0 -49
  286. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  287. data/scripts/website_push_docs.sh +0 -40
@@ -1,9 +1,12 @@
1
1
  module VagrantPlugins
2
2
  module Kernel_V2
3
3
  class SSHConnectConfig < Vagrant.plugin("2", :config)
4
+ DEFAULT_SSH_CONNECT_TIMEOUT = 15
5
+
4
6
  attr_accessor :host
5
7
  attr_accessor :port
6
8
  attr_accessor :config
9
+ attr_accessor :connect_timeout
7
10
  attr_accessor :private_key_path
8
11
  attr_accessor :username
9
12
  attr_accessor :password
@@ -20,6 +23,7 @@ module VagrantPlugins
20
23
  @host = UNSET_VALUE
21
24
  @port = UNSET_VALUE
22
25
  @config = UNSET_VALUE
26
+ @connect_timeout = UNSET_VALUE
23
27
  @private_key_path = UNSET_VALUE
24
28
  @username = UNSET_VALUE
25
29
  @password = UNSET_VALUE
@@ -47,6 +51,7 @@ module VagrantPlugins
47
51
  @dsa_authentication = true if @dsa_authentication == UNSET_VALUE
48
52
  @extra_args = nil if @extra_args == UNSET_VALUE
49
53
  @config = nil if @config == UNSET_VALUE
54
+ @connect_timeout = DEFAULT_SSH_CONNECT_TIMEOUT if @connect_timeout == UNSET_VALUE
50
55
 
51
56
  if @private_key_path && !@private_key_path.is_a?(Array)
52
57
  @private_key_path = [@private_key_path]
@@ -76,6 +81,15 @@ module VagrantPlugins
76
81
  when :secure
77
82
  @verify_host_key = :always
78
83
  end
84
+
85
+ # Attempt to convert timeout to integer value
86
+ # If we can't convert the connect timeout into an integer or
87
+ # if the value is less than 1, set it to the default value
88
+ begin
89
+ @connect_timeout = @connect_timeout.to_i
90
+ rescue
91
+ # ignore
92
+ end
79
93
  end
80
94
 
81
95
  # NOTE: This is _not_ a valid config validation method, since it
@@ -110,6 +124,16 @@ module VagrantPlugins
110
124
  machine.env.ui.warn(I18n.t("vagrant.config.ssh.paranoid_deprecated"))
111
125
  end
112
126
 
127
+ if !@connect_timeout.is_a?(Integer)
128
+ errors << I18n.t(
129
+ "vagrant.config.ssh.connect_timeout_invalid_type",
130
+ given: @connect_timeout.class.name)
131
+ elsif @connect_timeout < 1
132
+ errors << I18n.t(
133
+ "vagrant.config.ssh.connect_timeout_invalid_value",
134
+ given: @connect_timeout.to_s)
135
+ end
136
+
113
137
  errors
114
138
  end
115
139
  end
@@ -8,9 +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__)
15
+ require File.expand_path("../disk", __FILE__)
16
+ require File.expand_path("../cloud_init", __FILE__)
14
17
 
15
18
  module VagrantPlugins
16
19
  module Kernel_V2
@@ -20,6 +23,8 @@ module VagrantPlugins
20
23
  DEFAULT_VM_NAME = :default
21
24
 
22
25
  attr_accessor :allowed_synced_folder_types
26
+ attr_accessor :allow_fstab_modification
27
+ attr_accessor :allow_hosts_modification
23
28
  attr_accessor :base_mac
24
29
  attr_accessor :base_address
25
30
  attr_accessor :boot_timeout
@@ -36,6 +41,7 @@ module VagrantPlugins
36
41
  attr_accessor :box_download_client_cert
37
42
  attr_accessor :box_download_insecure
38
43
  attr_accessor :box_download_location_trusted
44
+ attr_accessor :box_download_options
39
45
  attr_accessor :communicator
40
46
  attr_accessor :graceful_halt_timeout
41
47
  attr_accessor :guest
@@ -43,6 +49,9 @@ module VagrantPlugins
43
49
  attr_accessor :post_up_message
44
50
  attr_accessor :usable_port_range
45
51
  attr_reader :provisioners
52
+ attr_reader :disks
53
+ attr_reader :cloud_init_configs
54
+ attr_reader :box_extra_download_options
46
55
 
47
56
  # This is an experimental feature that isn't public yet.
48
57
  attr_accessor :clone
@@ -51,6 +60,7 @@ module VagrantPlugins
51
60
  @logger = Log4r::Logger.new("vagrant::config::vm")
52
61
 
53
62
  @allowed_synced_folder_types = UNSET_VALUE
63
+ @allow_fstab_modification = UNSET_VALUE
54
64
  @base_mac = UNSET_VALUE
55
65
  @base_address = UNSET_VALUE
56
66
  @boot_timeout = UNSET_VALUE
@@ -64,8 +74,11 @@ module VagrantPlugins
64
74
  @box_download_client_cert = UNSET_VALUE
65
75
  @box_download_insecure = UNSET_VALUE
66
76
  @box_download_location_trusted = UNSET_VALUE
77
+ @box_download_options = UNSET_VALUE
78
+ @box_extra_download_options = UNSET_VALUE
67
79
  @box_url = UNSET_VALUE
68
80
  @box_version = UNSET_VALUE
81
+ @allow_hosts_modification = UNSET_VALUE
69
82
  @clone = UNSET_VALUE
70
83
  @communicator = UNSET_VALUE
71
84
  @graceful_halt_timeout = UNSET_VALUE
@@ -73,6 +86,8 @@ module VagrantPlugins
73
86
  @hostname = UNSET_VALUE
74
87
  @post_up_message = UNSET_VALUE
75
88
  @provisioners = []
89
+ @disks = []
90
+ @cloud_init_configs = []
76
91
  @usable_port_range = UNSET_VALUE
77
92
 
78
93
  # Internal state
@@ -123,6 +138,50 @@ module VagrantPlugins
123
138
  end
124
139
  end
125
140
 
141
+ # Merge defined disks
142
+ other_disks = other.instance_variable_get(:@disks)
143
+ new_disks = []
144
+ @disks.each do |p|
145
+ other_p = other_disks.find { |o| p.id == o.id }
146
+ if other_p
147
+ # there is an override. take it.
148
+ other_p.config = p.config.merge(other_p.config)
149
+
150
+ # Remove duplicate disk config from other
151
+ p = other_p
152
+ other_disks.delete(other_p)
153
+ end
154
+
155
+ # there is an override, merge it into the
156
+ new_disks << p.dup
157
+ end
158
+ other_disks.each do |p|
159
+ new_disks << p.dup
160
+ end
161
+ result.instance_variable_set(:@disks, new_disks)
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
+
126
185
  # Merge the providers by prepending any configuration blocks we
127
186
  # have for providers onto the new configuration.
128
187
  other_providers = other.instance_variable_get(:@__providers)
@@ -218,6 +277,11 @@ module VagrantPlugins
218
277
 
219
278
  options ||= {}
220
279
 
280
+ if options[:nfs]
281
+ options[:type] = :nfs
282
+ options.delete(:nfs)
283
+ end
284
+
221
285
  if options.has_key?(:name)
222
286
  synced_folder_name = options.delete(:name)
223
287
  else
@@ -341,7 +405,7 @@ module VagrantPlugins
341
405
 
342
406
  if Vagrant::Util::Experimental.feature_enabled?("dependency_provisioners")
343
407
  opts = {before: before, after: after}
344
- prov = VagrantConfigProvisioner.new(name, type.to_sym, opts)
408
+ prov = VagrantConfigProvisioner.new(name, type.to_sym, **opts)
345
409
  else
346
410
  prov = VagrantConfigProvisioner.new(name, type.to_sym)
347
411
  end
@@ -351,7 +415,9 @@ module VagrantPlugins
351
415
  prov.preserve_order = !!options.delete(:preserve_order) if \
352
416
  options.key?(:preserve_order)
353
417
  prov.run = options.delete(:run) if options.key?(:run)
354
- 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)
355
421
  nil
356
422
  end
357
423
 
@@ -384,6 +450,63 @@ module VagrantPlugins
384
450
  @__defined_vms[name].config_procs << [options[:config_version], block] if block
385
451
  end
386
452
 
453
+ # Stores disk config options from Vagrantfile
454
+ #
455
+ # @param [Symbol] type
456
+ # @param [Hash] options
457
+ # @param [Block] block
458
+ def disk(type, **options, &block)
459
+ disk_config = VagrantConfigDisk.new(type)
460
+
461
+ # Remove provider__option options before set_options, otherwise will
462
+ # show up as missing setting
463
+ # Extract provider hash options as well
464
+ provider_options = {}
465
+ options.delete_if do |p,o|
466
+ if o.is_a?(Hash) || p.to_s.include?("__")
467
+ provider_options[p] = o
468
+ true
469
+ end
470
+ end
471
+
472
+ disk_config.set_options(options)
473
+
474
+ # Add provider config
475
+ disk_config.add_provider_config(**provider_options, &block)
476
+
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.")
479
+ return
480
+ end
481
+
482
+ @disks << disk_config
483
+ end
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
+
387
510
  #-------------------------------------------------------------------
388
511
  # Internal methods, don't call these.
389
512
  #-------------------------------------------------------------------
@@ -410,6 +533,9 @@ module VagrantPlugins
410
533
  @box_download_location_trusted = false if @box_download_location_trusted == UNSET_VALUE
411
534
  @box_url = nil if @box_url == UNSET_VALUE
412
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
413
539
  @clone = nil if @clone == UNSET_VALUE
414
540
  @communicator = nil if @communicator == UNSET_VALUE
415
541
  @graceful_halt_timeout = 60 if @graceful_halt_timeout == UNSET_VALUE
@@ -533,20 +659,19 @@ module VagrantPlugins
533
659
 
534
660
  current_dir_shared = false
535
661
  @__synced_folders.each do |id, options|
536
- if options[:nfs]
537
- options[:type] = :nfs
538
- end
539
-
540
- # Ignore NFS on Windows
541
- if options[:type] == :nfs && Vagrant::Util::Platform.windows?
542
- options.delete(:type)
543
- end
544
-
545
662
  if options[:hostpath] == '.'
546
663
  current_dir_shared = true
547
664
  end
548
665
  end
549
666
 
667
+ @disks.each do |d|
668
+ d.finalize!
669
+ end
670
+
671
+ @cloud_init_configs.each do |c|
672
+ c.finalize!
673
+ end
674
+
550
675
  if !current_dir_shared && !@__synced_folders["/vagrant"]
551
676
  synced_folder(".", "/vagrant")
552
677
  end
@@ -601,6 +726,17 @@ module VagrantPlugins
601
726
  def validate(machine, ignore_provider=nil)
602
727
  errors = _detected_errors
603
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
+
604
740
  if !box && !clone && !machine.provider_options[:box_optional]
605
741
  errors << I18n.t("vagrant.config.vm.box_missing")
606
742
  end
@@ -609,7 +745,11 @@ module VagrantPlugins
609
745
  errors << I18n.t("vagrant.config.vm.clone_and_box")
610
746
  end
611
747
 
612
- errors << I18n.t("vagrant.config.vm.hostname_invalid_characters") if \
748
+ if box && box.empty?
749
+ errors << I18n.t("vagrant.config.vm.box_empty", machine_name: machine.name)
750
+ end
751
+
752
+ errors << I18n.t("vagrant.config.vm.hostname_invalid_characters", name: machine.name) if \
613
753
  @hostname && @hostname !~ /^[a-z0-9][-.a-z0-9]*$/i
614
754
 
615
755
  if @box_version
@@ -653,6 +793,19 @@ module VagrantPlugins
653
793
  end
654
794
  end
655
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
+
656
809
  used_guest_paths = Set.new
657
810
  @__synced_folders.each do |id, options|
658
811
  # If the shared folder is disabled then don't worry about validating it
@@ -694,9 +847,14 @@ module VagrantPlugins
694
847
  errors << I18n.t("vagrant.config.vm.shared_folder_mount_options_array")
695
848
  end
696
849
 
697
- # One day remove this probably.
698
- if options[:extra]
699
- 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
700
858
  end
701
859
  end
702
860
 
@@ -706,7 +864,17 @@ module VagrantPlugins
706
864
  valid_network_types = [:forwarded_port, :private_network, :public_network]
707
865
 
708
866
  port_range=(1..65535)
867
+ has_hostname_config = false
709
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
710
878
  if !valid_network_types.include?(type)
711
879
  errors << I18n.t("vagrant.config.vm.network_type_invalid",
712
880
  type: type.to_s)
@@ -748,6 +916,41 @@ module VagrantPlugins
748
916
  end
749
917
  end
750
918
 
919
+ # Validate disks
920
+ # Check if there is more than one primary disk defined and throw an error
921
+ primary_disks = @disks.select { |d| d.primary && d.type == :disk }
922
+ if primary_disks.size > 1
923
+ errors << I18n.t("vagrant.config.vm.multiple_primary_disks_error",
924
+ name: machine.name)
925
+ end
926
+
927
+ disk_names = @disks.map { |d| d.name }
928
+ duplicate_names = disk_names.find_all { |d| disk_names.count(d) > 1 }
929
+ if duplicate_names.any?
930
+ errors << I18n.t("vagrant.config.vm.multiple_disk_names_error",
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"))
941
+ end
942
+
943
+ @disks.each do |d|
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)
951
+ errors.concat error if !error.empty?
952
+ end
953
+
751
954
  # We're done with VM level errors so prepare the section
752
955
  errors = { "vm" => errors }
753
956
 
@@ -822,6 +1025,18 @@ module VagrantPlugins
822
1025
  end
823
1026
  end
824
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
+
825
1040
  errors
826
1041
  end
827
1042