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
@@ -0,0 +1,61 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module DockerProvider
|
3
|
+
module Action
|
4
|
+
class PrepareForwardedPortCollisionParams
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
machine = env[:machine]
|
11
|
+
|
12
|
+
# Get the forwarded ports used by other containers and
|
13
|
+
# consider those in use as well.
|
14
|
+
other_used_ports = machine.provider.driver.read_used_ports
|
15
|
+
env[:port_collision_extra_in_use] = other_used_ports
|
16
|
+
|
17
|
+
# Build the remap for any existing collision detections
|
18
|
+
#
|
19
|
+
# Note: This remap might not be required yet (as it is with the virtualbox provider)
|
20
|
+
# so for now we leave the remap hash empty.
|
21
|
+
remap = {}
|
22
|
+
env[:port_collision_remap] = remap
|
23
|
+
|
24
|
+
# This port checker method calls the custom port_check method
|
25
|
+
# defined below. If its false, it will go ahead and use the built-in
|
26
|
+
# port_check method to see if there are any live containers with bound
|
27
|
+
# ports
|
28
|
+
docker_port_check = proc { |host_ip, host_port|
|
29
|
+
result = port_check(env, host_port)
|
30
|
+
if !result
|
31
|
+
result = Vagrant::Action::Builtin::HandleForwardedPortCollisions.port_check(machine, host_ip, host_port)
|
32
|
+
end
|
33
|
+
result}
|
34
|
+
env[:port_collision_port_check] = docker_port_check
|
35
|
+
|
36
|
+
@app.call(env)
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
# This check is required the docker provider. Containers
|
42
|
+
# can bind ports but be halted. We don't want new containers to
|
43
|
+
# grab these bound ports, so this check is here for that since
|
44
|
+
# the checks above won't detect it
|
45
|
+
#
|
46
|
+
# @param [Vagrant::Environment] env
|
47
|
+
# @param [String] host_port
|
48
|
+
# @returns [Bool]
|
49
|
+
def port_check(env, host_port)
|
50
|
+
extra_in_use = env[:port_collision_extra_in_use]
|
51
|
+
|
52
|
+
if extra_in_use
|
53
|
+
return extra_in_use.include?(host_port.to_s)
|
54
|
+
else
|
55
|
+
return false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -24,13 +24,21 @@ module VagrantPlugins
|
|
24
24
|
args << dir
|
25
25
|
opts = {with_stderr: true}
|
26
26
|
result = execute('docker', 'build', *args, opts, &block)
|
27
|
-
|
27
|
+
# Check for the new output format 'writing image sha256...'
|
28
|
+
# In this case, docker buildkit is enabled. Its format is different
|
29
|
+
# from standard docker
|
30
|
+
matches = result.scan(/writing image .+:([^\s]+)/i).last
|
28
31
|
if !matches
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
if podman?
|
33
|
+
# Check for podman format when it is emulating docker CLI.
|
34
|
+
# Podman outputs the full hash of the container on
|
35
|
+
# the last line after a successful build.
|
36
|
+
match = result.split.select { |str| str.match?(/[0-9a-z]{64}/) }.last
|
37
|
+
return match[0..7] unless match.nil?
|
38
|
+
else
|
39
|
+
matches = result.scan(/Successfully built (.+)$/i).last
|
40
|
+
end
|
41
|
+
|
34
42
|
if !matches
|
35
43
|
# This will cause a stack trace in Vagrant, but it is a bug
|
36
44
|
# if this happens anyways.
|
@@ -39,7 +47,14 @@ module VagrantPlugins
|
|
39
47
|
end
|
40
48
|
|
41
49
|
# Return the matched group `id`
|
42
|
-
matches[
|
50
|
+
matches[0]
|
51
|
+
end
|
52
|
+
|
53
|
+
# Check if podman emulating docker CLI is enabled.
|
54
|
+
#
|
55
|
+
# @return [Bool]
|
56
|
+
def podman?
|
57
|
+
execute('docker', '--version').include?("podman")
|
43
58
|
end
|
44
59
|
|
45
60
|
def create(params, **opts, &block)
|
@@ -111,6 +126,41 @@ module VagrantPlugins
|
|
111
126
|
result =~ /^#{Regexp.escape(id)}$/
|
112
127
|
end
|
113
128
|
|
129
|
+
# Reads all current docker containers and determines what ports
|
130
|
+
# are currently registered to be forwarded
|
131
|
+
# {2222=>#<Set: {"127.0.0.1"}>, 8080=>#<Set: {"*"}>, 9090=>#<Set: {"*"}>}
|
132
|
+
#
|
133
|
+
# Note: This is this format because of what the builtin action for resolving colliding
|
134
|
+
# port forwards expects.
|
135
|
+
#
|
136
|
+
# @return [Hash[Set]] used_ports - {forward_port: #<Set: {"host ip address"}>}
|
137
|
+
def read_used_ports
|
138
|
+
used_ports = Hash.new{|hash,key| hash[key] = Set.new}
|
139
|
+
|
140
|
+
all_containers.each do |c|
|
141
|
+
container_info = inspect_container(c)
|
142
|
+
|
143
|
+
if container_info["HostConfig"]["PortBindings"]
|
144
|
+
port_bindings = container_info["HostConfig"]["PortBindings"]
|
145
|
+
next if port_bindings.empty? # Nothing defined, but not nil either
|
146
|
+
|
147
|
+
port_bindings.each do |guest_port,host_mapping|
|
148
|
+
host_mapping.each do |h|
|
149
|
+
if h["HostIp"] == ""
|
150
|
+
hostip = "*"
|
151
|
+
else
|
152
|
+
hostip = h["HostIp"]
|
153
|
+
end
|
154
|
+
hostport = h["HostPort"]
|
155
|
+
used_ports[hostport].add(hostip)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
used_ports
|
162
|
+
end
|
163
|
+
|
114
164
|
def running?(cid)
|
115
165
|
result = execute('docker', 'ps', '-q', '--no-trunc')
|
116
166
|
result =~ /^#{Regexp.escape cid}$/m
|
@@ -166,6 +216,7 @@ module VagrantPlugins
|
|
166
216
|
return true
|
167
217
|
rescue => e
|
168
218
|
return false if e.to_s.include?("is using it")
|
219
|
+
return false if e.to_s.include?("is being used")
|
169
220
|
raise if !e.to_s.include?("No such image")
|
170
221
|
end
|
171
222
|
|
@@ -149,10 +149,12 @@ module VagrantPlugins
|
|
149
149
|
b3.use NetSetMac
|
150
150
|
end
|
151
151
|
|
152
|
+
b3.use CleanupDisks
|
153
|
+
b3.use Disk
|
154
|
+
b3.use SyncedFolderCleanup
|
152
155
|
b3.use StartInstance
|
153
156
|
b3.use WaitForIPAddress
|
154
157
|
b3.use WaitForCommunicator, [:running]
|
155
|
-
b3.use SyncedFolderCleanup
|
156
158
|
b3.use SyncedFolders
|
157
159
|
b3.use SetHostname
|
158
160
|
end
|
@@ -97,6 +97,14 @@ module VagrantPlugins
|
|
97
97
|
env[:machine].provider_config.vm_integration_services)
|
98
98
|
end
|
99
99
|
|
100
|
+
if env[:machine].provider_config.enable_enhanced_session_mode
|
101
|
+
env[:ui].detail(I18n.t("vagrant.hyperv_enable_enhanced_session"))
|
102
|
+
env[:machine].provider.driver.set_enhanced_session_transport_type("HvSocket")
|
103
|
+
else
|
104
|
+
env[:ui].detail(I18n.t("vagrant.hyperv_disable_enhanced_session"))
|
105
|
+
env[:machine].provider.driver.set_enhanced_session_transport_type("VMBus")
|
106
|
+
end
|
107
|
+
|
100
108
|
@app.call(env)
|
101
109
|
end
|
102
110
|
end
|
@@ -25,8 +25,10 @@ module VagrantPlugins
|
|
25
25
|
@env[:ui].info I18n.t("vagrant.actions.vm.export.exporting")
|
26
26
|
export_tmp_dir = Vagrant::Util::Platform.wsl_to_windows_path(@env["export.temp_dir"])
|
27
27
|
@env[:machine].provider.driver.export(export_tmp_dir) do |progress|
|
28
|
-
@env[:ui].
|
29
|
-
|
28
|
+
@env[:ui].rewriting do |ui|
|
29
|
+
ui.clear_line
|
30
|
+
ui.report_progress(progress.percent, 100, false)
|
31
|
+
end
|
30
32
|
end
|
31
33
|
|
32
34
|
# Clear the line a final time so the next data can appear
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "vagrant/util/experimental"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module HyperV
|
6
|
+
module Cap
|
7
|
+
module CleanupDisks
|
8
|
+
LOGGER = Log4r::Logger.new("vagrant::plugins::hyperv::cleanup_disks")
|
9
|
+
|
10
|
+
# @param [Vagrant::Machine] machine
|
11
|
+
# @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
|
12
|
+
# @param [Hash] disk_meta_file - A hash of all the previously defined disks from the last configure_disk action
|
13
|
+
def self.cleanup_disks(machine, defined_disks, disk_meta_file)
|
14
|
+
return if disk_meta_file.values.flatten.empty?
|
15
|
+
|
16
|
+
return if !Vagrant::Util::Experimental.feature_enabled?("disks")
|
17
|
+
|
18
|
+
handle_cleanup_disk(machine, defined_disks, disk_meta_file["disk"])
|
19
|
+
# TODO: Floppy and DVD disks
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
# @param [Vagrant::Machine] machine
|
25
|
+
# @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
|
26
|
+
# @param [Hash] disk_meta - A hash of all the previously defined disks from the last configure_disk action
|
27
|
+
def self.handle_cleanup_disk(machine, defined_disks, disk_meta)
|
28
|
+
all_disks = machine.provider.driver.list_hdds
|
29
|
+
|
30
|
+
disk_meta.each do |d|
|
31
|
+
# look at Path instead of Name or UUID
|
32
|
+
disk_name = File.basename(d["Path"], '.*')
|
33
|
+
dsk = defined_disks.select { |dk| dk.name == disk_name }
|
34
|
+
|
35
|
+
if !dsk.empty? || d["primary"] == true
|
36
|
+
next
|
37
|
+
else
|
38
|
+
LOGGER.warn("Found disk not in Vagrantfile config: '#{d["Name"]}'. Removing disk from guest #{machine.name}")
|
39
|
+
|
40
|
+
machine.ui.warn(I18n.t("vagrant.cap.cleanup_disks.disk_cleanup", name: d["Name"]), prefix: true)
|
41
|
+
|
42
|
+
disk_actual = all_disks.select { |a| File.realdirpath(a["Path"]) == File.realdirpath(d["Path"]) }.first
|
43
|
+
if !disk_actual
|
44
|
+
machine.ui.warn(I18n.t("vagrant.cap.cleanup_disks.disk_not_found", name: d["Name"]), prefix: true)
|
45
|
+
else
|
46
|
+
machine.provider.driver.remove_disk(disk_actual["ControllerType"], disk_actual["ControllerNumber"], disk_actual["ControllerLocation"], disk_actual["Path"])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "fileutils"
|
3
|
+
require "vagrant/util/numeric"
|
4
|
+
require "vagrant/util/experimental"
|
5
|
+
|
6
|
+
module VagrantPlugins
|
7
|
+
module HyperV
|
8
|
+
module Cap
|
9
|
+
module ConfigureDisks
|
10
|
+
LOGGER = Log4r::Logger.new("vagrant::plugins::hyperv::configure_disks")
|
11
|
+
|
12
|
+
# @param [Vagrant::Machine] machine
|
13
|
+
# @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
|
14
|
+
# @return [Hash] configured_disks - A hash of all the current configured disks
|
15
|
+
def self.configure_disks(machine, defined_disks)
|
16
|
+
return {} if defined_disks.empty?
|
17
|
+
|
18
|
+
return {} if !Vagrant::Util::Experimental.feature_enabled?("disks")
|
19
|
+
|
20
|
+
machine.ui.info(I18n.t("vagrant.cap.configure_disks.start"))
|
21
|
+
|
22
|
+
current_disks = machine.provider.driver.list_hdds
|
23
|
+
|
24
|
+
configured_disks = {disk: [], floppy: [], dvd: []}
|
25
|
+
|
26
|
+
defined_disks.each do |disk|
|
27
|
+
if disk.type == :disk
|
28
|
+
disk_data = handle_configure_disk(machine, disk, current_disks)
|
29
|
+
configured_disks[:disk] << disk_data unless disk_data.empty?
|
30
|
+
elsif disk.type == :floppy
|
31
|
+
# TODO: Write me
|
32
|
+
machine.ui.info(I18n.t("vagrant.cap.configure_disks.floppy_not_supported", name: disk.name))
|
33
|
+
elsif disk.type == :dvd
|
34
|
+
# TODO: Write me
|
35
|
+
machine.ui.info(I18n.t("vagrant.cap.configure_disks.dvd_not_supported", name: disk.name))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
configured_disks
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
# @param [Vagrant::Machine] machine - the current machine
|
45
|
+
# @param [Config::Disk] disk - the current disk to configure
|
46
|
+
# @param [Array] all_disks - A list of all currently defined disks in VirtualBox
|
47
|
+
# @return [Hash] current_disk - Returns the current disk. Returns nil if it doesn't exist
|
48
|
+
def self.get_current_disk(machine, disk, all_disks)
|
49
|
+
current_disk = nil
|
50
|
+
if disk.primary
|
51
|
+
# Ensure we grab the proper primary disk
|
52
|
+
# We can't rely on the order of `all_disks`, as they will not
|
53
|
+
# always come in port order, but primary should always be Location 0 Number 0.
|
54
|
+
|
55
|
+
current_disk = all_disks.detect { |d| d["ControllerLocation"] == 0 && d["ControllerNumber"] == 0 }
|
56
|
+
|
57
|
+
# Need to get actual disk info to obtain UUID instead of what's returned
|
58
|
+
#
|
59
|
+
# This is not required for newly created disks, as its metadata is
|
60
|
+
# set when creating and attaching the disk. This is only for the primary
|
61
|
+
# disk, since it already exists.
|
62
|
+
current_disk = machine.provider.driver.get_disk(current_disk["Path"])
|
63
|
+
else
|
64
|
+
# Hyper-V disk names aren't the actual names of the disk, so we have
|
65
|
+
# to grab the name from the file path instead
|
66
|
+
current_disk = all_disks.detect { |d| File.basename(d["Path"], '.*') == disk.name}
|
67
|
+
end
|
68
|
+
|
69
|
+
current_disk
|
70
|
+
end
|
71
|
+
|
72
|
+
# Handles all disk configs of type `:disk`
|
73
|
+
#
|
74
|
+
# @param [Vagrant::Machine] machine - the current machine
|
75
|
+
# @param [Config::Disk] disk - the current disk to configure
|
76
|
+
# @param [Array] all_disks - A list of all currently defined disks in VirtualBox
|
77
|
+
# @return [Hash] - disk_metadata
|
78
|
+
def self.handle_configure_disk(machine, disk, all_disks)
|
79
|
+
disk_metadata = {}
|
80
|
+
|
81
|
+
# Grab the existing configured disk, if it exists
|
82
|
+
current_disk = get_current_disk(machine, disk, all_disks)
|
83
|
+
|
84
|
+
# Configure current disk
|
85
|
+
if !current_disk
|
86
|
+
# create new disk and attach
|
87
|
+
disk_metadata = create_disk(machine, disk)
|
88
|
+
elsif compare_disk_size(machine, disk, current_disk)
|
89
|
+
disk_metadata = resize_disk(machine, disk, current_disk)
|
90
|
+
else
|
91
|
+
disk_metadata = {UUID: current_disk["DiskIdentifier"], Name: disk.name, Path: current_disk["Path"]}
|
92
|
+
if disk.primary
|
93
|
+
disk_metadata[:primary] = true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
disk_metadata
|
98
|
+
end
|
99
|
+
|
100
|
+
# Check to see if current disk is configured based on defined_disks
|
101
|
+
#
|
102
|
+
# @param [Kernel_V2::VagrantConfigDisk] disk_config
|
103
|
+
# @param [Hash] defined_disk
|
104
|
+
# @return [Boolean]
|
105
|
+
def self.compare_disk_size(machine, disk_config, defined_disk)
|
106
|
+
# Hyper-V returns disk size in bytes
|
107
|
+
requested_disk_size = disk_config.size
|
108
|
+
disk_actual = machine.provider.driver.get_disk(defined_disk["Path"])
|
109
|
+
defined_disk_size = disk_actual["Size"]
|
110
|
+
|
111
|
+
if defined_disk_size > requested_disk_size
|
112
|
+
if File.extname(disk_actual["Path"]) == ".vhdx"
|
113
|
+
# VHDX formats can be shrunk
|
114
|
+
return true
|
115
|
+
else
|
116
|
+
machine.ui.warn(I18n.t("vagrant.cap.configure_disks.shrink_size_not_supported", name: disk_config.name))
|
117
|
+
return false
|
118
|
+
end
|
119
|
+
elsif defined_disk_size < requested_disk_size
|
120
|
+
return true
|
121
|
+
else
|
122
|
+
return false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Creates and attaches a disk to a machine
|
127
|
+
#
|
128
|
+
# @param [Vagrant::Machine] machine
|
129
|
+
# @param [Kernel_V2::VagrantConfigDisk] disk_config
|
130
|
+
def self.create_disk(machine, disk_config)
|
131
|
+
machine.ui.detail(I18n.t("vagrant.cap.configure_disks.create_disk", name: disk_config.name))
|
132
|
+
disk_provider_config = {}
|
133
|
+
|
134
|
+
if disk_config.provider_config && disk_config.provider_config.key?(:hyperv)
|
135
|
+
disk_provider_config = disk_config.provider_config[:hyperv]
|
136
|
+
end
|
137
|
+
|
138
|
+
if !disk_provider_config.empty?
|
139
|
+
disk_provider_config = convert_size_vars!(disk_provider_config)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Get the machines data dir, that will now be the path for the new disk
|
143
|
+
guest_disk_folder = machine.data_dir.join("Virtual Hard Disks")
|
144
|
+
|
145
|
+
if disk_config.file
|
146
|
+
disk_file = disk_config.file
|
147
|
+
LOGGER.info("Disk already defined by user at '#{disk_file}'. Using this disk instead of creating a new one...")
|
148
|
+
else
|
149
|
+
# Set the extension
|
150
|
+
disk_ext = disk_config.disk_ext
|
151
|
+
disk_file = File.join(guest_disk_folder, disk_config.name) + ".#{disk_ext}"
|
152
|
+
|
153
|
+
LOGGER.info("Attempting to create a new disk file '#{disk_file}' of size '#{disk_config.size}' bytes")
|
154
|
+
|
155
|
+
machine.provider.driver.create_disk(disk_file, disk_config.size, disk_provider_config)
|
156
|
+
end
|
157
|
+
|
158
|
+
disk_info = machine.provider.driver.get_disk(disk_file)
|
159
|
+
disk_metadata = {UUID: disk_info["DiskIdentifier"], Name: disk_config.name, Path: disk_info["Path"]}
|
160
|
+
|
161
|
+
machine.provider.driver.attach_disk(disk_file, disk_provider_config)
|
162
|
+
|
163
|
+
disk_metadata
|
164
|
+
end
|
165
|
+
|
166
|
+
# Converts any "shortcut" options such as "123MB" into its byte form. This
|
167
|
+
# is due to what parameter type is expected when calling the `New-VHD`
|
168
|
+
# powershell command
|
169
|
+
#
|
170
|
+
# @param [Hash] disk_provider_config
|
171
|
+
# @return [Hash] disk_provider_config
|
172
|
+
def self.convert_size_vars!(disk_provider_config)
|
173
|
+
if disk_provider_config.key?(:BlockSizeBytes)
|
174
|
+
bytes = Vagrant::Util::Numeric.string_to_bytes(disk_provider_config[:BlockSizeBytes])
|
175
|
+
disk_provider_config[:BlockSizeBytes] = bytes
|
176
|
+
end
|
177
|
+
|
178
|
+
disk_provider_config
|
179
|
+
end
|
180
|
+
|
181
|
+
# @param [Vagrant::Machine] machine
|
182
|
+
# @param [Config::Disk] disk_config - the current disk to configure
|
183
|
+
# @param [Hash] defined_disk - current disk as represented by VirtualBox
|
184
|
+
# @return [Hash] - disk_metadata
|
185
|
+
def self.resize_disk(machine, disk_config, defined_disk)
|
186
|
+
machine.ui.detail(I18n.t("vagrant.cap.configure_disks.resize_disk", name: disk_config.name), prefix: true)
|
187
|
+
|
188
|
+
machine.provider.driver.resize_disk(defined_disk["Path"], disk_config.size.to_i)
|
189
|
+
|
190
|
+
disk_info = machine.provider.driver.get_disk(defined_disk["Path"])
|
191
|
+
|
192
|
+
# Store updated metadata
|
193
|
+
disk_metadata = {UUID: disk_info["DiskIdentifier"], Name: disk_config.name, Path: disk_info["Path"]}
|
194
|
+
|
195
|
+
disk_metadata
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|