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.
- checksums.yaml +4 -4
- data/.hashibot.hcl +2 -0
- data/CHANGELOG.md +228 -0
- data/Gemfile +1 -1
- data/README.md +9 -51
- data/RELEASE.md +1 -1
- data/bin/vagrant +50 -1
- data/contrib/README.md +1 -0
- data/contrib/sudoers/linux-suse +2 -2
- data/contrib/zsh/_vagrant +738 -0
- data/contrib/zsh/generate_zsh_completion.rb +165 -0
- data/lib/vagrant.rb +28 -5
- data/lib/vagrant/action.rb +7 -0
- data/lib/vagrant/action/builder.rb +184 -38
- data/lib/vagrant/action/builtin/box_add.rb +24 -8
- data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
- data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
- data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
- data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
- data/lib/vagrant/action/builtin/delayed.rb +26 -0
- data/lib/vagrant/action/builtin/disk.rb +14 -1
- data/lib/vagrant/action/builtin/handle_box.rb +3 -1
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
- data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
- data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
- data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
- data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
- data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
- data/lib/vagrant/action/builtin/trigger.rb +37 -0
- data/lib/vagrant/action/hook.rb +76 -23
- data/lib/vagrant/action/runner.rb +12 -27
- data/lib/vagrant/action/warden.rb +28 -31
- data/lib/vagrant/box.rb +11 -4
- data/lib/vagrant/box_collection.rb +1 -1
- data/lib/vagrant/bundler.rb +310 -61
- data/lib/vagrant/cli.rb +4 -2
- data/lib/vagrant/environment.rb +1 -0
- data/lib/vagrant/errors.rb +69 -1
- data/lib/vagrant/machine.rb +64 -11
- data/lib/vagrant/machine_index.rb +28 -1
- data/lib/vagrant/patches/net-ssh.rb +186 -0
- data/lib/vagrant/plugin/manager.rb +45 -16
- data/lib/vagrant/plugin/v2/command.rb +7 -2
- data/lib/vagrant/plugin/v2/components.rb +6 -0
- data/lib/vagrant/plugin/v2/manager.rb +67 -0
- data/lib/vagrant/plugin/v2/plugin.rb +13 -0
- data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
- data/lib/vagrant/plugin/v2/trigger.rb +64 -25
- data/lib/vagrant/shared_helpers.rb +36 -0
- data/lib/vagrant/ui.rb +43 -2
- data/lib/vagrant/util.rb +2 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
- data/lib/vagrant/util/caps.rb +48 -0
- data/lib/vagrant/util/credential_scrubber.rb +1 -1
- data/lib/vagrant/util/curl_helper.rb +12 -8
- data/lib/vagrant/util/directory.rb +19 -0
- data/lib/vagrant/util/downloader.rb +10 -5
- data/lib/vagrant/util/guest_hosts.rb +68 -0
- data/lib/vagrant/util/guest_inspection.rb +9 -1
- data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
- data/lib/vagrant/util/io.rb +7 -27
- data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
- data/lib/vagrant/util/is_port_open.rb +8 -19
- data/lib/vagrant/util/map_command_options.rb +33 -0
- data/lib/vagrant/util/mime.rb +92 -0
- data/lib/vagrant/util/network_ip.rb +11 -1
- data/lib/vagrant/util/numeric.rb +28 -0
- data/lib/vagrant/util/platform.rb +10 -2
- data/lib/vagrant/util/powershell.rb +31 -15
- data/lib/vagrant/util/subprocess.rb +9 -1
- data/lib/vagrant/util/template_renderer.rb +2 -2
- data/lib/vagrant/util/uploader.rb +7 -4
- data/lib/vagrant/vagrantfile.rb +2 -2
- data/plugins/commands/autocomplete/command/install.rb +49 -0
- data/plugins/commands/autocomplete/command/root.rb +64 -0
- data/plugins/commands/autocomplete/plugin.rb +18 -0
- data/plugins/commands/cap/command.rb +5 -1
- data/plugins/commands/cloud/auth/login.rb +20 -23
- data/plugins/commands/cloud/auth/logout.rb +2 -10
- data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
- data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
- data/plugins/commands/cloud/auth/whoami.rb +18 -20
- data/plugins/commands/cloud/box/create.rb +33 -29
- data/plugins/commands/cloud/box/delete.rb +30 -24
- data/plugins/commands/cloud/box/show.rb +41 -31
- data/plugins/commands/cloud/box/update.rb +34 -26
- data/plugins/commands/cloud/client/client.rb +55 -79
- data/plugins/commands/cloud/list.rb +3 -4
- data/plugins/commands/cloud/locales/en.yml +15 -11
- data/plugins/commands/cloud/plugin.rb +10 -0
- data/plugins/commands/cloud/provider/create.rb +38 -28
- data/plugins/commands/cloud/provider/delete.rb +39 -29
- data/plugins/commands/cloud/provider/update.rb +37 -28
- data/plugins/commands/cloud/provider/upload.rb +53 -33
- data/plugins/commands/cloud/publish.rb +193 -106
- data/plugins/commands/cloud/search.rb +34 -21
- data/plugins/commands/cloud/util.rb +273 -161
- data/plugins/commands/cloud/version/create.rb +33 -28
- data/plugins/commands/cloud/version/delete.rb +35 -28
- data/plugins/commands/cloud/version/release.rb +35 -29
- data/plugins/commands/cloud/version/revoke.rb +36 -29
- data/plugins/commands/cloud/version/update.rb +29 -25
- data/plugins/commands/destroy/command.rb +7 -7
- data/plugins/commands/login/plugin.rb +0 -13
- data/plugins/commands/ssh_config/command.rb +1 -1
- data/plugins/communicators/ssh/communicator.rb +25 -24
- data/plugins/communicators/winrm/config.rb +1 -1
- data/plugins/communicators/winrm/helper.rb +1 -1
- data/plugins/communicators/winrm/shell.rb +1 -1
- data/plugins/communicators/winssh/communicator.rb +126 -38
- data/plugins/communicators/winssh/config.rb +3 -7
- data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
- data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
- data/plugins/guests/alt/cap/change_host_name.rb +40 -53
- data/plugins/guests/arch/cap/change_host_name.rb +5 -14
- data/plugins/guests/arch/cap/configure_networks.rb +27 -10
- data/plugins/guests/arch/cap/smb.rb +1 -1
- data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
- data/plugins/guests/centos/cap/flavor.rb +24 -0
- data/plugins/guests/centos/guest.rb +9 -0
- data/plugins/guests/centos/plugin.rb +20 -0
- data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
- data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
- data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
- data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
- data/plugins/guests/darwin/plugin.rb +15 -0
- data/plugins/guests/debian/cap/change_host_name.rb +12 -11
- data/plugins/guests/debian/cap/configure_networks.rb +14 -6
- data/plugins/guests/esxi/cap/public_key.rb +3 -1
- data/plugins/guests/fedora/guest.rb +4 -4
- data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
- data/plugins/guests/haiku/cap/rsync.rb +19 -0
- data/plugins/guests/haiku/plugin.rb +15 -0
- data/plugins/guests/linux/cap/change_host_name.rb +46 -0
- data/plugins/guests/linux/cap/halt.rb +9 -1
- data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
- data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
- data/plugins/guests/linux/cap/reboot.rb +36 -7
- data/plugins/guests/linux/plugin.rb +10 -0
- data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
- data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
- data/plugins/guests/openwrt/cap/halt.rb +16 -0
- data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
- data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
- data/plugins/guests/openwrt/cap/rsync.rb +35 -0
- data/plugins/guests/openwrt/guest.rb +23 -0
- data/plugins/guests/openwrt/plugin.rb +61 -0
- data/plugins/guests/photon/cap/change_host_name.rb +9 -15
- data/plugins/guests/pld/cap/change_host_name.rb +11 -17
- data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
- data/plugins/guests/redhat/cap/flavor.rb +3 -1
- data/plugins/guests/redhat/cap/smb.rb +20 -0
- data/plugins/guests/redhat/plugin.rb +5 -0
- data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
- data/plugins/guests/solaris11/plugin.rb +5 -0
- data/plugins/guests/suse/cap/change_host_name.rb +31 -9
- data/plugins/guests/windows/cap/public_key.rb +3 -3
- data/plugins/guests/windows/cap/reboot.rb +10 -5
- data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
- data/plugins/hosts/darwin/plugin.rb +10 -0
- data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
- data/plugins/hosts/linux/cap/nfs.rb +1 -0
- data/plugins/hosts/linux/cap/rdp.rb +1 -1
- data/plugins/hosts/linux/plugin.rb +10 -0
- data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
- data/plugins/hosts/windows/cap/rdp.rb +1 -1
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v2/config/cloud_init.rb +133 -0
- data/plugins/kernel_v2/config/disk.rb +67 -14
- data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
- data/plugins/kernel_v2/config/vm.rb +155 -21
- data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
- data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
- data/plugins/providers/docker/action.rb +8 -17
- data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
- data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
- data/plugins/providers/docker/cap/has_communicator.rb +11 -0
- data/plugins/providers/docker/communicator.rb +1 -1
- data/plugins/providers/docker/driver.rb +58 -7
- data/plugins/providers/docker/plugin.rb +5 -0
- data/plugins/providers/hyperv/action.rb +3 -1
- data/plugins/providers/hyperv/action/configure.rb +8 -0
- data/plugins/providers/hyperv/action/export.rb +4 -2
- data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
- data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
- data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/hyperv/config.rb +5 -0
- data/plugins/providers/hyperv/driver.rb +90 -9
- data/plugins/providers/hyperv/plugin.rb +25 -0
- data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
- data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
- data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
- data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
- data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
- data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
- data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
- data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
- data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
- data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
- data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
- data/plugins/providers/virtualbox/action.rb +13 -1
- data/plugins/providers/virtualbox/action/export.rb +4 -2
- data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
- data/plugins/providers/virtualbox/action/import.rb +8 -4
- data/plugins/providers/virtualbox/action/network.rb +12 -5
- data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
- data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
- data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
- data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
- data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/virtualbox/driver/base.rb +15 -0
- data/plugins/providers/virtualbox/driver/meta.rb +16 -2
- data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
- data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
- data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
- data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +2 -1
- data/plugins/providers/virtualbox/synced_folder.rb +1 -0
- data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
- data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
- data/plugins/provisioners/ansible/plugin.rb +5 -0
- data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
- data/plugins/provisioners/container/client.rb +203 -0
- data/plugins/provisioners/container/config.rb +83 -0
- data/plugins/provisioners/container/installer.rb +13 -0
- data/plugins/provisioners/container/plugin.rb +23 -0
- data/plugins/provisioners/container/provisioner.rb +28 -0
- data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
- data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
- data/plugins/provisioners/docker/client.rb +4 -175
- data/plugins/provisioners/docker/config.rb +2 -72
- data/plugins/provisioners/docker/installer.rb +3 -5
- data/plugins/provisioners/docker/plugin.rb +6 -6
- data/plugins/provisioners/docker/provisioner.rb +4 -10
- data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
- data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
- data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
- data/plugins/provisioners/podman/client.rb +12 -0
- data/plugins/provisioners/podman/config.rb +28 -0
- data/plugins/provisioners/podman/installer.rb +33 -0
- data/plugins/provisioners/podman/plugin.rb +38 -0
- data/plugins/provisioners/podman/provisioner.rb +52 -0
- data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
- data/plugins/provisioners/salt/provisioner.rb +4 -0
- data/plugins/provisioners/shell/config.rb +1 -6
- data/plugins/provisioners/shell/provisioner.rb +61 -26
- data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
- data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
- data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
- data/plugins/synced_folders/smb/plugin.rb +20 -0
- data/plugins/synced_folders/smb/synced_folder.rb +2 -2
- data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
- data/scripts/website_push_www.sh +1 -1
- data/templates/commands/init/Vagrantfile.min.erb +3 -0
- data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
- data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
- data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
- data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
- data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
- data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
- data/templates/guests/linux/etc_fstab.erb +6 -0
- data/templates/guests/nixos/network.erb +5 -6
- data/templates/locales/en.yml +221 -5
- data/templates/locales/providers_docker.yml +4 -0
- data/templates/nfs/exports_darwin.erb +1 -1
- data/vagrant.gemspec +14 -20
- data/version.txt +1 -1
- metadata +5092 -8978
- data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
- data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
- data/plugins/commands/login/client.rb +0 -253
- data/plugins/commands/login/command.rb +0 -137
- data/plugins/commands/login/errors.rb +0 -24
- data/plugins/commands/login/locales/en.yml +0 -49
- data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
- 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
|
@@ -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
|
-
@
|
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
|