fixed-vagrant 0.7.4.dev

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 (242) hide show
  1. data/.gitignore +15 -0
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +272 -0
  4. data/Gemfile +21 -0
  5. data/LICENSE +21 -0
  6. data/README.md +75 -0
  7. data/Rakefile +22 -0
  8. data/bin/vagrant +22 -0
  9. data/config/default.rb +39 -0
  10. data/contrib/README.md +12 -0
  11. data/contrib/emacs/vagrant.el +8 -0
  12. data/contrib/vim/vagrantfile.vim +9 -0
  13. data/keys/README.md +17 -0
  14. data/keys/vagrant +27 -0
  15. data/keys/vagrant.ppk +26 -0
  16. data/keys/vagrant.pub +1 -0
  17. data/lib/vagrant.rb +42 -0
  18. data/lib/vagrant/action.rb +134 -0
  19. data/lib/vagrant/action/box.rb +11 -0
  20. data/lib/vagrant/action/box/destroy.rb +21 -0
  21. data/lib/vagrant/action/box/download.rb +72 -0
  22. data/lib/vagrant/action/box/package.rb +19 -0
  23. data/lib/vagrant/action/box/unpackage.rb +55 -0
  24. data/lib/vagrant/action/box/verify.rb +23 -0
  25. data/lib/vagrant/action/builder.rb +124 -0
  26. data/lib/vagrant/action/builtin.rb +104 -0
  27. data/lib/vagrant/action/env.rb +7 -0
  28. data/lib/vagrant/action/env/set.rb +18 -0
  29. data/lib/vagrant/action/environment.rb +50 -0
  30. data/lib/vagrant/action/general.rb +8 -0
  31. data/lib/vagrant/action/general/package.rb +109 -0
  32. data/lib/vagrant/action/general/validate.rb +19 -0
  33. data/lib/vagrant/action/vm.rb +31 -0
  34. data/lib/vagrant/action/vm/boot.rb +48 -0
  35. data/lib/vagrant/action/vm/check_box.rb +28 -0
  36. data/lib/vagrant/action/vm/check_guest_additions.rb +30 -0
  37. data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
  38. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +39 -0
  39. data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
  40. data/lib/vagrant/action/vm/clear_shared_folders.rb +32 -0
  41. data/lib/vagrant/action/vm/customize.rb +21 -0
  42. data/lib/vagrant/action/vm/destroy.rb +19 -0
  43. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
  44. data/lib/vagrant/action/vm/discard_state.rb +22 -0
  45. data/lib/vagrant/action/vm/export.rb +52 -0
  46. data/lib/vagrant/action/vm/forward_ports.rb +134 -0
  47. data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
  48. data/lib/vagrant/action/vm/halt.rb +29 -0
  49. data/lib/vagrant/action/vm/host_name.rb +21 -0
  50. data/lib/vagrant/action/vm/import.rb +35 -0
  51. data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
  52. data/lib/vagrant/action/vm/network.rb +139 -0
  53. data/lib/vagrant/action/vm/nfs.rb +159 -0
  54. data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
  55. data/lib/vagrant/action/vm/package.rb +23 -0
  56. data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
  57. data/lib/vagrant/action/vm/provision.rb +41 -0
  58. data/lib/vagrant/action/vm/resume.rb +20 -0
  59. data/lib/vagrant/action/vm/share_folders.rb +70 -0
  60. data/lib/vagrant/action/vm/suspend.rb +20 -0
  61. data/lib/vagrant/action/warden.rb +79 -0
  62. data/lib/vagrant/box.rb +90 -0
  63. data/lib/vagrant/box_collection.rb +53 -0
  64. data/lib/vagrant/cli.rb +55 -0
  65. data/lib/vagrant/command.rb +25 -0
  66. data/lib/vagrant/command/base.rb +106 -0
  67. data/lib/vagrant/command/box.rb +33 -0
  68. data/lib/vagrant/command/destroy.rb +17 -0
  69. data/lib/vagrant/command/group_base.rb +107 -0
  70. data/lib/vagrant/command/halt.rb +18 -0
  71. data/lib/vagrant/command/helpers.rb +33 -0
  72. data/lib/vagrant/command/init.rb +14 -0
  73. data/lib/vagrant/command/named_base.rb +14 -0
  74. data/lib/vagrant/command/package.rb +41 -0
  75. data/lib/vagrant/command/provision.rb +17 -0
  76. data/lib/vagrant/command/reload.rb +17 -0
  77. data/lib/vagrant/command/resume.rb +17 -0
  78. data/lib/vagrant/command/ssh.rb +42 -0
  79. data/lib/vagrant/command/ssh_config.rb +26 -0
  80. data/lib/vagrant/command/status.rb +22 -0
  81. data/lib/vagrant/command/suspend.rb +17 -0
  82. data/lib/vagrant/command/up.rb +19 -0
  83. data/lib/vagrant/command/upgrade_to_060.rb +45 -0
  84. data/lib/vagrant/command/version.rb +13 -0
  85. data/lib/vagrant/config.rb +123 -0
  86. data/lib/vagrant/config/base.rb +85 -0
  87. data/lib/vagrant/config/error_recorder.rb +19 -0
  88. data/lib/vagrant/config/nfs.rb +10 -0
  89. data/lib/vagrant/config/package.rb +9 -0
  90. data/lib/vagrant/config/ssh.rb +33 -0
  91. data/lib/vagrant/config/top.rb +61 -0
  92. data/lib/vagrant/config/vagrant.rb +16 -0
  93. data/lib/vagrant/config/vm.rb +137 -0
  94. data/lib/vagrant/config/vm/provisioner.rb +56 -0
  95. data/lib/vagrant/config/vm/sub_vm.rb +17 -0
  96. data/lib/vagrant/data_store.rb +70 -0
  97. data/lib/vagrant/downloaders.rb +7 -0
  98. data/lib/vagrant/downloaders/base.rb +23 -0
  99. data/lib/vagrant/downloaders/file.rb +22 -0
  100. data/lib/vagrant/downloaders/http.rb +64 -0
  101. data/lib/vagrant/environment.rb +392 -0
  102. data/lib/vagrant/errors.rb +332 -0
  103. data/lib/vagrant/hosts.rb +8 -0
  104. data/lib/vagrant/hosts/arch.rb +27 -0
  105. data/lib/vagrant/hosts/base.rb +78 -0
  106. data/lib/vagrant/hosts/bsd.rb +52 -0
  107. data/lib/vagrant/hosts/linux.rb +47 -0
  108. data/lib/vagrant/plugin.rb +57 -0
  109. data/lib/vagrant/provisioners.rb +9 -0
  110. data/lib/vagrant/provisioners/base.rb +63 -0
  111. data/lib/vagrant/provisioners/chef.rb +130 -0
  112. data/lib/vagrant/provisioners/chef_server.rb +103 -0
  113. data/lib/vagrant/provisioners/chef_solo.rb +142 -0
  114. data/lib/vagrant/provisioners/puppet.rb +137 -0
  115. data/lib/vagrant/provisioners/puppet_server.rb +55 -0
  116. data/lib/vagrant/provisioners/shell.rb +52 -0
  117. data/lib/vagrant/ssh.rb +173 -0
  118. data/lib/vagrant/ssh/session.rb +125 -0
  119. data/lib/vagrant/systems.rb +11 -0
  120. data/lib/vagrant/systems/base.rb +87 -0
  121. data/lib/vagrant/systems/debian.rb +36 -0
  122. data/lib/vagrant/systems/freebsd.rb +84 -0
  123. data/lib/vagrant/systems/gentoo.rb +27 -0
  124. data/lib/vagrant/systems/linux.rb +83 -0
  125. data/lib/vagrant/systems/linux/config.rb +21 -0
  126. data/lib/vagrant/systems/linux/error.rb +9 -0
  127. data/lib/vagrant/systems/redhat.rb +39 -0
  128. data/lib/vagrant/systems/solaris.rb +62 -0
  129. data/lib/vagrant/systems/ubuntu.rb +17 -0
  130. data/lib/vagrant/test_helpers.rb +128 -0
  131. data/lib/vagrant/ui.rb +69 -0
  132. data/lib/vagrant/util.rb +13 -0
  133. data/lib/vagrant/util/busy.rb +59 -0
  134. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  135. data/lib/vagrant/util/plain_logger.rb +25 -0
  136. data/lib/vagrant/util/platform.rb +65 -0
  137. data/lib/vagrant/util/resource_logger.rb +63 -0
  138. data/lib/vagrant/util/retryable.rb +25 -0
  139. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  140. data/lib/vagrant/util/template_renderer.rb +83 -0
  141. data/lib/vagrant/version.rb +6 -0
  142. data/lib/vagrant/vm.rb +177 -0
  143. data/templates/chef_server_client.erb +18 -0
  144. data/templates/chef_solo_solo.erb +19 -0
  145. data/templates/commands/init/Vagrantfile.erb +82 -0
  146. data/templates/config/validation_failed.erb +7 -0
  147. data/templates/locales/en.yml +535 -0
  148. data/templates/network_entry_debian.erb +8 -0
  149. data/templates/network_entry_gentoo.erb +5 -0
  150. data/templates/network_entry_redhat.erb +8 -0
  151. data/templates/nfs/exports.erb +5 -0
  152. data/templates/nfs/exports_linux.erb +5 -0
  153. data/templates/package_Vagrantfile.erb +11 -0
  154. data/templates/ssh_config.erb +9 -0
  155. data/test/locales/en.yml +8 -0
  156. data/test/test_helper.rb +26 -0
  157. data/test/vagrant/action/box/destroy_test.rb +18 -0
  158. data/test/vagrant/action/box/download_test.rb +125 -0
  159. data/test/vagrant/action/box/package_test.rb +25 -0
  160. data/test/vagrant/action/box/unpackage_test.rb +84 -0
  161. data/test/vagrant/action/box/verify_test.rb +30 -0
  162. data/test/vagrant/action/builder_test.rb +203 -0
  163. data/test/vagrant/action/env/set_test.rb +24 -0
  164. data/test/vagrant/action/environment_test.rb +27 -0
  165. data/test/vagrant/action/general/package_test.rb +268 -0
  166. data/test/vagrant/action/general/validate_test.rb +31 -0
  167. data/test/vagrant/action/vm/boot_test.rb +66 -0
  168. data/test/vagrant/action/vm/check_box_test.rb +56 -0
  169. data/test/vagrant/action/vm/check_guest_additions_test.rb +9 -0
  170. data/test/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
  171. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +72 -0
  172. data/test/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
  173. data/test/vagrant/action/vm/clear_shared_folders_test.rb +49 -0
  174. data/test/vagrant/action/vm/customize_test.rb +30 -0
  175. data/test/vagrant/action/vm/destroy_test.rb +25 -0
  176. data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
  177. data/test/vagrant/action/vm/discard_state_test.rb +45 -0
  178. data/test/vagrant/action/vm/export_test.rb +107 -0
  179. data/test/vagrant/action/vm/forward_ports_helpers_test.rb +70 -0
  180. data/test/vagrant/action/vm/forward_ports_test.rb +194 -0
  181. data/test/vagrant/action/vm/halt_test.rb +79 -0
  182. data/test/vagrant/action/vm/host_name_test.rb +36 -0
  183. data/test/vagrant/action/vm/import_test.rb +66 -0
  184. data/test/vagrant/action/vm/match_mac_address_test.rb +36 -0
  185. data/test/vagrant/action/vm/network_test.rb +286 -0
  186. data/test/vagrant/action/vm/nfs_helpers_test.rb +26 -0
  187. data/test/vagrant/action/vm/nfs_test.rb +260 -0
  188. data/test/vagrant/action/vm/package_test.rb +25 -0
  189. data/test/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
  190. data/test/vagrant/action/vm/provision_test.rb +90 -0
  191. data/test/vagrant/action/vm/resume_test.rb +35 -0
  192. data/test/vagrant/action/vm/share_folders_test.rb +139 -0
  193. data/test/vagrant/action/vm/suspend_test.rb +35 -0
  194. data/test/vagrant/action/warden_test.rb +119 -0
  195. data/test/vagrant/action_test.rb +89 -0
  196. data/test/vagrant/box_collection_test.rb +45 -0
  197. data/test/vagrant/box_test.rb +74 -0
  198. data/test/vagrant/cli_test.rb +35 -0
  199. data/test/vagrant/command/base_test.rb +23 -0
  200. data/test/vagrant/command/group_base_test.rb +15 -0
  201. data/test/vagrant/command/helpers_test.rb +88 -0
  202. data/test/vagrant/command/package_test.rb +27 -0
  203. data/test/vagrant/config/base_test.rb +52 -0
  204. data/test/vagrant/config/error_recorder_test.rb +18 -0
  205. data/test/vagrant/config/ssh_test.rb +12 -0
  206. data/test/vagrant/config/vagrant_test.rb +35 -0
  207. data/test/vagrant/config/vm/provisioner_test.rb +92 -0
  208. data/test/vagrant/config/vm_test.rb +86 -0
  209. data/test/vagrant/config_test.rb +162 -0
  210. data/test/vagrant/data_store_test.rb +77 -0
  211. data/test/vagrant/downloaders/base_test.rb +28 -0
  212. data/test/vagrant/downloaders/file_test.rb +48 -0
  213. data/test/vagrant/downloaders/http_test.rb +80 -0
  214. data/test/vagrant/environment_test.rb +508 -0
  215. data/test/vagrant/errors_test.rb +42 -0
  216. data/test/vagrant/hosts/base_test.rb +46 -0
  217. data/test/vagrant/hosts/bsd_test.rb +53 -0
  218. data/test/vagrant/hosts/linux_test.rb +54 -0
  219. data/test/vagrant/plugin_test.rb +9 -0
  220. data/test/vagrant/provisioners/base_test.rb +63 -0
  221. data/test/vagrant/provisioners/chef_server_test.rb +188 -0
  222. data/test/vagrant/provisioners/chef_solo_test.rb +219 -0
  223. data/test/vagrant/provisioners/chef_test.rb +179 -0
  224. data/test/vagrant/provisioners/puppet_server_test.rb +68 -0
  225. data/test/vagrant/provisioners/puppet_test.rb +182 -0
  226. data/test/vagrant/provisioners/shell_test.rb +68 -0
  227. data/test/vagrant/ssh/session_test.rb +40 -0
  228. data/test/vagrant/ssh_test.rb +342 -0
  229. data/test/vagrant/systems/base_test.rb +18 -0
  230. data/test/vagrant/systems/linux_test.rb +114 -0
  231. data/test/vagrant/ui_test.rb +29 -0
  232. data/test/vagrant/util/busy_test.rb +106 -0
  233. data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
  234. data/test/vagrant/util/plain_logger_test.rb +17 -0
  235. data/test/vagrant/util/platform_test.rb +18 -0
  236. data/test/vagrant/util/resource_logger_test.rb +78 -0
  237. data/test/vagrant/util/retryable_test.rb +50 -0
  238. data/test/vagrant/util/stacked_proc_runner_test.rb +43 -0
  239. data/test/vagrant/util/template_renderer_test.rb +145 -0
  240. data/test/vagrant/vm_test.rb +291 -0
  241. data/vagrant.gemspec +36 -0
  242. metadata +514 -0
