vagrant-unbundled 1.8.1.2 → 1.8.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (348) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -13
  3. data/.travis.yml +3 -0
  4. data/CHANGELOG.md +167 -4
  5. data/LICENSE +1 -1
  6. data/README.md +7 -9
  7. data/RELEASE.md +28 -0
  8. data/bin/vagrant +1 -1
  9. data/contrib/bash/completion.sh +6 -1
  10. data/contrib/sudoers/linux-fedora +1 -1
  11. data/keys/README.md +1 -1
  12. data/lib/vagrant/action/builtin/box_add.rb +7 -3
  13. data/lib/vagrant/action/general/package.rb +47 -13
  14. data/lib/vagrant/box.rb +1 -1
  15. data/lib/vagrant/box_collection.rb +3 -4
  16. data/lib/vagrant/bundler.rb +29 -11
  17. data/lib/vagrant/machine.rb +14 -5
  18. data/lib/vagrant/ui.rb +1 -1
  19. data/lib/vagrant/util/is_port_open.rb +1 -1
  20. data/lib/vagrant/util/platform.rb +67 -42
  21. data/plugins/commands/box/command/remove.rb +1 -1
  22. data/plugins/commands/box/command/update.rb +10 -0
  23. data/plugins/commands/destroy/command.rb +1 -1
  24. data/plugins/commands/halt/command.rb +1 -1
  25. data/plugins/commands/init/command.rb +8 -2
  26. data/plugins/commands/login/client.rb +19 -1
  27. data/plugins/commands/package/command.rb +1 -1
  28. data/plugins/commands/plugin/command/mixin_install_opts.rb +1 -1
  29. data/plugins/commands/plugin/gem_helper.rb +1 -1
  30. data/plugins/commands/port/command.rb +1 -1
  31. data/plugins/commands/rdp/command.rb +1 -1
  32. data/plugins/commands/resume/command.rb +15 -1
  33. data/plugins/commands/snapshot/command/pop.rb +16 -1
  34. data/plugins/commands/snapshot/command/push_shared.rb +7 -9
  35. data/plugins/commands/snapshot/command/restore.rb +14 -1
  36. data/plugins/commands/ssh/command.rb +2 -1
  37. data/plugins/commands/ssh_config/command.rb +1 -1
  38. data/plugins/commands/status/command.rb +1 -1
  39. data/plugins/commands/suspend/command.rb +1 -1
  40. data/plugins/commands/up/command.rb +4 -4
  41. data/plugins/communicators/ssh/communicator.rb +2 -2
  42. data/plugins/communicators/winrm/communicator.rb +11 -11
  43. data/plugins/communicators/winrm/config.rb +7 -1
  44. data/plugins/communicators/winrm/shell.rb +41 -41
  45. data/plugins/guests/amazon/cap/flavor.rb +14 -0
  46. data/plugins/guests/amazon/guest.rb +9 -0
  47. data/plugins/guests/amazon/plugin.rb +20 -0
  48. data/plugins/guests/arch/cap/change_host_name.rb +15 -6
  49. data/plugins/guests/arch/cap/configure_networks.rb +33 -14
  50. data/plugins/guests/arch/plugin.rb +1 -1
  51. data/plugins/guests/atomic/cap/change_host_name.rb +16 -1
  52. data/plugins/guests/atomic/plugin.rb +2 -2
  53. data/plugins/guests/coreos/cap/change_host_name.rb +10 -4
  54. data/plugins/guests/coreos/cap/configure_networks.rb +49 -37
  55. data/plugins/guests/coreos/guest.rb +2 -0
  56. data/plugins/guests/coreos/plugin.rb +1 -1
  57. data/plugins/guests/darwin/cap/change_host_name.rb +25 -7
  58. data/plugins/guests/darwin/cap/choose_addressable_ip_addr.rb +7 -7
  59. data/plugins/guests/darwin/cap/insert_public_key.rb +19 -7
  60. data/plugins/guests/darwin/guest.rb +1 -1
  61. data/plugins/guests/darwin/plugin.rb +1 -1
  62. data/plugins/guests/debian/cap/change_host_name.rb +37 -84
  63. data/plugins/guests/debian/cap/configure_networks.rb +61 -46
  64. data/plugins/guests/debian/cap/nfs_client.rb +5 -4
  65. data/plugins/guests/debian/cap/rsync.rb +6 -3
  66. data/plugins/guests/debian/cap/smb.rb +6 -7
  67. data/plugins/guests/debian/guest.rb +2 -0
  68. data/plugins/guests/debian/plugin.rb +1 -1
  69. data/plugins/guests/fedora/cap/change_host_name.rb +18 -64
  70. data/plugins/guests/fedora/cap/configure_networks.rb +10 -9
  71. data/plugins/guests/fedora/plugin.rb +1 -1
  72. data/plugins/guests/freebsd/cap/change_host_name.rb +21 -3
  73. data/plugins/guests/freebsd/cap/configure_networks.rb +45 -30
  74. data/plugins/guests/freebsd/cap/halt.rb +1 -1
  75. data/plugins/guests/freebsd/cap/insert_public_key.rb +21 -8
  76. data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +10 -7
  77. data/plugins/guests/freebsd/cap/rsync.rb +1 -11
  78. data/plugins/guests/freebsd/plugin.rb +1 -1
  79. data/plugins/guests/funtoo/cap/configure_networks.rb +10 -6
  80. data/plugins/guests/gentoo/cap/configure_networks.rb +9 -8
  81. data/plugins/guests/linux/cap/choose_addressable_ip_addr.rb +6 -6
  82. data/plugins/guests/linux/cap/insert_public_key.rb +18 -8
  83. data/plugins/guests/linux/cap/mount_nfs.rb +16 -12
  84. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +2 -2
  85. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +1 -1
  86. data/plugins/guests/linux/guest.rb +0 -2
  87. data/plugins/guests/linux/plugin.rb +1 -1
  88. data/plugins/guests/mint/guest.rb +0 -2
  89. data/plugins/guests/mint/plugin.rb +1 -1
  90. data/plugins/guests/netbsd/cap/configure_networks.rb +8 -8
  91. data/plugins/guests/nixos/cap/change_host_name.rb +11 -8
  92. data/plugins/guests/nixos/cap/configure_networks.rb +12 -9
  93. data/plugins/guests/omnios/cap/change_host_name.rb +17 -5
  94. data/plugins/guests/omnios/cap/mount_nfs_folder.rb +10 -4
  95. data/plugins/guests/omnios/cap/rsync.rb +11 -0
  96. data/plugins/guests/omnios/guest.rb +0 -2
  97. data/plugins/guests/omnios/plugin.rb +6 -1
  98. data/plugins/guests/openbsd/cap/configure_networks.rb +8 -6
  99. data/plugins/guests/photon/cap/change_host_name.rb +17 -4
  100. data/plugins/guests/photon/cap/configure_networks.rb +14 -26
  101. data/plugins/guests/photon/guest.rb +1 -1
  102. data/plugins/guests/photon/plugin.rb +12 -12
  103. data/plugins/guests/pld/cap/change_host_name.rb +21 -9
  104. data/plugins/guests/pld/guest.rb +0 -2
  105. data/plugins/guests/pld/plugin.rb +1 -1
  106. data/plugins/guests/redhat/cap/change_host_name.rb +30 -96
  107. data/plugins/guests/redhat/cap/configure_networks.rb +44 -50
  108. data/plugins/guests/redhat/cap/flavor.rb +3 -4
  109. data/plugins/guests/redhat/cap/nfs_client.rb +13 -25
  110. data/plugins/guests/redhat/cap/rsync.rb +6 -6
  111. data/plugins/guests/redhat/guest.rb +0 -2
  112. data/plugins/guests/redhat/plugin.rb +1 -10
  113. data/plugins/guests/slackware/cap/change_host_name.rb +19 -8
  114. data/plugins/guests/slackware/cap/configure_networks.rb +30 -14
  115. data/plugins/guests/slackware/guest.rb +0 -2
  116. data/plugins/guests/slackware/plugin.rb +1 -1
  117. data/plugins/guests/smartos/config.rb +3 -15
  118. data/plugins/guests/suse/cap/change_host_name.rb +15 -7
  119. data/plugins/guests/suse/cap/configure_networks.rb +31 -37
  120. data/plugins/guests/suse/cap/nfs_client.rb +5 -6
  121. data/plugins/guests/suse/cap/rsync.rb +1 -3
  122. data/plugins/guests/suse/guest.rb +0 -2
  123. data/plugins/guests/suse/plugin.rb +1 -1
  124. data/plugins/guests/tinycore/cap/mount_nfs.rb +46 -0
  125. data/plugins/guests/tinycore/plugin.rb +5 -0
  126. data/plugins/guests/trisquel/guest.rb +9 -0
  127. data/plugins/guests/trisquel/plugin.rb +15 -0
  128. data/plugins/guests/ubuntu/cap/change_host_name.rb +42 -41
  129. data/plugins/guests/ubuntu/guest.rb +0 -2
  130. data/plugins/guests/ubuntu/plugin.rb +1 -3
  131. data/plugins/guests/windows/guest_network.rb +1 -1
  132. data/plugins/hosts/arch/cap/nfs.rb +3 -19
  133. data/plugins/hosts/darwin/cap/provider_install_virtualbox.rb +4 -5
  134. data/plugins/hosts/darwin/cap/rdp.rb +34 -6
  135. data/plugins/hosts/gentoo/cap/nfs.rb +1 -1
  136. data/plugins/hosts/windows/cap/provider_install_virtualbox.rb +4 -5
  137. data/plugins/hosts/windows/cap/ps.rb +2 -2
  138. data/plugins/hosts/windows/cap/rdp.rb +8 -17
  139. data/plugins/kernel_v2/config/ssh_connect.rb +6 -0
  140. data/plugins/kernel_v2/config/vm.rb +3 -1
  141. data/plugins/providers/docker/action.rb +3 -3
  142. data/plugins/providers/docker/action/create.rb +1 -1
  143. data/plugins/providers/docker/command/exec.rb +104 -0
  144. data/plugins/providers/docker/config.rb +9 -1
  145. data/plugins/providers/docker/errors.rb +4 -0
  146. data/plugins/providers/docker/plugin.rb +6 -0
  147. data/plugins/providers/docker/provider.rb +1 -2
  148. data/plugins/providers/hyperv/action.rb +56 -1
  149. data/plugins/providers/hyperv/action/import.rb +13 -5
  150. data/plugins/providers/hyperv/action/snapshot_delete.rb +27 -0
  151. data/plugins/providers/hyperv/action/snapshot_restore.rb +23 -0
  152. data/plugins/providers/hyperv/action/snapshot_save.rb +27 -0
  153. data/plugins/providers/hyperv/cap/snapshot_list.rb +11 -0
  154. data/plugins/providers/hyperv/config.rb +5 -2
  155. data/plugins/providers/hyperv/driver.rb +18 -1
  156. data/plugins/providers/hyperv/plugin.rb +5 -0
  157. data/plugins/providers/hyperv/scripts/clone_vhd.ps1 +9 -0
  158. data/plugins/providers/hyperv/scripts/create_snapshot.ps1 +8 -0
  159. data/plugins/providers/hyperv/scripts/delete_snapshot.ps1 +8 -0
  160. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +8 -2
  161. data/plugins/providers/hyperv/scripts/import_vm.ps1 +5 -1
  162. data/plugins/providers/hyperv/scripts/list_snapshots.ps1 +12 -0
  163. data/plugins/providers/hyperv/scripts/restore_snapshot.ps1 +8 -0
  164. data/plugins/providers/virtualbox/action.rb +9 -4
  165. data/plugins/providers/virtualbox/action/import_master.rb +81 -75
  166. data/plugins/providers/virtualbox/action/package.rb +1 -29
  167. data/plugins/providers/virtualbox/action/package_setup_files.rb +51 -0
  168. data/plugins/providers/virtualbox/action/package_setup_folders.rb +38 -0
  169. data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +23 -1
  170. data/plugins/providers/virtualbox/action/setup_package_files.rb +9 -43
  171. data/plugins/providers/virtualbox/driver/version_4_1.rb +104 -6
  172. data/plugins/providers/virtualbox/driver/version_4_2.rb +6 -5
  173. data/plugins/providers/virtualbox/driver/version_4_3.rb +6 -5
  174. data/plugins/providers/virtualbox/driver/version_5_0.rb +6 -5
  175. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +8 -3
  176. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +26 -4
  177. data/plugins/provisioners/ansible/cap/guest/facts.rb +24 -0
  178. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +16 -6
  179. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +7 -2
  180. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +28 -0
  181. data/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb +1 -1
  182. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +24 -7
  183. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +6 -2
  184. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +17 -6
  185. data/plugins/provisioners/ansible/config/base.rb +15 -23
  186. data/plugins/provisioners/ansible/config/guest.rb +9 -22
  187. data/plugins/provisioners/ansible/config/host.rb +9 -19
  188. data/plugins/provisioners/ansible/errors.rb +4 -0
  189. data/plugins/provisioners/ansible/helpers.rb +4 -24
  190. data/plugins/provisioners/ansible/provisioner/base.rb +58 -10
  191. data/plugins/provisioners/ansible/provisioner/guest.rb +55 -22
  192. data/plugins/provisioners/ansible/provisioner/host.rb +50 -9
  193. data/plugins/provisioners/chef/cap/linux/chef_installed.rb +2 -2
  194. data/plugins/provisioners/chef/cap/omnios/chef_installed.rb +3 -3
  195. data/plugins/provisioners/chef/cap/redhat/chef_install.rb +7 -11
  196. data/plugins/provisioners/chef/cap/suse/chef_install.rb +27 -0
  197. data/plugins/provisioners/chef/cap/windows/chef_installed.rb +1 -1
  198. data/plugins/provisioners/chef/command_builder.rb +1 -0
  199. data/plugins/provisioners/chef/config/base.rb +5 -6
  200. data/plugins/provisioners/chef/config/chef_solo.rb +6 -0
  201. data/plugins/provisioners/chef/installer.rb +2 -2
  202. data/plugins/provisioners/chef/omnibus.rb +1 -1
  203. data/plugins/provisioners/chef/plugin.rb +5 -0
  204. data/plugins/provisioners/chef/provisioner/base.rb +52 -56
  205. data/plugins/provisioners/chef/provisioner/chef_apply.rb +9 -10
  206. data/plugins/provisioners/chef/provisioner/chef_client.rb +1 -1
  207. data/plugins/provisioners/chef/provisioner/chef_solo.rb +1 -0
  208. data/plugins/provisioners/docker/client.rb +22 -4
  209. data/plugins/provisioners/puppet/provisioner/puppet.rb +3 -3
  210. data/plugins/provisioners/salt/provisioner.rb +19 -24
  211. data/plugins/pushes/ftp/adapter.rb +18 -1
  212. data/plugins/pushes/heroku/locales/en.yml +1 -1
  213. data/plugins/synced_folders/rsync/helper.rb +1 -1
  214. data/templates/commands/init/Vagrantfile.erb +6 -3
  215. data/templates/commands/init/Vagrantfile.min.erb +1 -1
  216. data/templates/commands/ssh_config/config.erb +5 -1
  217. data/templates/guests/debian/network_dhcp.erb +2 -2
  218. data/templates/guests/debian/network_static.erb +2 -2
  219. data/templates/guests/debian/network_static6.erb +2 -2
  220. data/templates/guests/fedora/network_static6.erb +9 -0
  221. data/templates/guests/freebsd/network_dhcp.erb +2 -1
  222. data/templates/guests/freebsd/network_static.erb +1 -1
  223. data/templates/guests/slackware/network_dhcp.erb +8 -20
  224. data/templates/guests/slackware/network_static.erb +10 -22
  225. data/templates/guests/suse/network_dhcp.erb +1 -1
  226. data/templates/guests/suse/network_static.erb +3 -3
  227. data/templates/locales/en.yml +35 -18
  228. data/templates/locales/providers_docker.yml +8 -0
  229. data/templates/provisioners/chef_solo/solo.erb +7 -7
  230. data/test/support/isolated_environment.rb +1 -1
  231. data/test/unit/base.rb +9 -1
  232. data/test/unit/plugins/commands/box/command/update_test.rb +7 -1
  233. data/test/unit/plugins/commands/init/command_test.rb +86 -0
  234. data/test/unit/plugins/commands/login/client_test.rb +7 -0
  235. data/test/unit/plugins/commands/ssh_config/command_test.rb +2 -14
  236. data/test/unit/plugins/communicators/winrm/shell_test.rb +40 -16
  237. data/test/unit/plugins/guests/amazon/cap/flavor_test.rb +19 -0
  238. data/test/unit/plugins/guests/arch/cap/change_host_name_test.rb +38 -0
  239. data/test/unit/plugins/guests/arch/cap/configure_networks_test.rb +55 -0
  240. data/test/unit/plugins/guests/atomic/cap/change_host_name_test.rb +38 -0
  241. data/test/unit/plugins/guests/atomic/cap/docker_test.rb +28 -0
  242. data/test/unit/plugins/guests/coreos/cap/change_host_name_test.rb +37 -0
  243. data/test/unit/plugins/guests/coreos/cap/configure_networks_test.rb +59 -0
  244. data/test/unit/plugins/guests/coreos/cap/docker_test.rb +28 -0
  245. data/test/unit/plugins/guests/darwin/cap/change_host_name_test.rb +40 -0
  246. data/test/unit/plugins/guests/darwin/cap/choose_addressable_ip_addr_test.rb +36 -0
  247. data/test/unit/plugins/guests/debian/cap/change_host_name_test.rb +23 -16
  248. data/test/unit/plugins/guests/debian/cap/configure_networks_test.rb +54 -0
  249. data/test/unit/plugins/guests/debian/cap/nfs_client_test.rb +30 -0
  250. data/test/unit/plugins/guests/debian/cap/rsync_test.rb +38 -0
  251. data/test/unit/plugins/guests/debian/cap/smb_test.rb +38 -0
  252. data/test/unit/plugins/guests/freebsd/cap/change_host_name_test.rb +40 -0
  253. data/test/unit/plugins/guests/freebsd/cap/configure_networks_test.rb +51 -0
  254. data/test/unit/plugins/guests/freebsd/cap/halt_test.rb +35 -0
  255. data/test/unit/plugins/guests/freebsd/cap/insert_public_key_test.rb +31 -0
  256. data/test/unit/plugins/guests/freebsd/cap/mount_nfs_folder_test.rb +53 -0
  257. data/test/unit/plugins/guests/freebsd/cap/rsync_test.rb +46 -0
  258. data/test/unit/plugins/guests/linux/cap/choose_addressable_ip_addr_test.rb +38 -0
  259. data/test/unit/plugins/guests/linux/cap/halt_test.rb +36 -0
  260. data/test/unit/plugins/guests/linux/cap/insert_public_key_test.rb +32 -0
  261. data/test/unit/plugins/guests/linux/cap/mount_nfs_test.rb +78 -0
  262. data/test/unit/plugins/guests/linux/cap/mount_shared_folder_test.rb +1 -1
  263. data/test/unit/plugins/guests/linux/cap/nfs_client_test.rb +29 -0
  264. data/test/unit/plugins/guests/linux/cap/port_test.rb +30 -0
  265. data/test/unit/plugins/guests/omnios/cap/change_host_name_test.rb +41 -0
  266. data/test/unit/plugins/guests/omnios/cap/mount_nfs_folder_test.rb +47 -0
  267. data/test/unit/plugins/guests/omnios/cap/rsync_test.rb +29 -0
  268. data/test/unit/plugins/guests/photon/cap/change_host_name_test.rb +26 -18
  269. data/test/unit/plugins/guests/photon/cap/configure_networks_test.rb +37 -26
  270. data/test/unit/plugins/guests/photon/cap/docker_test.rb +17 -12
  271. data/test/unit/plugins/guests/pld/cap/change_host_name_test.rb +39 -0
  272. data/test/unit/plugins/guests/pld/cap/flavor_test.rb +21 -0
  273. data/test/unit/plugins/guests/pld/cap/network_scripts_dir_test.rb +21 -0
  274. data/test/unit/plugins/guests/redhat/cap/change_host_name_test.rb +23 -51
  275. data/test/unit/plugins/guests/redhat/cap/configure_networks_test.rb +80 -0
  276. data/test/unit/plugins/guests/redhat/cap/flavor_test.rb +40 -0
  277. data/test/unit/plugins/guests/redhat/cap/network_scripts_dir_test.rb +21 -0
  278. data/test/unit/plugins/guests/redhat/cap/nfs_client_test.rb +30 -0
  279. data/test/unit/plugins/guests/redhat/cap/rsync_test.rb +29 -0
  280. data/test/unit/plugins/guests/slackware/cap/change_host_name_test.rb +40 -0
  281. data/test/unit/plugins/guests/slackware/cap/configure_networks_test.rb +48 -0
  282. data/test/unit/plugins/guests/smartos/cap/change_host_name_test.rb +2 -2
  283. data/test/unit/plugins/guests/smartos/cap/configure_networks_test.rb +1 -1
  284. data/test/unit/plugins/guests/smartos/cap/halt_test.rb +1 -1
  285. data/test/unit/plugins/guests/smartos/cap/mount_nfs_test.rb +1 -1
  286. data/test/unit/plugins/guests/smartos/cap/rsync_test.rb +1 -1
  287. data/test/unit/plugins/guests/suse/cap/change_host_name_test.rb +40 -0
  288. data/test/unit/plugins/guests/suse/cap/configure_networks_test.rb +60 -0
  289. data/test/unit/plugins/guests/suse/cap/halt_test.rb +36 -0
  290. data/test/unit/plugins/guests/suse/cap/network_scripts_dir_test.rb +19 -0
  291. data/test/unit/plugins/guests/suse/cap/nfs_client_test.rb +31 -0
  292. data/test/unit/plugins/guests/suse/cap/rsync_test.rb +38 -0
  293. data/test/unit/plugins/guests/tinycore/cap/change_host_name_test.rb +1 -1
  294. data/test/unit/plugins/guests/ubuntu/cap/change_host_name_test.rb +24 -16
  295. data/test/unit/plugins/guests/windows/cap/change_host_name_test.rb +1 -1
  296. data/test/unit/plugins/guests/windows/cap/halt_test.rb +1 -1
  297. data/test/unit/plugins/guests/windows/cap/mount_shared_folder_test.rb +1 -1
  298. data/test/unit/plugins/guests/windows/cap/reboot_test.rb +1 -1
  299. data/test/unit/plugins/guests/windows/cap/rsync_test.rb +1 -1
  300. data/test/unit/plugins/hosts/darwin/cap/rdp_test.rb +36 -0
  301. data/test/unit/plugins/kernel_v2/config/vm_test.rb +27 -1
  302. data/test/unit/plugins/providers/docker/action/create_test.rb +55 -0
  303. data/test/unit/plugins/providers/docker/command/exec_test.rb +44 -0
  304. data/test/unit/plugins/providers/docker/config_test.rb +7 -2
  305. data/test/unit/plugins/providers/virtualbox/action/prepare_nfs_settings_test.rb +18 -0
  306. data/test/unit/plugins/provisioners/ansible/config/guest_test.rb +83 -0
  307. data/test/unit/plugins/provisioners/ansible/config/host_test.rb +98 -0
  308. data/test/unit/plugins/provisioners/ansible/config/shared.rb +107 -0
  309. data/test/unit/plugins/provisioners/ansible/provisioner_test.rb +82 -10
  310. data/test/unit/plugins/provisioners/chef/config/base_test.rb +2 -2
  311. data/test/unit/plugins/provisioners/chef/provisioner/base_test.rb +29 -0
  312. data/test/unit/plugins/pushes/atlas/push_test.rb +12 -8
  313. data/test/unit/plugins/pushes/ftp/adapter_test.rb +1 -1
  314. data/test/unit/plugins/pushes/ftp/push_test.rb +5 -4
  315. data/test/unit/support/isolated_environment.rb +4 -4
  316. data/test/unit/support/shared/base_context.rb +11 -3
  317. data/test/unit/templates/guests/arch/network_dhcp_test.rb +2 -2
  318. data/test/unit/templates/guests/arch/network_static_test.rb +4 -4
  319. data/test/unit/templates/guests/debian/network_dhcp_test.rb +6 -6
  320. data/test/unit/templates/guests/debian/network_static_test.rb +6 -6
  321. data/test/unit/templates/guests/fedora/network_static6_test.rb +25 -0
  322. data/test/unit/templates/guests/freebsd/network_dhcp_test.rb +5 -2
  323. data/test/unit/templates/guests/freebsd/network_static_test.rb +13 -17
  324. data/test/unit/templates/guests/suse/network_dhcp_test.rb +2 -2
  325. data/test/unit/templates/guests/suse/network_static_test.rb +4 -4
  326. data/test/unit/vagrant/action/builtin/box_add_test.rb +33 -31
  327. data/test/unit/vagrant/action/builtin/lock_test.rb +5 -2
  328. data/test/unit/vagrant/action/builtin/mixin_synced_folders_test.rb +6 -2
  329. data/test/unit/vagrant/action/builtin/synced_folder_cleanup_test.rb +5 -1
  330. data/test/unit/vagrant/action/builtin/synced_folders_test.rb +5 -1
  331. data/test/unit/vagrant/box_collection_test.rb +19 -7
  332. data/test/unit/vagrant/box_test.rb +13 -2
  333. data/test/unit/vagrant/config_test.rb +1 -1
  334. data/test/unit/vagrant/environment_test.rb +16 -12
  335. data/test/unit/vagrant/machine_index_test.rb +5 -1
  336. data/test/unit/vagrant/machine_test.rb +5 -1
  337. data/test/unit/vagrant/plugin/manager_test.rb +1 -5
  338. data/test/unit/vagrant/plugin/state_file_test.rb +1 -5
  339. data/test/unit/vagrant/util/platform_test.rb +5 -0
  340. data/test/unit/vagrant/util/safe_chdir_test.rb +11 -5
  341. data/test/unit/vagrant/vagrantfile_test.rb +5 -1
  342. data/vagrant.gemspec +8 -3
  343. data/version.txt +1 -1
  344. metadata +3657 -12
  345. data/CONTRIBUTING.md +0 -41
  346. data/test/unit/plugins/guests/support/shared/debian_like_host_name_examples.rb +0 -106
  347. data/test/unit/plugins/guests/support/shared/redhat_like_host_name_examples.rb +0 -252
  348. data/test/unit/plugins/provisioners/ansible/config_test.rb +0 -224
