vagrant-unbundled 2.2.7.0 → 2.2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +42 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
@@ -5,11 +5,13 @@ module VagrantPlugins
5
5
  module CloudCommand
6
6
  module Command
7
7
  class Publish < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
- options = {}
11
+ options = {direct_upload: true}
10
12
 
11
13
  opts = OptionParser.new do |o|
12
- o.banner = "Usage: vagrant cloud publish [options] organization/box-name version provider-name provider-file"
14
+ o.banner = "Usage: vagrant cloud publish [options] organization/box-name version provider-name [provider-file]"
13
15
  o.separator ""
14
16
  o.separator "Create and release a new Vagrant Box on Vagrant Cloud"
15
17
  o.separator ""
@@ -19,7 +21,7 @@ module VagrantPlugins
19
21
  o.on("--box-version VERSION", String, "Version of box to create") do |v|
20
22
  options[:box_version] = v
21
23
  end
22
- o.on("--url URL", String, "Remote URL to download this provider") do |u|
24
+ o.on("--url URL", String, "Remote URL to download this provider (cannot be used with provider-file)") do |u|
23
25
  options[:url] = u
24
26
  end
25
27
  o.on("-d", "--description DESCRIPTION", String, "Full description of box") do |d|
@@ -28,154 +30,239 @@ module VagrantPlugins
28
30
  o.on("--version-description DESCRIPTION", String, "Description of the version to create") do |v|
29
31
  options[:version_description] = v
30
32
  end
31
- o.on("-f", "--force", "Disables confirmation to create or update box") do |f|
33
+ o.on("-f", "--[no-]force", "Disables confirmation to create or update box") do |f|
32
34
  options[:force] = f
33
35
  end
34
- o.on("-p", "--private", "Makes box private") do |p|
36
+ o.on("-p", "--[no-]private", "Makes box private") do |p|
35
37
  options[:private] = p
36
38
  end
37
- o.on("-r", "--release", "Releases box") do |p|
39
+ o.on("-r", "--[no-]release", "Releases box") do |p|
38
40
  options[:release] = p
39
41
  end
40
42
  o.on("-s", "--short-description DESCRIPTION", String, "Short description of the box") do |s|
41
43
  options[:short_description] = s
42
44
  end
43
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address") do |u|
44
- options[:username] = u
45
- end
46
45
  o.on("-c", "--checksum CHECKSUM_VALUE", String, "Checksum of the box for this provider. --checksum-type option is required.") do |c|
47
46
  options[:checksum] = c
48
47
  end
49
48
  o.on("-C", "--checksum-type TYPE", String, "Type of checksum used (md5, sha1, sha256, sha384, sha512). --checksum option is required.") do |c|
50
49
  options[:checksum_type] = c
51
50
  end
51
+ o.on("--[no-]direct-upload", "Upload asset directly to backend storage") do |d|
52
+ options[:direct_upload] = d
53
+ end
52
54
  end
53
55
 
54
56
  # Parse the options
55
57
  argv = parse_options(opts)
56
58
  return if !argv
57
59
 
58
- if argv.empty? || argv.length > 4 || argv.length < 3 || (argv.length == 3 && !options[:url])
60
+ if argv.length < 3 || # missing required arguments
61
+ argv.length > 4 || # too many arguments
62
+ (argv.length < 4 && !options.key?(:url)) || # file argument required if url is not provided
63
+ (argv.length > 3 && options.key?(:url)) # cannot provider url and file argument
59
64
  raise Vagrant::Errors::CLIInvalidUsage,
60
65
  help: opts.help.chomp
61
66
  end
62
67
 
63
- box = argv.first.split('/', 2)
64
- org = box[0]
65
- box_name = box[1]
66
- version = argv[1]
67
- provider_name = argv[2]
68
- box_file = argv[3]
68
+ org, box_name = argv.first.split('/', 2)
69
+ _, version, provider_name, box_file = argv
69
70
 
70
- if !options[:url] && !File.file?(box_file)
71
+ if box_file && !File.file?(box_file)
71
72
  raise Vagrant::Errors::BoxFileNotExist,
