vagrant-unbundled 2.2.6.0 → 2.2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +14 -0
  3. data/CHANGELOG.md +93 -2
  4. data/README.md +1 -3
  5. data/bin/vagrant +23 -0
  6. data/contrib/bash/completion.sh +13 -1
  7. data/lib/vagrant.rb +25 -0
  8. data/lib/vagrant/action.rb +5 -0
  9. data/lib/vagrant/action/builder.rb +145 -24
  10. data/lib/vagrant/action/builtin/box_add.rb +11 -4
  11. data/lib/vagrant/action/builtin/box_check_outdated.rb +12 -15
  12. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  13. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  14. data/lib/vagrant/action/builtin/disk.rb +52 -0
  15. data/lib/vagrant/action/builtin/handle_box.rb +2 -0
  16. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  17. data/lib/vagrant/action/builtin/mixin_provisioners.rb +19 -1
  18. data/lib/vagrant/action/builtin/ssh_run.rb +21 -3
  19. data/lib/vagrant/action/builtin/trigger.rb +36 -0
  20. data/lib/vagrant/action/hook.rb +20 -2
  21. data/lib/vagrant/action/runner.rb +11 -26
  22. data/lib/vagrant/action/warden.rb +4 -18
  23. data/lib/vagrant/box_metadata.rb +17 -3
  24. data/lib/vagrant/bundler.rb +260 -53
  25. data/lib/vagrant/cli.rb +4 -2
  26. data/lib/vagrant/errors.rb +24 -0
  27. data/lib/vagrant/machine.rb +9 -6
  28. data/lib/vagrant/plugin/manager.rb +25 -14
  29. data/lib/vagrant/plugin/v2/command.rb +1 -1
  30. data/lib/vagrant/plugin/v2/manager.rb +53 -0
  31. data/lib/vagrant/plugin/v2/plugin.rb +1 -0
  32. data/lib/vagrant/plugin/v2/trigger.rb +64 -26
  33. data/lib/vagrant/shared_helpers.rb +28 -0
  34. data/lib/vagrant/ui.rb +50 -4
  35. data/lib/vagrant/util.rb +1 -0
  36. data/lib/vagrant/util/curl_helper.rb +8 -5
  37. data/lib/vagrant/util/downloader.rb +5 -1
  38. data/lib/vagrant/util/file_checksum.rb +6 -2
  39. data/lib/vagrant/util/guest_inspection.rb +9 -1
  40. data/lib/vagrant/util/io.rb +7 -27
  41. data/lib/vagrant/util/is_port_open.rb +1 -2
  42. data/lib/vagrant/util/map_command_options.rb +33 -0
  43. data/lib/vagrant/util/numeric.rb +69 -0
  44. data/lib/vagrant/util/platform.rb +8 -1
  45. data/plugins/commands/box/command/outdated.rb +14 -2
  46. data/plugins/commands/cloud/locales/en.yml +1 -1
  47. data/plugins/commands/cloud/publish.rb +1 -1
  48. data/plugins/commands/snapshot/command/save.rb +13 -8
  49. data/plugins/commands/ssh_config/command.rb +1 -1
  50. data/plugins/communicators/ssh/communicator.rb +18 -23
  51. data/plugins/communicators/winrm/config.rb +1 -1
  52. data/plugins/communicators/winrm/shell.rb +1 -1
  53. data/plugins/communicators/winssh/communicator.rb +126 -38
  54. data/plugins/communicators/winssh/config.rb +3 -7
  55. data/plugins/guests/alpine/cap/rsync.rb +1 -1
  56. data/plugins/guests/alpine/plugin.rb +16 -0
  57. data/plugins/guests/centos/cap/flavor.rb +24 -0
  58. data/plugins/guests/centos/guest.rb +9 -0
  59. data/plugins/guests/centos/plugin.rb +20 -0
  60. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +99 -13
  61. data/plugins/guests/darwin/plugin.rb +5 -0
  62. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  63. data/plugins/guests/linux/cap/halt.rb +9 -1
  64. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +16 -0
  65. data/plugins/guests/linux/cap/reboot.rb +48 -0
  66. data/plugins/guests/linux/plugin.rb +10 -0
  67. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  68. data/plugins/guests/redhat/cap/nfs_client.rb +2 -2
  69. data/plugins/guests/redhat/cap/smb.rb +20 -0
  70. data/plugins/guests/redhat/plugin.rb +5 -0
  71. data/plugins/guests/suse/cap/change_host_name.rb +2 -2
  72. data/plugins/guests/windows/cap/public_key.rb +3 -3
  73. data/plugins/guests/windows/cap/reboot.rb +2 -1
  74. data/plugins/hosts/darwin/cap/nfs.rb +11 -0
  75. data/plugins/hosts/darwin/plugin.rb +5 -0
  76. data/plugins/hosts/linux/cap/nfs.rb +21 -2
  77. data/plugins/kernel_v2/config/disk.rb +199 -0
  78. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  79. data/plugins/kernel_v2/config/vm.rb +109 -4
  80. data/plugins/kernel_v2/config/vm_provisioner.rb +4 -1
  81. data/plugins/kernel_v2/config/vm_trigger.rb +2 -5
  82. data/plugins/providers/docker/driver.rb +38 -10
  83. data/plugins/providers/docker/errors.rb +4 -0
  84. data/plugins/providers/docker/executor/local.rb +7 -1
  85. data/plugins/providers/hyperv/action/export.rb +4 -2
  86. data/plugins/providers/hyperv/driver.rb +10 -9
  87. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  88. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +6 -6
  89. data/plugins/providers/virtualbox/action.rb +2 -0
  90. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +10 -1
  91. data/plugins/providers/virtualbox/action/export.rb +4 -2
  92. data/plugins/providers/virtualbox/action/import.rb +8 -4
  93. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  94. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  95. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  96. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +54 -0
  97. data/plugins/providers/virtualbox/cap/configure_disks.rb +287 -0
  98. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +27 -0
  99. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  100. data/plugins/providers/virtualbox/driver/meta.rb +14 -2
  101. data/plugins/providers/virtualbox/driver/version_5_0.rb +142 -2
  102. data/plugins/providers/virtualbox/driver/version_6_1.rb +39 -0
  103. data/plugins/providers/virtualbox/plugin.rb +21 -0
  104. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  105. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +20 -3
  106. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +4 -5
  107. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +2 -2
  108. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +2 -2
  109. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +8 -4
  110. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +2 -2
  111. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +2 -1
  112. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +3 -3
  113. data/plugins/provisioners/ansible/plugin.rb +5 -0
  114. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  115. data/plugins/provisioners/container/client.rb +203 -0
  116. data/plugins/provisioners/container/config.rb +83 -0
  117. data/plugins/provisioners/container/installer.rb +13 -0
  118. data/plugins/provisioners/container/plugin.rb +23 -0
  119. data/plugins/provisioners/container/provisioner.rb +28 -0
  120. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  121. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  122. data/plugins/provisioners/docker/client.rb +4 -175
  123. data/plugins/provisioners/docker/config.rb +2 -72
  124. data/plugins/provisioners/docker/installer.rb +3 -5
  125. data/plugins/provisioners/docker/plugin.rb +6 -6
  126. data/plugins/provisioners/docker/provisioner.rb +4 -10
  127. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  128. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  129. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  130. data/plugins/provisioners/podman/client.rb +12 -0
  131. data/plugins/provisioners/podman/config.rb +28 -0
  132. data/plugins/provisioners/podman/installer.rb +33 -0
  133. data/plugins/provisioners/podman/plugin.rb +38 -0
  134. data/plugins/provisioners/podman/provisioner.rb +52 -0
  135. data/plugins/provisioners/salt/provisioner.rb +4 -0
  136. data/plugins/provisioners/shell/config.rb +1 -6
  137. data/plugins/provisioners/shell/provisioner.rb +54 -25
  138. data/plugins/synced_folders/smb/synced_folder.rb +1 -1
  139. data/templates/commands/init/Vagrantfile.erb +1 -1
  140. data/templates/locales/en.yml +123 -4
  141. data/templates/locales/providers_docker.yml +2 -0
  142. data/templates/nfs/exports_darwin.erb +7 -0
  143. data/vagrant.gemspec +8 -9
  144. data/version.txt +1 -1
  145. metadata +3731 -3663
  146. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  147. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  148. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
