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
@@ -10,6 +10,29 @@ module VagrantPlugins
10
10
 
11
11
  @logger = Log4r::Logger.new("vagrant::provider::virtualbox_6_1")
12
12
  end
13
+
14
+ def read_dhcp_servers
15
+ execute("list", "dhcpservers", retryable: true).split("\n\n").collect do |block|
16
+ info = {}
17
+
18
+ block.split("\n").each do |line|
19
+ if network = line[/^NetworkName:\s+HostInterfaceNetworking-(.+?)$/, 1]
20
+ info[:network] = network
21
+ info[:network_name] = "HostInterfaceNetworking-#{network}"
22
+ elsif ip = line[/^Dhcpd IP:\s+(.+?)$/, 1]
23
+ info[:ip] = ip
24
+ elsif netmask = line[/^NetworkMask:\s+(.+?)$/, 1]
25
+ info[:netmask] = netmask
26
+ elsif lower = line[/^LowerIPAddress:\s+(.+?)$/, 1]
27
+ info[:lower] = lower
28
+ elsif upper = line[/^UpperIPAddress:\s+(.+?)$/, 1]
29
+ info[:upper] = upper
30
+ end
31
+ end
32
+
33
+ info
34
+ end
35
+ end
13
36
  end
14
37
  end
15
38
  end