@@ -10,13 +10,17 @@ describe VagrantPlugins::DockerProvider::Config do
10
10
  let(:machine) { double("machine") }
11
11
 
12
12
  let(:build_dir) do
13
- temporary_dir.tap do |dir|
14
- dir.join("Dockerfile").open("w") do |f|
13
+ Dir.mktmpdir("vagrant-test-docker-provider-build-dir").tap do |dir|
14
+ File.open(File.join(dir, "Dockerfile"), "wb+") do |f|
15
15
  f.write("Hello")
16
16
  end
17
17
  end
18
18
  end
19
19
 
20
+ after do
21
+ FileUtils.rm_rf(build_dir)
22
+ end
23
+
20
24
  def assert_invalid
21
25
  errors = subject.validate(machine)
22
26
  if !errors.values.any? { |v| !v.empty? }
@@ -60,6 +64,7 @@ describe VagrantPlugins::DockerProvider::Config do
60
64
  before do
61
65
  # By default lets be Linux for validations
62
66
  Vagrant::Util::Platform.stub(linux: true)
67
+ Vagrant::Util::Platform.stub(linux?: true)
63
68
  end
64
69
 
65
70
  it "should be invalid if both build dir and image are set" do
@@ -116,5 +116,23 @@ describe VagrantPlugins::ProviderVirtualBox::Action::PrepareNFSSettings do
116
116
  expect(env[:nfs_host_ip]).to eq("1.2.3.4")