@@ -7,8 +7,7 @@ module VagrantPlugins
7
7
  module Debian
8
8
  module AnsibleInstall
9
9
 
10
-
11
- def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd="")
10
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
12
11
  case install_mode
13
12
  when :pip
14
13
  pip_setup machine, pip_install_cmd
@@ -33,12 +32,12 @@ INLINE_CRIPT
33
32
 
34
33
  machine.communicate.sudo install_backports_if_wheezy_release
35
34
  machine.communicate.sudo "apt-get update -y -qq"
36
- machine.communicate.sudo "apt-get install -y -qq ansible"
35
+ machine.communicate.sudo "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --option \"Dpkg::Options::=--force-confold\" ansible"
37
36
  end
38
37
 
39
- def self.pip_setup(machine, pip_install_cmd="")
38
+ def self.pip_setup(machine, pip_install_cmd = "")
40
39
  machine.communicate.sudo "apt-get update -y -qq"
41
- machine.communicate.sudo "apt-get install -y -qq build-essential curl git libssl-dev libffi-dev python-dev"
40
+ machine.communicate.sudo "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --option \"Dpkg::Options::=--force-confold\" build-essential curl git libssl-dev libffi-dev python-dev"
42
41
  Pip::get_pip machine, pip_install_cmd
43
42
  end