@@ -0,0 +1,135 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Model
4
+ # Represents a storage controller for VirtualBox. Storage controllers
5
+ # have a type, a name, and can have hard disks or optical drives attached.
6
+ class StorageController
7
+ IDE_CONTROLLER_TYPES = ["PIIX4", "PIIX3", "ICH6"].map(&:freeze).freeze
8
+ SATA_CONTROLLER_TYPES = ["IntelAhci"].map(&:freeze).freeze
9
+ SCSI_CONTROLLER_TYPES = [ "LsiLogic", "BusLogic"].map(&:freeze).freeze
10
+
11
+ IDE_DEVICES_PER_PORT = 2.freeze
12
+ SATA_DEVICES_PER_PORT = 1.freeze
13
+ SCSI_DEVICES_PER_PORT = 1.freeze
14
+
15
+ IDE_BOOT_PRIORITY = 1.freeze
16
+ SATA_BOOT_PRIORITY = 2.freeze
17
+ SCSI_BOOT_PRIORITY = 3.freeze
18
+
19
+ # The name of the storage controller.
20
+ #
21
+ # @return [String]
22
+ attr_reader :name
23
+
24
+ # The specific type of controller.
25
+ #
26
+ # @return [String]
27
+ attr_reader :type
28
+
29
+ # The maximum number of avilable ports for the storage controller.
30
+ #
31
+ # @return [Integer]
32
+ attr_reader :maxportcount
33
+
34
+ # The number of devices that can be attached to each port. For SATA
35
+ # controllers, this will usually be 1, and for IDE controllers this
36
+ # will usually be 2.
37
+ # @return [Integer]
38
+ attr_reader :devices_per_port
39
+
40
+ # The maximum number of individual disks that can be attached to the
41
+ # storage controller. For SATA controllers, this equals the maximum
42
+ # number of ports. For IDE controllers, this will be twice the max
43
+ # number of ports (primary/secondary).
44
+ #
45
+ # @return [Integer]
46
+ attr_reader :limit
47
+
48
+ # The boot priority of the storage controller. This does not seem to
49
+ # depend on the controller number returned by `showvminfo`.
50
+ # Experimentation has determined that VirtualBox will try to boot from
51
+ # the first controller it finds with a hard disk, in this order:
52
+ # IDE, SATA, SCSI
53
+ #
54
+ # @return [Integer]
55
+ attr_reader :boot_priority
56
+
57
+ # The list of disks/ISOs attached to each storage controller.
58
+ #
59
+ # @return [Array<Hash>]
60
+ attr_reader :attachments
61
+
62
+ def initialize(name, type, maxportcount, attachments)
63
+ @name = name
64
+ @type = type
65
+
66
+ @maxportcount = maxportcount.to_i
67
+
68
+ if IDE_CONTROLLER_TYPES.include?(@type)
69
+ @storage_bus = :ide
70
+ @devices_per_port = IDE_DEVICES_PER_PORT
71
+ @boot_priority = IDE_BOOT_PRIORITY
72
+ elsif SATA_CONTROLLER_TYPES.include?(@type)
73
+ @storage_bus = :sata
74
+ @devices_per_port = SATA_DEVICES_PER_PORT
75
+ @boot_priority = SATA_BOOT_PRIORITY
76
+ elsif SCSI_CONTROLLER_TYPES.include?(@type)
77
+ @storage_bus = :scsi
78
+ @devices_per_port = SCSI_DEVICES_PER_PORT
79
+ @boot_priority = SCSI_BOOT_PRIORITY
80
+ else
81
+ @storage_bus = :unknown
82
+ @devices_per_port = 1
83
+ end
84
+
85
+ @limit = @maxportcount * @devices_per_port
86
+
87
+ attachments ||= []
88
+ @attachments = attachments
89
+ end
90
+
91
+ # Get a single storage device, either by port/device address or by
92
+ # UUID.
93
+ #
94
+ # @param [Hash] opts - A hash of options to match
95
+ # @return [Hash] attachment - Attachment information
96
+ def get_attachment(opts = {})
97
+ if opts[:port] && opts[:device]
98
+ @attachments.detect { |a| a[:port] == opts[:port] &&
99
+ a[:device] == opts[:device] }
100
+ elsif opts[:uuid]
101
+ @attachments.detect { |a| a[:uuid] == opts[:uuid] }
102
+ end
103
+ end
104
+
105
+ # Returns true if the storage controller has a supported type.
106
+ #
107
+ # @return [Boolean]
108
+ def supported?
109
+ [:ide, :sata, :scsi].include?(@storage_bus)
110
+ end
111
+
112
+ # Returns true if the storage controller is a IDE type controller.
113
+ #
114
+ # @return [Boolean]
115
+ def ide?
116
+ @storage_bus == :ide
117
+ end
118
+
119
+ # Returns true if the storage controller is a SATA type controller.
120
+ #
121
+ # @return [Boolean]
122
+ def sata?
123
+ @storage_bus == :sata
124
+ end
125
+
126
+ # Returns true if the storage controller is a SCSI type controller.
127
+ #
128
+ # @return [Boolean]
129
+ def scsi?
130
+ @storage_bus == :scsi
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,98 @@
1
+ require_relative "../cap/validate_disk_ext"
2
+
3
+ module VagrantPlugins
4
+ module ProviderVirtualBox
5
+ module Model
6
+ # A collection of storage controllers. Includes finder methods to look
7
+ # up a storage controller by given attributes.
8
+ class StorageControllerArray < Array
9
+ # Returns a storage controller with the given name. Raises an
10
+ # exception if a matching controller can't be found.
11
+ #
12
+ # @param [String] name - The name of the storage controller
13
+ # @return [VagrantPlugins::ProviderVirtualBox::Model::StorageController]
14
+ def get_controller(name)
15
+ controller = detect { |c| c.name == name }
16
+ if !controller
17
+ raise Vagrant::Errors::VirtualBoxDisksControllerNotFound, name: name
18
+ end
19
+ controller
20
+ end
21
+
22
+ # Find the controller containing the primary disk (i.e. the boot
23
+ # disk). This is used to determine which controller virtual disks
24
+ # should be attached to.
25
+ #
26
+ # Raises an exception if no supported controllers are found.
27
+ #
28
+ # @return [VagrantPlugins::ProviderVirtualBox::Model::StorageController]
29
+ def get_primary_controller
30
+ ordered = find_all(&:supported?).sort_by(&:boot_priority)
31
+ controller = ordered.detect { |c| c.attachments.any? { |a| hdd?(a) } }
32
+
33
+ if !controller
34
+ raise Vagrant::Errors::VirtualBoxDisksNoSupportedControllers,
35
+ supported_types: supported_types.join(" ,")
36
+ end
37
+
38
+ controller
39
+ end
40
+
41
+ # Find the attachment representing the primary disk (i.e. the boot
42
+ # disk). We can't rely on the order of #list_hdds, as they will not
43
+ # always come in port order, but primary is always Port 0 Device 0.
44
+ #
45
+ # @return [Hash] attachment - Primary disk attachment information
46
+ def get_primary_attachment
47
+ attachment = nil
48
+
49
+ controller = get_primary_controller
50
+ attachment = controller.get_attachment(port: "0", device: "0")
51
+ if !attachment
52
+ raise Vagrant::Errors::VirtualBoxDisksPrimaryNotFound
53
+ end
54
+
55
+ attachment
56
+ end
57
+
58
+ # Returns the first supported storage controller for attaching dvds.
59
+ # Will raise an exception if no suitable controller can be found.
60
+ #
61
+ # @return [VagrantPlugins::ProviderVirtualBox::Model::StorageController]
62
+ def get_dvd_controller
63
+ ordered = find_all(&:supported?).sort_by(&:boot_priority)
64
+ controller = ordered.first
65
+ if !controller
66
+ raise Vagrant::Errors::VirtualBoxDisksNoSupportedControllers,
67
+ supported_types: supported_types.join(" ,")
68
+ end
69
+
70
+ controller
71
+ end
72
+
73
+ private
74
+
75
+ # Determine whether the given attachment is a hard disk.
76
+ #
77
+ # @param [Hash] attachment - Attachment information
78
+ # @return [Boolean]
79
+ def hdd?(attachment)
80
+ if !attachment
81
+ false
82
+ else
83
+ ext = File.extname(attachment[:location].to_s).downcase.split('.').last
84
+ VagrantPlugins::ProviderVirtualBox::Cap::ValidateDiskExt.validate_disk_ext(nil, ext)
85
+ end
86
+ end
87
+
88
+ # Returns a list of all the supported controller types.
89
+ #
90
+ # @return [Array<String>]
91
+ def supported_types
92
+ StorageController::SATA_CONTROLLER_TYPES + StorageController::IDE_CONTROLLER_TYPES +
93
+ StorageController::SCSI_CONTROLLER_TYPES
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -39,10 +39,50 @@ module VagrantPlugins
39
39
  Cap::PublicAddress