117
117
  expect(env[:nfs_machine_ip]).to eq(["11.12.13.14"])
118
118
  end
119
+
120
+ it "allows statically configured guest IPs to co-exist with dynamic host only IPs for NFS" do
121
+ env[:machine].config.vm.network :private_network, ip: "11.12.13.14"
122
+
123
+ subject.call(env)
124
+
125
+ expect(env[:nfs_host_ip]).to eq("1.2.3.4")
126
+ expect(env[:nfs_machine_ip]).to eq(["11.12.13.14", "2.3.4.5"])
127
+ end
128
+
129
+ it "allows the use of scoped hash overrides as options" do
130
+ env[:machine].config.vm.network :private_network, virtualbox__ip: "11.12.13.14"
131
+
132
+ subject.call(env)
133
+
134
+ expect(env[:nfs_host_ip]).to eq("1.2.3.4")
135
+ expect(env[:nfs_machine_ip]).to eq(["11.12.13.14", "2.3.4.5"])
136
+ end
119
137
  end
120
138
  end
@@ -0,0 +1,83 @@
1
+ require_relative "../../../../base"
2
+ require_relative "../../support/shared/config"
3
+ require_relative "shared"
4
+
5
+ require Vagrant.source_root.join("plugins/provisioners/ansible/config/guest")
6
+
7
+ describe VagrantPlugins::Ansible::Config::Guest do
8
+ include_context "unit"
9
+
10
+ subject { described_class.new }
11
+
12
+ # FIXME: machine.ui.warn stub is not working as expected...
13
+ let(:machine) { double("machine", env: Vagrant::Environment.new) }
14
+
15
+ let(:communicator) { double("communicator") }
16
+ let(:existing_file) { "this/path/is/a/stub" }
17
+
18
+ it "supports a list of options" do
19
+ supported_options = %w( extra_vars
20
+ galaxy_command
21
+ galaxy_role_file
22
+ galaxy_roles_path
23
+ groups
24
+ host_vars
25
+ install
26
+ install_mode
27
+ inventory_path
28
+ limit
29
+ playbook
30
+ provisioning_path
31
+ raw_arguments
32
+ skip_tags
33
+ start_at_task
34
+ sudo
35
+ sudo_user
36
+ tags
37
+ tmp_path
38
+ vault_password_file
39
+ verbose
40
+ version )
41
+
42
+ expect(get_provisioner_option_names(described_class)).to eql(supported_options)
43
+ end
44
+
45
+ describe "default options handling" do
46
+ it_behaves_like "options shared by both Ansible provisioners"
47
+
48
+ it "assigns default values to unset guest-specific options" do
49
+ subject.finalize!
50
+
51
+ expect(subject.install).to be_true
52
+ expect(subject.install_mode).to eql(:default)
53
+ expect(subject.provisioning_path).to eql("/vagrant")
54
+ expect(subject.tmp_path).to eql("/tmp/vagrant-ansible")
55
+ expect(subject.version).to be_empty
56
+ end
57
+ end
58
+
59
+ describe "#validate" do
60
+ before do
61
+ subject.playbook = existing_file
62
+ end
63
+
64
+ it_behaves_like "an Ansible provisioner", "/vagrant", "local"
65
+
66
+ it "falls back to :default install_mode for any invalid setting" do
67
+ subject.install_mode = "from_source"
68
+ subject.finalize!
69
+
70
+ result = subject.validate(machine)
71
+ expect(subject.install_mode).to eql(:default)
72
+ end
73
+
74
+ it "supports :pip install_mode" do
75
+ subject.install_mode = "pip"
76
+ subject.finalize!
77
+
78
+ result = subject.validate(machine)
79
+ expect(subject.install_mode).to eql(:pip)
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,98 @@
1
+ require_relative "../../../../base"
2
+ require_relative "../../support/shared/config"
3
+ require_relative "shared"
4
+
5
+ require Vagrant.source_root.join("plugins/provisioners/ansible/config/host")
6
+
7
+ describe VagrantPlugins::Ansible::Config::Host, :skip_windows => true do
8
+ include_context "unit"
9
+
10
+ subject { described_class.new }
11
+
12
+ let(:machine) { double("machine", env: Vagrant::Environment.new) }
13
+ let(:existing_file) { File.expand_path(__FILE__) }
14
+
15
+ it "supports a list of options" do
16
+ supported_options = %w( ask_sudo_pass
17
+ ask_vault_pass
18
+ extra_vars
19
+ force_remote_user
20
+ galaxy_command
21
+ galaxy_role_file
22
+ galaxy_roles_path
23
+ groups
24
+ host_key_checking
25
+ host_vars
26
+ inventory_path
27
+ limit
28
+ playbook
29
+ raw_arguments
30
+ raw_ssh_args
31
+ skip_tags
32
+ start_at_task
33
+ sudo
34
+ sudo_user
35
+ tags
36
+ vault_password_file
37
+ verbose )
38
+
39
+ expect(get_provisioner_option_names(described_class)).to eql(supported_options)
40
+ end
41
+
42
+ describe "default options handling" do
43
+ it_behaves_like "options shared by both Ansible provisioners"
44
+
45
+ it "assigns default values to unset host-specific options" do
46
+ subject.finalize!
47
+
48
+ expect(subject.ask_sudo_pass).to be_false
49
+ expect(subject.ask_vault_pass).to be_false
50
+ expect(subject.force_remote_user).to be_true
51
+ expect(subject.host_key_checking).to be_false
52
+ expect(subject.raw_ssh_args).to be_nil
53
+ end
54
+ end
55
+
56
+ describe "force_remote_user option" do
57
+ it_behaves_like "any VagrantConfigProvisioner strict boolean attribute", :force_remote_user, true
58
+ end
59
+ describe "host_key_checking option" do
60
+ it_behaves_like "any VagrantConfigProvisioner strict boolean attribute", :host_key_checking, false
61
+ end
62
+ describe "ask_sudo_pass option" do
63
+ it_behaves_like "any VagrantConfigProvisioner strict boolean attribute", :ask_sudo_pass, false
64
+ end
65
+ describe "ask_vault_pass option" do
66
+ it_behaves_like "any VagrantConfigProvisioner strict boolean attribute", :ask_sudo_pass, false
67
+ end
68
+
69
+ describe "#validate" do
70
+ before do
71
+ subject.playbook = existing_file
72
+ end
73
+
74
+ it_behaves_like "an Ansible provisioner", "", "remote"
75
+
76
+ it "returns an error if the raw_ssh_args is of the wrong data type" do
77
+ subject.raw_ssh_args = { arg1: 1, arg2: "foo" }
78
+ subject.finalize!
79
+
80
+ result = subject.validate(machine)
81
+ expect(result["ansible remote provisioner"]).to eql([
82
+ I18n.t("vagrant.provisioners.ansible.errors.raw_ssh_args_invalid",
83
+ type: subject.raw_ssh_args.class.to_s,
84
+ value: subject.raw_ssh_args.to_s)
85
+ ])
86
+ end
87
+
88
+ it "converts a raw_ssh_args option defined as a String into an Array" do
89
+ subject.raw_arguments = "-o ControlMaster=no"
90
+ subject.finalize!
91
+
92
+ result = subject.validate(machine)
93
+ expect(subject.raw_arguments).to eql(["-o ControlMaster=no"])
94
+ end
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,107 @@
1
+ shared_examples_for 'options shared by both Ansible provisioners' do
2
+
3
+ it "assigns default values to unset common options" do
4
+ subject.finalize!
5
+
6
+ expect(subject.extra_vars).to be_nil
7
+ expect(subject.galaxy_command).to eql("ansible-galaxy install --role-file=%{role_file} --roles-path=%{roles_path} --force")
8
+ expect(subject.galaxy_role_file).to be_nil
9
+ expect(subject.galaxy_roles_path).to be_nil
10
+ expect(subject.groups).to eq({})
11
+ expect(subject.host_vars).to eq({})
12
+ expect(subject.inventory_path).to be_nil
13
+ expect(subject.limit).to be_nil
14
+ expect(subject.playbook).to be_nil
15
+ expect(subject.raw_arguments).to be_nil
16
+ expect(subject.skip_tags).to be_nil
17
+ expect(subject.start_at_task).to be_nil
18
+ expect(subject.sudo).to be_false
19
+ expect(subject.sudo_user).to be_nil
20
+ expect(subject.tags).to be_nil
21
+ expect(subject.vault_password_file).to be_nil
22
+ expect(subject.verbose).to be_false
23
+ end
24
+
25
+ end
26
+
27
+ shared_examples_for 'an Ansible provisioner' do | path_prefix, ansible_setup |
28
+
29
+ provisioner_label = "ansible #{ansible_setup} provisioner"
30
+ provisioner_system = ansible_setup == "local" ? "guest" : "host"
31
+
32
+ it "returns an error if the playbook option is undefined" do
33
+ subject.playbook = nil
34
+ subject.finalize!
35
+
36
+ result = subject.validate(machine)
37
+ expect(result[provisioner_label]).to eql([
38
+ I18n.t("vagrant.provisioners.ansible.errors.no_playbook")
39
+ ])
40
+ end
41
+
42
+ it "passes if the extra_vars option is a hash" do
43
+ subject.extra_vars = { var1: 1, var2: "foo" }
44
+ subject.finalize!
45
+
46
+ result = subject.validate(machine)
47
+ expect(result[provisioner_label]).to eql([])
48
+ end
49
+
50
+ it "returns an error if the extra_vars option is of wrong data type" do
51
+ subject.extra_vars = ["var1", 3, "var2", 5]
52
+ subject.finalize!
53
+
54
+ result = subject.validate(machine)
55
+ expect(result[provisioner_label]).to eql([
56
+ I18n.t("vagrant.provisioners.ansible.errors.extra_vars_invalid",
57
+ type: subject.extra_vars.class.to_s,
58
+ value: subject.extra_vars.to_s)
59
+ ])
60
+ end
61
+
62
+ it "converts a raw_arguments option defined as a String into an Array" do
63
+ subject.raw_arguments = "--foo=bar"
64
+ subject.finalize!
65
+
66
+ result = subject.validate(machine)
67
+ expect(subject.raw_arguments).to eql(%w(--foo=bar))
68
+ end
69
+
70
+ it "returns an error if the raw_arguments is of the wrong data type" do
71
+ subject.raw_arguments = { arg1: 1, arg2: "foo" }
72
+ subject.finalize!
73
+
74
+ result = subject.validate(machine)
75
+ expect(result[provisioner_label]).to eql([
76
+ I18n.t("vagrant.provisioners.ansible.errors.raw_arguments_invalid",
77
+ type: subject.raw_arguments.class.to_s,
78
+ value: subject.raw_arguments.to_s)
79
+ ])
80
+ end
81
+
82
+ it "it collects and returns all detected errors" do
83
+ subject.playbook = nil
84
+ subject.extra_vars = ["var1", 3, "var2", 5]
85
+ subject.raw_arguments = { arg1: 1, arg2: "foo" }
86
+ subject.finalize!
87
+
88
+ result = subject.validate(machine)
89
+
90
+ expect(result[provisioner_label].size).to eql(3)
91
+ expect(result[provisioner_label]).to include(
92
+ I18n.t("vagrant.provisioners.ansible.errors.no_playbook"))
93
+ expect(result[provisioner_label]).to include(
94
+ I18n.t("vagrant.provisioners.ansible.errors.extra_vars_invalid",
95
+ type: subject.extra_vars.class.to_s,
96
+ value: subject.extra_vars.to_s))
97
+ expect(result[provisioner_label]).to include(
98
+ I18n.t("vagrant.provisioners.ansible.errors.raw_arguments_invalid",
99
+ type: subject.raw_arguments.class.to_s,
100
+ value: subject.raw_arguments.to_s))
101
+ end
102
+
103
+ describe "sudo option" do
104
+ it_behaves_like "any VagrantConfigProvisioner strict boolean attribute", :sudo, false
105
+ end
106
+
107
+ end
@@ -59,6 +59,8 @@ VF
59
59
  stubbed_ui.stub(detail: "")