@@ -0,0 +1,11 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ module NFSHelpers
5
+ def clear_nfs_exports(env)
6
+ env["host"].nfs_cleanup if env["host"]
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'vagrant/action/general/package'
2
+
3
+ module Vagrant
4
+ class Action
5
+ module VM
6
+ # A subclass of {General::Package} which simply makes sure that
7
+ # the package directory is set to the directory which the VM
8
+ # was exported to.
9
+ class Package < General::Package
10
+ # Doing this so that we can test that the parent is properly
11
+ # called in the unit tests.
12
+ alias_method :general_call, :call
13
+ def call(env)
14
+ # Just match up a couple environmental variables so that
15
+ # the superclass will do the right thing. Then, call the
16
+ # superclass
17
+ env["package.directory"] = env["export.temp_dir"]
18
+ general_call(env)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ # Puts a generated Vagrantfile into the package directory so that
5
+ # it can be included in the package.
6
+ class PackageVagrantfile
7
+ include Util
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ @env = env
12
+ end
13
+
14
+ def call(env)
15
+ @env = env
16
+ create_vagrantfile
17
+ @app.call(env)
18
+ end
19
+
20
+ # This method creates the auto-generated Vagrantfile at the root of the
21
+ # box. This Vagrantfile contains the MAC address so that the user doesn't
22
+ # have to worry about it.
23
+ def create_vagrantfile
24
+ File.open(File.join(@env["export.temp_dir"], "Vagrantfile"), "w") do |f|
25
+ f.write(TemplateRenderer.render("package_Vagrantfile", {
26
+ :base_mac => @env["vm"].vm.network_adapters.first.mac_address
27
+ }))
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class Provision
5
+ attr_reader :provisioners
6
+
7
+ def initialize(app, env)
8
+ @app = app
9
+ @env = env
10
+ @env["provision.enabled"] = true if !@env.has_key?("provision.enabled")
11
+ @provisioners = []
12
+
13
+ load_provisioners if provisioning_enabled?
14
+ end
15
+
16
+ def call(env)
17
+ @app.call(env)
18
+
19
+ @provisioners.each do |instance|
20
+ @env.ui.info I18n.t("vagrant.actions.vm.provision.beginning", :provisioner => instance.class)
21
+ instance.provision!
22
+ end
23
+ end
24
+
25
+ def provisioning_enabled?
26
+ !@env["config"].vm.provisioners.empty? && @env["provision.enabled"]
27
+ end
28
+
29
+ def load_provisioners
30
+ @env["config"].vm.provisioners.each do |provisioner|
31
+ @env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => provisioner.shortcut)
32
+
33
+ instance = provisioner.provisioner.new(@env, provisioner.config)
34
+ instance.prepare
35
+ @provisioners << instance
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class Resume
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env["vm"].vm.saved?
11
+ env.ui.info I18n.t("vagrant.actions.vm.resume.resuming")
12
+ env["actions"].run(Boot)
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,70 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class ShareFolders
5
+ def initialize(app, env)
6
+ @app = app
7
+ @env = env
8
+ end
9
+
10
+ def call(env)
11
+ @env = env
12
+
13
+ create_metadata
14
+
15
+ @app.call(env)
16
+
17
+ mount_shared_folders
18
+ end
19
+
20
+ # This method returns an actual list of VirtualBox shared
21
+ # folders to create and their proper path.
22
+ def shared_folders
23
+ @env.env.config.vm.shared_folders.inject({}) do |acc, data|
24
+ key, value = data
25
+
26
+ next acc if value[:disabled]
27
+
28
+ # This to prevent overwriting the actual shared folders data
29
+ value = value.dup
30
+ acc[key] = value
31
+ acc
32
+ end
33
+ end
34
+
35
+ def create_metadata
36
+ @env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
37
+
38
+ shared_folders.each do |name, data|
39
+ folder = VirtualBox::SharedFolder.new
40
+ folder.name = name
41
+ folder.host_path = File.expand_path(data[:hostpath], @env.env.root_path)
42
+ @env["vm"].vm.shared_folders << folder
43
+ end
44
+
45
+ @env["vm"].vm.save
46
+ end
47
+
48
+ def mount_shared_folders
49
+ @env.ui.info I18n.t("vagrant.actions.vm.share_folders.mounting")
50
+
51
+ @env["vm"].ssh.execute do |ssh|
52
+ shared_folders.each do |name, data|
53
+ if data[:guestpath]
54
+ # Guest path specified, so mount the folder to specified point
55
+ @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
56
+ :name => name,
57
+ :guest_path => data[:guestpath]))
58
+ @env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath])
59
+ else
60
+ # If no guest path is specified, then automounting is disabled
61
+ @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
62
+ :name => name))
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,20 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class Suspend
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env["vm"].vm.running?
11
+ env.ui.info I18n.t("vagrant.actions.vm.suspend.suspending")
12
+ env["vm"].vm.save_state
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,79 @@
1
+ module Vagrant
2
+ class Action
3
+ # The action warden is a middleware which injects itself between
4
+ # every other middleware, watching for exceptions which are raised
5
+ # and performing proper cleanup on every action by calling the `recover`
6
+ # method. The warden therefore allows middlewares to not worry about
7
+ # exceptional events, and by providing a simple callback, can clean up
8
+ # in any erroneous case.
9
+ #
10
+ # Warden will "just work" behind the scenes, and is not of particular
11
+ # interest except to those who are curious about the internal workings
12
+ # of Vagrant.
13
+ class Warden
14
+ attr_accessor :actions, :stack
15
+
16
+ def initialize(actions, env)
17
+ @stack = []
18
+ @actions = actions.map { |m| finalize_action(m, env) }
19
+ end
20
+
21
+ def call(env)
22
+ return if @actions.empty?
23
+
24
+ begin
25
+ # Call the next middleware in the sequence, appending to the stack
26
+ # of "recoverable" middlewares in case something goes wrong!
27
+ raise Errors::VagrantInterrupt if env.interrupted?
28
+ @stack.unshift(@actions.shift).first.call(env)
29
+ raise Errors::VagrantInterrupt if env.interrupted?
30
+ rescue SystemExit
31
+ # This means that an "exit" or "abort" was called. In these cases,
32
+ # we just exit immediately.
33
+ raise
34
+ rescue Exception => e
35
+ env["vagrant.error"] = e
36
+
37
+ # Something went horribly wrong. Start the rescue chain then
38
+ # reraise the exception to properly kick us out of limbo here.
39
+ begin_rescue(env)
40
+ raise
41
+ end
42
+ end
43
+
44
+ # Begins the recovery sequence for all middlewares which have run.
45
+ # It does this by calling `recover` (if it exists) on each middleware
46
+ # which has already run, in reverse order.
47
+ def begin_rescue(env)
48
+ @stack.each do |act|
49
+ act.recover(env) if act.respond_to?(:recover)
50
+ end
51
+
52
+ # Clear stack so that warden down the middleware chain doesn't
53
+ # rescue again.
54
+ @stack.clear
55
+ end
56
+
57
+ # A somewhat confusing function which simply initializes each
58
+ # middleware properly to call the next middleware in the sequence.
59
+ def finalize_action(action, env)
60
+ klass, args, block = action
61
+
62
+ if klass.is_a?(Class)
63
+ # A action klass which is to be instantiated with the
64
+ # app, env, and any arguments given
65
+ klass.new(self, env, *args, &block)
66
+ elsif klass.respond_to?(:call)
67
+ # Make it a lambda which calls the item then forwards
68
+ # up the chain
69
+ lambda do |e|
70
+ klass.call(e)
71
+ self.call(e)
72
+ end
73
+ else
74
+ raise "Invalid action: #{action.inspect}"
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,90 @@
1
+ module Vagrant
2
+ # Represents a "box," which is simply a packaged vagrant environment.
3
+ # Boxes are simply `tar` files which contain an exported VirtualBox
4
+ # virtual machine, at the least. They are created with `vagrant package`
5
+ # and may contain additional files if specified by the creator. This
6
+ # class serves to help manage these boxes, although most of the logic
7
+ # is kicked out to middlewares.
8
+ class Box
9
+ # The name of the box.
10
+ attr_accessor :name
11
+
12
+ # The URI for a new box. This is not available for existing boxes.
13
+ attr_accessor :uri
14
+
15
+ # The environment which this box belongs to. Although this could
16
+ # actually be many environments, this points to the environment
17
+ # of a specific instance.
18
+ attr_reader :env
19
+
20
+ class << self
21
+ # Adds a new box with given name from the given URI. This method
22
+ # begins the process of adding a box from a given URI by setting up
23
+ # the {Box} instance and calling {#add}.
24
+ #
25
+ # @param [String] name The name of the box
26
+ # @param [String] uri URI to the box file
27
+ def add(env, name, uri)
28
+ box = new(env, name)
29
+ box.uri = uri
30
+ box.add
31
+ end
32
+ end
33
+
34
+ # Creates a new box instance. Given an optional `name` parameter,
35
+ # newly created instance will have that name, otherwise it defaults
36
+ # to `nil`.
37
+ #
38
+ # **Note:** This method does not actually _create_ the box, but merely
39
+ # returns a new, abstract representation of it. To add a box, see {#add}.
40
+ def initialize(env=nil, name=nil)
41
+ @name = name
42
+ @env = env
43
+ end
44
+
45
+ # Returns path to the OVF file of the box. The OVF file is an open
46
+ # virtual machine file which contains specifications of the exported
47
+ # virtual machine this box contains.
48
+ #
49
+ # This will only be valid once the box is imported.
50
+ #
51
+ # @return [String]
52
+ def ovf_file
53
+ directory.join(env.config.vm.box_ovf)
54
+ end
55
+
56
+ # Begins the process of adding a box to the vagrant installation. This
57
+ # method requires that `name` and `uri` be set. The logic of this method
58
+ # is kicked out to the `box_add` registered middleware.
59
+ def add
60
+ raise Errors::BoxAlreadyExists, :name => name if File.directory?(directory)
61
+ env.actions.run(:box_add, { "box" => self, "validate" => false })
62
+ end
63
+
64
+ # Begins the process of destroying this box. This cannot be undone!
65
+ def destroy
66
+ env.actions.run(:box_remove, { "box" => self, "validate" => false })
67
+ end
68
+
69
+ # Begins sequence to repackage this box.
70
+ def repackage(options=nil)
71
+ env.actions.run(:box_repackage, { "box" => self, "validate" => false }.merge(options || {}))
72
+ end
73
+
74
+ # Returns the directory to the location of this boxes content in the local
75
+ # filesystem. Note that if the box isn't imported yet, then the path may not
76
+ # yet exist, but still represents where the box will be imported to.
77
+ #
78
+ # @return [String]
79
+ def directory
80
+ env.boxes_path.join(name)
81
+ end
82
+
83
+ # Implemented for comparison with other boxes. Comparison is implemented
84
+ # by simply comparing name.
85
+ def <=>(other)
86
+ return super if !other.is_a?(self.class)
87
+ name <=> other.name
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,53 @@
1
+ require 'forwardable'
2
+
3
+ module Vagrant
4
+ # Represents a collection of boxes, providing helpful methods for
5
+ # finding boxes. An instance of this is returned by {Environment#boxes}.
6
+ #
7
+ # # Finding a Box
8
+ #
9
+ # To find a box, use the {#find} method with the name of the box. The name
10
+ # is an exact match search.
11
+ #
12
+ # env.boxes.find("base") # => #<Vagrant::Box>
13
+ #
14
+ class BoxCollection
15
+ include Enumerable
16
+ extend Forwardable
17
+ def_delegators :@boxes, :length, :each
18
+
19
+ # The environment this box collection belongs to
20
+ attr_reader :env
21
+
22
+ def initialize(env)
23
+ @env = env
24
+ @boxes = []
25
+
26
+ reload!
27
+ end
28
+
29
+ # Find a box in the collection by the given name. The name must
30
+ # be a string, for now.
31
+ def find(name)
32
+ @boxes.each do |box|
33
+ return box if box.name == name
34
+ end
35
+
36
+ nil
37
+ end
38
+
39
+ # Loads the list of all boxes from the source. This modifies the
40
+ # current array.
41
+ def reload!
42
+ @boxes.clear
43
+
44
+ Dir.open(env.boxes_path) do |dir|
45
+ dir.each do |d|
46
+ next if d == "." || d == ".." || !File.directory?(env.boxes_path.join(d))
47
+ @boxes << Box.new(env, d)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+