40
40
  end
41
41
 
42
+ provider_capability(:virtualbox, :configure_disks) do
43
+ require_relative "cap/configure_disks"
44
+ Cap::ConfigureDisks
45
+ end
46
+
47
+ provider_capability(:virtualbox, :cleanup_disks) do
48
+ require_relative "cap/cleanup_disks"
49
+ Cap::CleanupDisks
50
+ end
51
+
52
+ provider_capability(:virtualbox, :validate_disk_ext) do
53
+ require_relative "cap/validate_disk_ext"
54
+ Cap::ValidateDiskExt
55
+ end
56
+
57
+ provider_capability(:virtualbox, :default_disk_exts) do
58
+ require_relative "cap/validate_disk_ext"
59
+ Cap::ValidateDiskExt
60
+ end
61
+
62
+ provider_capability(:virtualbox, :set_default_disk_ext) do
63
+ require_relative "cap/validate_disk_ext"
64
+ Cap::ValidateDiskExt
65
+ end
66
+
42
67
  provider_capability(:virtualbox, :snapshot_list) do
43
68
  require_relative "cap"
44
69
  Cap
45
70
  end
71
+
72
+ synced_folder_capability(:virtualbox, "mount_options") do
73
+ require_relative "cap/mount_options"
74
+ Cap::MountOptions
75
+ end
76
+
77
+ synced_folder_capability(:virtualbox, "mount_type") do
78
+ require_relative "cap/mount_options"
79
+ Cap::MountOptions
80
+ end
81
+
82
+ synced_folder_capability(:virtualbox, "mount_name") do
83
+ require_relative "cap/mount_options"
84
+ Cap::MountOptions
85
+ end
46
86
  end