44
43
 
@@ -8,7 +8,7 @@ module VagrantPlugins
8
8
  module Fedora
9
9
  module AnsibleInstall
10
10
 
11
- def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd="")
11
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
12
12
  case install_mode
13
13
  when :pip
14
14
  pip_setup machine, pip_install_cmd
@@ -25,7 +25,7 @@ module VagrantPlugins
25
25
 
26
26
  private
27
27
 
28
- def self.pip_setup(machine, pip_install_cmd="")
28
+ def self.pip_setup(machine, pip_install_cmd = "")
29
29
  rpm_package_manager = Facts::rpm_package_manager(machine)
30
30
 
31
31
  machine.communicate.sudo "#{rpm_package_manager} install -y curl gcc gmp-devel libffi-devel openssl-devel python-crypto python-devel python-dnf python-setuptools redhat-rpm-config"
@@ -7,11 +7,11 @@ module VagrantPlugins
7
7
  module FreeBSD
8
8
  module AnsibleInstall
9
9
 
10
- def self.ansible_install(machine, install_mode, ansible_version, pip_args)
10
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
11
11
  if install_mode != :default
12
12
  raise Ansible::Errors::AnsiblePipInstallIsNotSupported
13
13
  else
14
- machine.communicate.sudo "yes | pkg install ansible"
14
+ machine.communicate.sudo "pkg install -qy py36-ansible"
15
15
  end
16
16
  end
17
17
 
@@ -16,19 +16,23 @@ module VagrantPlugins
16
16
  end
17
17
 
18
18
  args_array = [pip_args, upgrade_arg, "#{package}#{version_arg}"]
19
+ args_array.reject! { |a| a.nil? || a.empty? }
19
20
 
20
- machine.communicate.sudo "pip install #{args_array.join(' ')}"
21
+ pip_install = "pip install"
22
+ pip_install += " #{args_array.join(' ')}" unless args_array.empty?
23
+
24
+ machine.communicate.sudo pip_install
21
25
  end
22
26
 
23
- def self.get_pip(machine, pip_install_cmd=DEFAULT_PIP_INSTALL_CMD)
27
+ def self.get_pip(machine, pip_install_cmd = DEFAULT_PIP_INSTALL_CMD)
24
28
  # The objective here is to get pip either by default
25
- # or by the argument passed in. The objective is not
29
+ # or by the argument passed in. The objective is not
26
30
  # to circumvent the pip setup by passing in nothing.
27
31
  # Thus, we stick with the default on an empty string.
28
32
  # Typecast added in the check for safety.
29
33
 
30
34
  if pip_install_cmd.to_s.empty?
31
- pip_install_cmd=DEFAULT_PIP_INSTALL_CMD
35
+ pip_install_cmd = DEFAULT_PIP_INSTALL_CMD
32
36
  end
33
37
 
34
38
  machine.ui.detail I18n.t("vagrant.provisioners.ansible.installing_pip")
@@ -8,7 +8,7 @@ module VagrantPlugins
8
8
  module RedHat
9
9
  module AnsibleInstall
10
10
 
11
- def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd="")
11
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
12
12
  case install_mode
13
13
  when :pip
14
14
  pip_setup machine, pip_install_cmd
@@ -33,7 +33,7 @@ module VagrantPlugins
33
33
  machine.communicate.sudo "#{rpm_package_manager} -y --enablerepo=epel install ansible"
34
34
  end
35
35
 
36
- def self.pip_setup(machine, pip_install_cmd="")
36
+ def self.pip_setup(machine, pip_install_cmd = "")
37
37
  rpm_package_manager = Facts::rpm_package_manager(machine)
38
38
 
39
39
  machine.communicate.sudo("#{rpm_package_manager} -y install curl gcc libffi-devel openssl-devel python-crypto python-devel python-setuptools")