72
73
  file: box_file
73
74
  end
74
75
 
75
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
76
-
77
- publish_box(org, box_name, version, provider_name, box_file, options, @client.token)
78
- end
79
-
80
- def publish_box(org, box_name, version, provider_name, box_file, options, access_token)
81
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
76
+ @client = client_login(@env)
77
+ params = options.slice(:private, :release, :url, :short_description,
78
+ :description, :version_description, :checksum, :checksum_type)
82
79
 
83
- @env.ui.warn(I18n.t("cloud_command.publish.confirm.warn"))
84
-
85
- @env.ui.info(I18n.t("cloud_command.publish.confirm.box", org: org,
86
- box_name: box_name, version: version, provider_name: provider_name))
87
- @env.ui.info(I18n.t("cloud_command.publish.confirm.private")) if options[:private]
88
- @env.ui.info(I18n.t("cloud_command.publish.confirm.release")) if options[:release]
89
- @env.ui.info(I18n.t("cloud_command.publish.confirm.box_url",
90
- url: options[:url])) if options[:url]
91
- @env.ui.info(I18n.t("cloud_command.publish.confirm.box_description",
92
- description: options[:description])) if options[:description]
93
- @env.ui.info(I18n.t("cloud_command.publish.confirm.box_short_desc",
94
- short_description: options[:short_description])) if options[:short_description]
95
- @env.ui.info(I18n.t("cloud_command.publish.confirm.version_desc",
96
- version_description: options[:version_description])) if options[:version_description]
80
+ # Display output to user describing action to be taken
81
+ display_preamble(org, box_name, version, provider_name, params)
97
82
 
98
83
  if !options[:force]
99
84
  cont = @env.ui.ask(I18n.t("cloud_command.continue"))
100
85
  return 1 if cont.strip.downcase != "y"
101
86
  end
102
87
 
103
- account = VagrantPlugins::CloudCommand::Util.account(org, access_token, server_url)
104
- box = VagrantCloud::Box.new(account, box_name, nil, options[:short_description], options[:description], access_token)
105
- cloud_version = VagrantCloud::Version.new(box, version, nil, options[:version_description], access_token)
106
- provider = VagrantCloud::Provider.new(cloud_version, provider_name, nil, options[:url], org, box_name,
107
- access_token, nil, options[:checksum], options[:checksum_type])
108
-
109
- ui = Vagrant::UI::Prefixed.new(@env.ui, "cloud")
110
-
111
- begin
112
- ui.info(I18n.t("cloud_command.publish.box_create"))
113
- box.create
114
- rescue VagrantCloud::ClientError => e
115
- if e.error_code == 422
116
- ui.warn(I18n.t("cloud_command.publish.update_continue", obj: "Box"))
117
- box.update(options)
118
- else
119
- @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
120
- @env.ui.error(e)
121
- return 1
122
- end
88
+ # Load up all the models we'll need to publish the asset
89
+ box = load_box(org, box_name, @client.token)
90
+ box_v = load_box_version(box, version)
91
+ box_p = load_version_provider(box_v, provider_name)
92
+
93
+ # Update all the data
94
+ set_box_info(box, params.slice(:private, :short_description, :description))
95
+ set_version_info(box_v, params.slice(:version_description))
96
+ set_provider_info(box_p, params.slice(:checksum, :checksum_type, :url))
97
+
98
+ # Save any updated state
99
+ @env.ui.warn(I18n.t("cloud_command.publish.box_save"))
100
+ box.save
101
+
102
+ # If we have a box file asset, upload it
103
+ if box_file
104
+ upload_box_file(box_p, box_file, options.slice(:direct_upload))
123
105
  end
124
106
 
125
- begin
126
- ui.info(I18n.t("cloud_command.publish.version_create"))
127
- cloud_version.create_version
128
- rescue VagrantCloud::ClientError => e
129
- if e.error_code == 422
130
- ui.warn(I18n.t("cloud_command.publish.update_continue", obj: "Version"))
131
- cloud_version.update
132
- else
133
- @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
134
- @env.ui.error(e)
135
- return 1
136
- end
137
- rescue VagrantCloud::InvalidVersion => e
138
- @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
139
- @env.ui.error(e)
140
- return 1
107
+ # If configured to release the box, release it
108
+ if options[:release] && !box_v.released?
109
+ release_version(box_v)
141
110
  end