47
87
 
48
88
  autoload :Action, File.expand_path("../action", __FILE__)
@@ -64,6 +104,8 @@ module VagrantPlugins
64
104
 
65
105
  module Model
66
106
  autoload :ForwardedPort, File.expand_path("../model/forwarded_port", __FILE__)
107
+ autoload :StorageController, File.expand_path("../model/storage_controller", __FILE__)
108
+ autoload :StorageControllerArray, File.expand_path("../model/storage_controller_array", __FILE__)
67
109
  end
68
110
 
69
111
  module Util
@@ -23,7 +23,8 @@ module VagrantPlugins
23
23
  rescue Vagrant::Errors::VirtualBoxInvalidVersion,
24
24
  Vagrant::Errors::VirtualBoxNotDetected,
25
25
  Vagrant::Errors::VirtualBoxKernelModuleNotLoaded,
26
- Vagrant::Errors::VirtualBoxInstallIncomplete
26
+ Vagrant::Errors::VirtualBoxInstallIncomplete,
27
+ Vagrant::Errors::VBoxManageNotFoundError
27
28
  raise if raise_error
28
29
  return false
29
30
  end
@@ -33,6 +33,7 @@ module VagrantPlugins
33
33
 
34
34
  # Go through each folder and mount
35
35
  machine.ui.output(I18n.t("vagrant.actions.vm.share_folders.mounting"))
36
+ fstab_folders = []
36
37
  folders.each do |id, data|
37
38
  if data[:guestpath]
38
39
  # Guest path specified, so mount the folder to specified point
@@ -0,0 +1,44 @@
1
+ require_relative "../facts"
2
+ require_relative "../pip/pip"
3
+
4
+ module VagrantPlugins
5
+ module Ansible
6
+ module Cap
7
+ module Guest
8
+ module Alpine
9
+ module AnsibleInstall
10
+
11
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
12
+ case install_mode
13
+ when :pip
14
+ pip_setup machine, pip_install_cmd
15
+ Pip::pip_install machine, "ansible", ansible_version, pip_args, true
16
+ when :pip_args_only
17
+ pip_setup machine, pip_install_cmd
18
+ Pip::pip_install machine, "", "", pip_args, false
19
+ else
20
+ ansible_apk_install machine
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def self.ansible_apk_install(machine)
27
+ machine.communicate.sudo "apk add --update --no-cache python3 ansible"
28
+ machine.communicate.sudo "if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi"
29
+ machine.communicate.sudo "if [ ! -e /usr/bin/pip ]; then ln -sf pip3 /usr/bin/pip ; fi"
30
+ end
31
+
32
+ def self.pip_setup(machine, pip_install_cmd = "")
33
+ machine.communicate.sudo "apk add --update --no-cache python3"
34
+ machine.communicate.sudo "if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi"
35
+ machine.communicate.sudo "apk add --update --no-cache --virtual .build-deps python3-dev libffi-dev openssl-dev build-base"
36
+ Pip::get_pip machine, pip_install_cmd
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -11,7 +11,7 @@ module VagrantPlugins
11
11
  if install_mode != :default
12
12
  raise Ansible::Errors::AnsiblePipInstallIsNotSupported
13
13
  else
14
- machine.communicate.sudo "pkg install -qy py36-ansible"
14
+ machine.communicate.sudo "pkg install -qy py37-ansible"
15
15
  end
16
16
  end
17
17
 
@@ -45,6 +45,11 @@ module VagrantPlugins
45
45
  Cap::Guest::Arch::AnsibleInstall
46
46
  end
47
47
 