60
60
  machine.env.stub(ui: stubbed_ui)
61
61
 
62
+ subject.stub(:check_path)
63
+
62
64
  config.playbook = 'playbook.yml'
63
65
  end
64
66
 
@@ -203,6 +205,43 @@ VF
203
205
  end
204
206
  end
205
207
 
208
+ describe 'checking existence of Ansible configuration files' do
209
+
210
+ describe 'when the playbook file does not exist' do
211
+ it "raises an error", skip_before: true, skip_after: true do
212
+
213
+ subject.stub(:check_path).and_raise(VagrantPlugins::Ansible::Errors::AnsibleError,
214
+ _key: :config_file_not_found,
215
+ config_option: "playbook",
216
+ path: "/home/wip/test/invalid_path.yml",
217
+ system: "host")
218
+
219
+ config.playbook = "/home/wip/test/invalid_path.yml"
220
+ config.finalize!
221
+
222
+ expect {subject.provision}.to raise_error(VagrantPlugins::Ansible::Errors::AnsibleError,
223
+ "`playbook` does not exist on the host: /home/wip/test/invalid_path.yml")
224
+ end
225
+ end
226
+
227
+ describe 'when the inventory path does not exist' do
228
+ it "raises an error"
229
+ end
230
+
231
+ describe 'when the extra_vars file does not exist' do
232
+ it "raises an error"
233
+ end
234
+
235
+ describe 'when the galaxy_role_file does not exist' do
236
+ it "raises an error"
237
+ end
238
+
239
+ describe 'when the vault_password_file does not exist' do
240
+ it "raises an error"
241
+ end
242
+
243
+ end
244
+
206
245
  describe 'when ansible-playbook fails' do