142
111
 
143
- begin
144
- ui.info(I18n.t("cloud_command.publish.provider_create"))
145
- provider.create_provider
146
- rescue VagrantCloud::ClientError => e
147
- if e.error_code == 422
148
- ui.warn(I18n.t("cloud_command.publish.update_continue", obj: "Provider"))
149
- provider.update
150
- else
151
- @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
152
- @env.ui.error(e)
153
- return 1
112
+ # And we're done!
113
+ @env.ui.success(I18n.t("cloud_command.publish.complete", org: org, box_name: box_name))
114
+ format_box_results(box, @env)
115
+ 0
116
+ rescue VagrantCloud::Error => err
117
+ @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
118
+ @env.ui.error(err.message)
119
+ 1
120
+ end
121
+
122
+ # Upload the file for the given box provider
123
+ #
124
+ # @param [VagrantCloud::Box::Provider] provider Vagrant Cloud box version provider
125
+ # @param [String] box_file Path to local asset for upload
126
+ # @param [Hash] options
127
+ # @option options [Boolean] :direct_upload Upload directly to backend storage
128
+ # @return [nil]
129
+ def upload_box_file(provider, box_file, options={})
130
+ box_file = File.absolute_path(box_file)
131
+ @env.ui.info(I18n.t("cloud_command.publish.upload_provider", file: box_file))
132
+ # Include size check on file and disable direct if over 5G
133
+ if options[:direct_upload]
134
+ fsize = File.stat(box_file).size
135
+ if fsize > (5 * Vagrant::Util::Numeric::GIGABYTE)
136
+ box_size = Vagrant::Util::Numeric.bytes_to_string(fsize)
137
+ @env.ui.warn(I18n.t("cloud_command.provider.direct_disable", size: box_size))
138
+ options[:direct_upload] = false
154
139
  end
155
140
  end
156
141
 
157
- begin
158
- if !options[:url]
159
- box_file = File.absolute_path(box_file)
160
- ui.info(I18n.t("cloud_command.publish.upload_provider", file: box_file))
161
- ul = Vagrant::Util::Uploader.new(provider.upload_url, box_file, ui: @env.ui)
162
- ul.upload!
163
- end
164
- if options[:release]
165
- ui.info(I18n.t("cloud_command.publish.release"))
166
- cloud_version.release
167
- end
168
- @env.ui.success(I18n.t("cloud_command.publish.complete", org: org, box_name: box_name))
169
- success = box.read(org, box_name)
170
- success = success.delete_if{|_, v|v.nil?}
171
- VagrantPlugins::CloudCommand::Util.format_box_results(success, @env)
172
- return 0
173
- rescue Vagrant::Errors::UploaderError, VagrantCloud::ClientError => e
174
- @env.ui.error(I18n.t("cloud_command.errors.publish.fail", org: org, box_name: box_name))
175
- @env.ui.error(e)
176
- return 1
142
+ provider.upload(direct: options[:direct_upload]) do |upload_url|
143
+ Vagrant::Util::Uploader.new(upload_url, box_file, ui: @env.ui, method: :put).upload!
177
144
  end