48
+ guest_capability(:alpine, :ansible_install) do
49
+ require_relative "cap/guest/alpine/ansible_install"
50
+ Cap::Guest::Alpine::AnsibleInstall
51
+ end
52
+
48
53
  guest_capability(:debian, :ansible_install) do
49
54
  require_relative "cap/guest/debian/ansible_install"
50
55
  Cap::Guest::Debian::AnsibleInstall
@@ -375,7 +375,7 @@ gathered version stdout version:
375
375
  config.compatibility_mode = Ansible::COMPATIBILITY_MODE_V2_0
376
376
  end
377
377
 
378
- @machine.env.ui.warn(I18n.t("vagrant.provisioners.ansible.compatibility_mode_warning",
378
+ @logger.info(I18n.t("vagrant.provisioners.ansible.compatibility_mode_warning",
379
379
  compatibility_mode: config.compatibility_mode,
380
380
  ansible_version: @gathered_version) +
381
381
  "\n")
@@ -0,0 +1,203 @@
1
+ require 'digest/sha1'
2
+
3
+ module VagrantPlugins
4
+ module ContainerProvisioner
5
+ class Client
6
+ def initialize(machine, container_command)
7
+ @machine = machine
8
+ @container_command = container_command
9
+ end
10
+
11
+ # Build an image given a path to a Dockerfile
12
+ #
13
+ # @param [String] - Path to the Dockerfile to pass to
14
+ # container build command
15
+ def build_images(images)
16
+ @machine.communicate.tap do |comm|
17
+ images.each do |path, opts|
18
+ @machine.ui.info(I18n.t("vagrant.container_building_single", path: path))
19
+ comm.sudo("#{@container_command} build #{opts[:args]} #{path}") do |type, data|
20
+ handle_comm(type, data)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # Pull image given a list of images
27
+ #
28
+ # @param [String] - Image name
29
+ def pull_images(*images)
30
+ @machine.communicate.tap do |comm|
31
+ images.each do |image|
32
+ @machine.ui.info(I18n.t("vagrant.container_pulling_single", name: image))
33
+ comm.sudo("#{@container_command} pull #{image}") do |type, data|
34
+ handle_comm(type, data)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def run(containers)
41
+ containers.each do |name, config|
42
+ cids_dir = "/var/lib/vagrant/cids"
43
+ config[:cidfile] ||= "#{cids_dir}/#{Digest::SHA1.hexdigest name}"
44
+
45
+ @machine.ui.info(I18n.t("vagrant.container_running", name: name))
46
+ @machine.communicate.sudo("mkdir -p #{cids_dir}")
47
+ run_container({
48
+ name: name,
49
+ original_name: name,
50
+ }.merge(config))
51
+ end
52
+ end
53
+
54
+ # Run a OCI container. If the container does not exist it will be
55
+ # created. If the image is stale it will be recreated and restarted
56
+ def run_container(config)
57
+ raise "Container's cidfile was not provided!" if !config[:cidfile]
58
+
59
+ id = "$(cat #{config[:cidfile]})"
60
+
61
+ if container_exists?(id)
62
+ if container_args_changed?(config)
63
+ @machine.ui.info(I18n.t("vagrant.container_restarting_container_args",
64
+ name: config[:name],
65
+ ))
66
+ stop_container(id)
67
+ create_container(config)
68
+ elsif container_image_changed?(config)
69
+ @machine.ui.info(I18n.t("vagrant.container_restarting_container_image",
70
+ name: config[:name],
71
+ ))
72
+ stop_container(id)
73
+ create_container(config)
74
+ else
75
+ start_container(id)
76
+ end
77
+ else
78
+ create_container(config)
79
+ end
80
+ end
81
+
82
+ def container_exists?(id)
83
+ lookup_container(id, true)
84
+ end
85
+
86
+ # Start container
87
+ #
88
+ # @param String - Image id
89
+ def start_container(id)
90
+ if !container_running?(id)
91
+ @machine.communicate.sudo("#{@container_command} start #{id}")
92
+ end
93
+ end
94
+
95
+ # Stop and remove container
96
+ #
97
+ # @param String - Image id
98
+ def stop_container(id)
99
+ @machine.communicate.sudo %[
100
+ #{@container_command} stop #{id}
101
+ #{@container_command} rm #{id}
102
+ ]
103
+ end
104
+
105
+ def container_running?(id)
106
+ lookup_container(id)
107
+ end
108
+
109
+ def container_image_changed?(config)
110
+ # Returns true if there is a container running with the given :name,
111
+ # and the container is not using the latest :image.
112
+
113
+ # Here, "<cmd> inspect <container>" returns the id of the image
114
+ # that the container is using. We check that the latest image that
115
+ # has been built with that name (:image) matches the one that the
116
+ # container is running.
117
+ cmd = ("#{@container_command} inspect --format='{{.Image}}' #{config[:name]} |" +
118
+ " grep $(#{@container_command} images -q #{config[:image]})")
119
+ return !@machine.communicate.test(cmd)
120
+ end
121
+
122
+ def container_args_changed?(config)
123
+ path = container_data_path(config)
124
+ return true if !path.exist?
125
+
126
+ args = container_run_args(config)
127
+ sha = Digest::SHA1.hexdigest(args)
128
+ return true if path.read.chomp != sha
129
+
130
+ return false
131
+ end
132
+
133
+ def create_container(config)
134
+ args = container_run_args(config)
135
+
136
+ @machine.communicate.sudo %[rm -f "#{config[:cidfile]}"]
137
+ @machine.communicate.sudo %[#{@container_command} run #{args}]
138
+
139
+ sha = Digest::SHA1.hexdigest(args)
140
+ container_data_path(config).open("w+") do |f|
141
+ f.write(sha)
142
+ end
143
+ end
144
+
145
+ # Looks up if a container with a given id exists using the
146
+ # `ps` command. Returns Boolean
147
+ #
148
+ # @param String - Image id
149
+ def lookup_container(id, list_all = false)
150
+ container_ps = "sudo #{@container_command} ps -q"
151
+ container_ps << " -a" if list_all
152
+ @machine.communicate.tap do |comm|
153
+ return comm.test("#{container_ps} --no-trunc | grep -wFq #{id}")
154
+ end
155
+ end
156
+
157
+ def container_name(config)
158
+ name = config[:name]
159
+
160
+ # If the name is the automatically assigned name, then
161
+ # replace the "/" with "-" because "/" is not a valid
162
+ # character for a container name.
163
+ name = name.gsub("/", "-").gsub(":", "-") if name == config[:original_name]
164
+ name
165
+ end
166
+
167
+ # Compiles run arguments to be appended to command string.
168
+ # Returns String
169
+ def container_run_args(config)
170
+ name = container_name(config)
171
+
172
+ args = "--cidfile=#{config[:cidfile]} "
173
+ args << "-d " if config[:daemonize]
174
+ args << "--name #{name} " if name && config[:auto_assign_name]
175
+ args << "--restart=#{config[:restart]}" if config[:restart]
176
+ args << " #{config[:args]}" if config[:args]
177
+
178
+ "#{args} #{config[:image]} #{config[:cmd]}".strip
179
+ end
180
+
181
+ def container_data_path(config)
182
+ name = container_name(config)
183
+ @machine.data_dir.join("#{@container_command}-#{name}")
184
+ end
185
+
186
+ protected
187
+
188
+ # This handles outputting the communication data back to the UI
189
+ def handle_comm(type, data)
190
+ if [:stderr, :stdout].include?(type)
191
+ # Clear out the newline since we add one
192
+ data = data.chomp
193
+ return if data.empty?
194
+
195
+ options = {}
196
+ #options[:color] = color if !config.keep_color
197
+
198
+ @machine.ui.info(data.chomp, options)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end