207
246
  it "raises an error", skip_before: true, skip_after: true do
208
247
  config.finalize!
@@ -639,7 +678,7 @@ VF
639
678
 
640
679
  it "shows the ansible-playbook command and set verbosity to '-#{verbose_option}' level" do
641
680
  expect(machine.env.ui).to receive(:detail).with { |full_command|
642
- expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit='machine1' --inventory-file=#{generated_inventory_dir} -#{verbose_option} playbook.yml")
681
+ expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit=\"machine1\" --inventory-file=#{generated_inventory_dir} -#{verbose_option} playbook.yml")
643
682
  }
644
683
  end
645
684
  end
@@ -654,7 +693,7 @@ VF
654
693
 
655
694
  it "shows the ansible-playbook command and set verbosity to '-#{verbose_option}' level" do
656
695
  expect(machine.env.ui).to receive(:detail).with { |full_command|
657
- expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit='machine1' --inventory-file=#{generated_inventory_dir} -#{verbose_option} playbook.yml")
696
+ expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit=\"machine1\" --inventory-file=#{generated_inventory_dir} -#{verbose_option} playbook.yml")
658
697
  }
659
698
  end
660
699
  end
@@ -670,7 +709,7 @@ VF
670
709
 
671
710
  it "shows the ansible-playbook command and set verbosity to '-v' level" do