178
- return 1
145
+ nil
146
+ end
147
+
148
+ # Release the box version
149
+ #
150
+ # @param [VagrantCloud::Box::Version] version Vagrant Cloud box version
151
+ # @return [nil]
152
+ def release_version(version)
153
+ @env.ui.info(I18n.t("cloud_command.publish.release"))
154
+ version.release
155
+ nil
156
+ end
157
+
158
+ # Set any box related attributes that were provided
159
+ #
160
+ # @param [VagrantCloud::Box] box Vagrant Cloud box
161
+ # @param [Hash] options
162
+ # @option options [Boolean] :private Box access is private
163
+ # @option options [String] :short_description Short description of box
164
+ # @option options [String] :description Full description of box
165
+ # @return [VagrantCloud::Box]
166
+ def set_box_info(box, options={})
167
+ box.private = options[:private] if options.key?(:private)
168
+ box.short_description = options[:short_description] if options.key?(:short_description)
169
+ box.description = options[:description] if options.key?(:description)
170
+ box
171
+ end
172
+
173
+ # Set any version related attributes that were provided
174
+ #
175
+ # @param [VagrantCloud::Box::Version] version Vagrant Cloud box version
176
+ # @param [Hash] options
177
+ # @option options [String] :version_description Description for this version
178
+ # @return [VagrantCloud::Box::Version]
179
+ def set_version_info(version, options={})
180
+ version.description = options[:version_description] if options.key?(:version_description)
181
+ version
182
+ end
183
+
184
+ # Set any provider related attributes that were provided
185
+ #
186
+ # @param [VagrantCloud::Box::Provider] provider Vagrant Cloud box version provider
187
+ # @param [Hash] options
188
+ # @option options [String] :url Remote URL for self hosted
189
+ # @option options [String] :checksum_type Type of checksum value provided
190
+ # @option options [String] :checksum Checksum of the box asset
191
+ # @return [VagrantCloud::Box::Provider]
192
+ def set_provider_info(provider, options={})
193
+ provider.url = options[:url] if options.key?(:url)
194
+ provider.checksum_type = options[:checksum_type] if options.key?(:checksum_type)
195
+ provider.checksum = options[:checksum] if options.key?(:checksum)
196
+ provider
197
+ end
198
+
199
+ # Load the requested version provider
200
+ #
201
+ # @param [VagrantCloud::Box::Version] version The version of the Vagrant Cloud box
202
+ # @param [String] provider_name Name of the provider
203
+ # @return [VagrantCloud::Box::Provider]
204
+ def load_version_provider(version, provider_name)
205
+ provider = version.providers.detect { |pv| pv.name == provider_name }
206
+ return provider if provider
207
+ version.add_provider(provider_name)
208
+ end
209
+
210
+ # Load the requested box version
211
+ #
212
+ # @param [VagrantCloud::Box] box The Vagrant Cloud box
213
+ # @param [String] version Version of the box
214
+ # @return [VagrantCloud::Box::Version]
215
+ def load_box_version(box, version)
216
+ v = box.versions.detect { |v| v.version == version }
217
+ return v if v
218
+ box.add_version(version)
219
+ end
220
+
221
+ # Load the requested box
222
+ #
223
+ # @param [String] org Organization name for box
224
+ # @param [String] box_name Name of the box
225
+ # @param [String] access_token User access token
226
+ # @return [VagrantCloud::Box]
227
+ def load_box(org, box_name, access_token)
228
+ account = VagrantCloud::Account.new(
229
+ custom_server: api_server_url,
230
+ access_token: access_token
231
+ )
232
+ box = account.organization(name: org).boxes.detect { |b| b.name == box_name }
233
+ return box if box
234
+ account.organization(name: org).add_box(box_name)
235
+ end
236
+
237
+ # Display publishing information to user before starting process
238
+ #
239
+ # @param [String] org Organization name
240
+ # @param [String] box_name Name of the box to publish
241
+ # @param [String] version Version of the box to publish
242
+ # @param [String] provider_name Name of the provider being published
243
+ # @param [Hash] options
244
+ # @option options [Boolean] :private Box is private
245
+ # @option options [Boolean] :release Box should be released
246
+ # @option options [String] :url Remote URL for self-hosted boxes
247
+ # @option options [String] :description Description of the box
248
+ # @option options [String] :short_description Short description of the box
249
+ # @option options [String] :version_description Description of the box version
250
+ # @return [nil]
251
+ def display_preamble(org, box_name, version, provider_name, options={})
252
+ @env.ui.warn(I18n.t("cloud_command.publish.confirm.warn"))
253
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.box", org: org,
254
+ box_name: box_name, version: version, provider_name: provider_name))
255
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.private")) if options[:private]
256
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.release")) if options[:release]
257
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.box_url",
258
+ url: options[:url])) if options[:url]
259
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.box_description",
260
+ description: options[:description])) if options[:description]
261
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.box_short_desc",
262
+ short_description: options[:short_description])) if options[:short_description]
263
+ @env.ui.info(I18n.t("cloud_command.publish.confirm.version_desc",
264
+ version_description: options[:version_description])) if options[:version_description]
265
+ nil
179
266
  end