@@ -1,3 +1,4 @@
1
+ require_relative "../../../errors"
1
2
 
2
3
  module VagrantPlugins
3
4
  module Ansible
@@ -6,7 +7,7 @@ module VagrantPlugins
6
7
  module SUSE
7
8
  module AnsibleInstall
8
9
 
9
- def self.ansible_install(machine, install_mode, ansible_version, pip_args)
10
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
10
11
  if install_mode != :default
11
12
  raise Ansible::Errors::AnsiblePipInstallIsNotSupported
12
13
  else
@@ -7,7 +7,7 @@ module VagrantPlugins
7
7
  module Ubuntu
8
8
  module AnsibleInstall
9
9
 
10
- def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd="")
10
+ def self.ansible_install(machine, install_mode, ansible_version, pip_args, pip_install_cmd = "")
11
11
  if install_mode != :default
12
12
  Debian::AnsibleInstall::ansible_install machine, install_mode, ansible_version, pip_args, pip_install_cmd
13
13
  else
@@ -21,13 +21,13 @@ module VagrantPlugins
21
21
  unless machine.communicate.test("test -x \"$(which add-apt-repository)\"")
22
22
  machine.communicate.sudo """
23
23
  apt-get update -y -qq && \
24
- apt-get install -y -qq software-properties-common
24
+ DEBIAN_FRONTEND=noninteractive apt-get install -y -qq software-properties-common --option \"Dpkg::Options::=--force-confold\"
25
25
  """
26
26
  end
27
27
  machine.communicate.sudo """
28
28
  add-apt-repository ppa:ansible/ansible -y && \
29
29
  apt-get update -y -qq && \
30
- apt-get install -y -qq ansible
30
+ DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ansible --option \"Dpkg::Options::=--force-confold\"
31
31
  """
32
32
  end
33
33
 
@@ -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("/", "-") 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
@@ -0,0 +1,83 @@
1
+ require 'set'
2
+
3
+ module VagrantPlugins
4
+ module ContainerProvisioner
5
+ class Config < Vagrant.plugin("2", :config)
6
+ attr_reader :images
7
+ attr_accessor :post_install_provisioner
8
+
9
+ def initialize
10
+ @images = Set.new
11
+ @post_install_provisioner = nil
12
+
13
+ @__build_images = []
14
+ @__containers = Hash.new { |h, k| h[k] = {} }
15
+ end
16
+
17
+ # Accessor for internal state.
18
+ def build_images
19
+ @__build_images
20
+ end
21
+
22
+ # Accessor for the internal state.
23
+ def containers
24
+ @__containers
25
+ end
26
+
27
+ # Defines an image to build using `<cmd> build` within the machine.
28
+ #
29
+ # @param [String] path Path to the Dockerfile to pass to
30
+ # container build command
31
+ def build_image(path, **opts)
32
+ @__build_images << [path, opts]
33
+ end
34
+
35
+ def images=(images)
36
+ @images = Set.new(images)
37
+ end
38
+
39
+ def pull_images(*images)
40
+ @images += images.map(&:to_s)
41
+ end
42
+
43
+ def post_install_provision(name, **options, &block)
44
+ proxy = VagrantPlugins::Kernel_V2::VMConfig.new
45
+ proxy.provision(name, **options, &block)
46
+ @post_install_provisioner = proxy.provisioners.first
47
+ end
48
+
49
+ def run(name, **options)
50
+ @__containers[name.to_s] = options.dup
51
+ end
52
+
53
+ def merge(other)
54
+ super.tap do |result|
55
+ result.pull_images(*(other.images + self.images))
56
+
57
+ build_images = @__build_images.dup
58
+ build_images += other.build_images
59
+ result.instance_variable_set(:@__build_images, build_images)
60
+
61
+ containers = {}
62
+ @__containers.each do |name, params|
63
+ containers[name] = params.dup
64
+ end
65
+ other.containers.each do |name, params|
66
+ containers[name] = @__containers[name].merge(params)
67
+ end
68
+
69
+ result.instance_variable_set(:@__containers, containers)
70
+ end
71
+ end
72
+
73
+ def finalize!
74
+ @__containers.each do |name, params|
75
+ params[:image] ||= name
76
+ params[:auto_assign_name] = true if !params.key?(:auto_assign_name)
77
+ params[:daemonize] = true if !params.key?(:daemonize)
78
+ params[:restart] = "always" if !params.key?(:restart)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end