672
711
  expect(machine.env.ui).to receive(:detail).with { |full_command|
673
- expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit='machine1' --inventory-file=#{generated_inventory_dir} -v playbook.yml")
712
+ expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --limit=\"machine1\" --inventory-file=#{generated_inventory_dir} -v playbook.yml")
674
713
  }
675
714
  end
676
715
  end
@@ -732,6 +771,38 @@ VF
732
771
  end
733
772
  end
734
773
 
774
+ context "with galaxy_roles_path option defined" do
775
+ before do
776
+ config.galaxy_roles_path = "my-roles"
777
+ end
778
+
779
+ it "sets ANSIBLE_ROLES_PATH with corresponding absolute path" do
780
+ expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
781
+ cmd_opts = args.last
782
+ expect(cmd_opts[:env]).to include("ANSIBLE_ROLES_PATH")
783
+ expect(cmd_opts[:env]['ANSIBLE_ROLES_PATH']).to eql(File.join(machine.env.root_path, "my-roles"))
784
+ }
785
+ end
786
+ end
787
+
788
+ context "with extra_vars option defined" do
789
+ describe "with a hash value" do
790
+ before do
791
+ config.extra_vars = { var1: %Q(string with 'apostrophes', \\, " and =), var2: { x: 42 } }
792
+ end
793
+
794
+ it_should_set_optional_arguments({ "extra_vars" => "--extra-vars={\"var1\":\"string with 'apostrophes', \\\\, \\\" and =\",\"var2\":{\"x\":42}}" })
795
+ end
796
+
797
+ describe "with a string value referring to file path (with the '@' prefix)" do
798
+ before do
799
+ config.extra_vars = "@#{existing_file}"
800
+ end
801
+
802
+ it_should_set_optional_arguments({ "extra_vars" => "--extra-vars=@#{File.expand_path(__FILE__)}" })
803
+ end
804
+ end
805
+
735
806
  # The Vagrant Ansible provisioner does not validate the coherency of
736
807
  # argument combinations, and let ansible-playbook complain.
737
808
  describe "with a maximum of options" do
@@ -741,7 +812,8 @@ VF
741
812
  ssh_info[:private_key_path] = ['/my/key1', '/my/key2']
742
813
 
743
814
  # command line arguments
744
- config.extra_vars = "@#{existing_file}"
815
+ config.galaxy_roles_path = "/up/to the stars"
816
+ config.extra_vars = { var1: %Q(string with 'apostrophes', \\, " and =), var2: { x: 42 } }
745
817
  config.sudo = true
746
818
  config.sudo_user = 'deployer'
747
819
  config.verbose = "vvv"
@@ -751,17 +823,17 @@ VF
751
823
  config.tags = %w(db www)
752
824
  config.skip_tags = %w(foo bar)
753
825
  config.limit = 'machine*:&vagrant:!that_one'
754
- config.start_at_task = 'an awesome task'
755
- config.raw_arguments = ["--why-not", "--su-user=foot", "--ask-su-pass", "--limit=all", "--private-key=./myself.key"]
826
+ config.start_at_task = "joe's awesome task"
827
+ config.raw_arguments = ["--why-not", "--su-user=foot", "--ask-su-pass", "--limit=all", "--private-key=./myself.key", "--extra-vars='{\"var3\":\"foo\"}'"]
756
828
 
757
829
  # environment variables
758
830
  config.host_key_checking = true
759
831
  config.raw_ssh_args = ['-o ControlMaster=no']
760
832
  end
761
833
 
762
- it_should_set_arguments_and_environment_variables 20, 4, true
834
+ it_should_set_arguments_and_environment_variables 21, 5, true
763
835
  it_should_explicitly_enable_ansible_ssh_control_persist_defaults
764
- it_should_set_optional_arguments({ "extra_vars" => "--extra-vars=@#{File.expand_path(__FILE__)}",
836
+ it_should_set_optional_arguments({ "extra_vars" => "--extra-vars={\"var1\":\"string with 'apostrophes', \\\\, \\\" and =\",\"var2\":{\"x\":42}}",
765
837
  "sudo" => "--sudo",
766
838
  "sudo_user" => "--sudo-user=deployer",
767
839
  "verbose" => "-vvv",
@@ -771,7 +843,7 @@ VF
771
843
  "tags" => "--tags=db,www",
772
844
  "skip_tags" => "--skip-tags=foo,bar",
773
845
  "limit" => "--limit=machine*:&vagrant:!that_one",
774
- "start_at_task" => "--start-at-task=an awesome task",
846
+ "start_at_task" => "--start-at-task=joe's awesome task",
775
847
  })
776
848
 
777
849
  it "also includes given raw arguments" do
@@ -786,7 +858,7 @@ VF
786
858
 
787
859
  it "shows the ansible-playbook command, with additional quotes when required" do
788
860
  expect(machine.env.ui).to receive(:detail).with { |full_command|
789
- expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=true ANSIBLE_SSH_ARGS='-o IdentitiesOnly=yes -i '/my/key1' -i '/my/key2' -o ForwardAgent=yes -o ControlMaster=no -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --ask-sudo-pass --ask-vault-pass --limit='machine*:&vagrant:!that_one' --inventory-file=#{generated_inventory_dir} --extra-vars=@#{File.expand_path(__FILE__)} --sudo --sudo-user=deployer -vvv --vault-password-file=#{File.expand_path(__FILE__)} --tags=db,www --skip-tags=foo,bar --start-at-task='an awesome task' --why-not --su-user=foot --ask-su-pass --limit='all' --private-key=./myself.key playbook.yml")
861
+ expect(full_command).to eq(%Q(PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_ROLES_PATH='/up/to the stars' ANSIBLE_HOST_KEY_CHECKING=true ANSIBLE_SSH_ARGS='-o IdentitiesOnly=yes -i '/my/key1' -i '/my/key2' -o ForwardAgent=yes -o ControlMaster=no -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --connection=ssh --timeout=30 --ask-sudo-pass --ask-vault-pass --limit="machine*:&vagrant:!that_one" --inventory-file=#{generated_inventory_dir} --extra-vars="{\\"var1\\":\\"string with 'apostrophes', \\\\\\\\, \\\\\\" and =\\",\\"var2\\":{\\"x\\":42}}" --sudo --sudo-user=deployer -vvv --vault-password-file=#{File.expand_path(__FILE__)} --tags=db,www --skip-tags=foo,bar --start-at-task="joe's awesome task" --why-not --su-user=foot --ask-su-pass --limit=all --private-key=./myself.key --extra-vars='{\"var3\":\"foo\"}' playbook.yml))
790
862
  }
791
863
  end
792
864
  end