180
267
  end
181
268
  end
@@ -4,8 +4,10 @@ module VagrantPlugins
4
4
  module CloudCommand
5
5
  module Command
6
6
  class Search < Vagrant.plugin("2", :command)
7
+ include Util
8
+
7
9
  def execute
8
- options = {}
10
+ options = {quiet: true}
9
11
 
10
12
  opts = OptionParser.new do |o|
11
13
  o.banner = "Usage: vagrant cloud search [options] query"
@@ -37,45 +39,56 @@ module VagrantPlugins
37
39
  o.on("--sort-by SORT", "Field to sort results on (created, downloads, updated) Default: downloads") do |s|
38
40
  options[:sort] = s
39
41
  end
40
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address to login with") do |u|
41
- options[:username] = u
42
+ o.on("--[no-]auth", "Authenticate with Vagrant Cloud if required before searching") do |l|
43
+ options[:quiet] = !l
42
44
  end
43
45
  end
44
46
 
45
47
  # Parse the options
46
48
  argv = parse_options(opts)
47
49
  return if !argv
48
- if argv.length > 1
50
+ if argv.length != 1
49
51
  raise Vagrant::Errors::CLIInvalidUsage,
50
52
  help: opts.help.chomp
51
53
  end
52
54
 
53
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
55
+ @client = client_login(@env, options.slice(:quiet))
54
56
  query = argv.first
55
57
 
56
58
  options[:limit] = 25 if !(options[:limit].to_i < 1) && !options[:limit]
57
59
 
58
- search(query, options, @client.token)
60
+ search(query, @client&.token, options)
59
61
  end
60
62
 
61
- def search(query, options, access_token)
62
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
63
- search = VagrantCloud::Search.new(access_token, server_url)
63
+ # Perform requested search and display results to user
64
+ #
65
+ # @param [String] query Search query string
66
+ # @param [Hash] options
67
+ # @option options [String] :provider Filter by provider
68
+ # @option options [String] :sort Field to sort results
69
+ # @option options [Integer] :limit Number of results to display
70
+ # @option options [Integer] :page Page of results to display
71
+ # @param [String] access_token User access token
72
+ # @return [Integer]
73
+ def search(query, access_token, options={})
74
+ account = VagrantCloud::Account.new(
75
+ custom_server: api_server_url,
76
+ access_token: access_token
77
+ )
78
+ params = {query: query}.merge(options.slice(:provider, :sort, :order, :limit, :page))
79
+ result = account.searcher.search(**params)
64
80
 
65
- begin
66
- search_results = search.search(query, options[:provider], options[:sort], options[:order], options[:limit], options[:page])
67
- if !search_results["boxes"].empty?
68
- VagrantPlugins::CloudCommand::Util.format_search_results(search_results["boxes"], options[:short], options[:json], @env)
69
- else
70
- @env.ui.warn(I18n.t("cloud_command.search.no_results", query: query))
71
- end
81
+ if result.boxes.empty?
82
+ @env.ui.warn(I18n.t("cloud_command.search.no_results", query: query))
72
83
  return 0
73
- rescue VagrantCloud::ClientError => e
74
- @env.ui.error(I18n.t("cloud_command.errors.search.fail"))
75
- @env.ui.error(e)
76
- return 1
77
84
  end
78
- return 1
85
+
86
+ format_search_results(result.boxes, options[:short], options[:json], @env)
87
+ 0
88
+ rescue VagrantCloud::Error => e
89
+ @env.ui.error(I18n.t("cloud_command.errors.search.fail"))
90
+ @env.ui.error(e.message)
91
+ 1
79
92
  end
80
93
  end
81
94
  end