rvagrant 0.8.7.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 (251) hide show
  1. data/.gitignore +25 -0
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +386 -0
  4. data/Gemfile +21 -0
  5. data/LICENSE +21 -0
  6. data/README.md +61 -0
  7. data/Rakefile +11 -0
  8. data/bin/vagrant +28 -0
  9. data/config/default.rb +38 -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 +44 -0
  18. data/lib/vagrant/action.rb +138 -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 +108 -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 +113 -0
  32. data/lib/vagrant/action/general/validate.rb +19 -0
  33. data/lib/vagrant/action/vm.rb +34 -0
  34. data/lib/vagrant/action/vm/boot.rb +48 -0
  35. data/lib/vagrant/action/vm/check_accessible.rb +23 -0
  36. data/lib/vagrant/action/vm/check_box.rb +28 -0
  37. data/lib/vagrant/action/vm/check_guest_additions.rb +35 -0
  38. data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
  39. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +26 -0
  40. data/lib/vagrant/action/vm/clear_nfs_exports.rb +20 -0
  41. data/lib/vagrant/action/vm/clear_shared_folders.rb +27 -0
  42. data/lib/vagrant/action/vm/customize.rb +26 -0
  43. data/lib/vagrant/action/vm/destroy.rb +19 -0
  44. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +30 -0
  45. data/lib/vagrant/action/vm/discard_state.rb +22 -0
  46. data/lib/vagrant/action/vm/export.rb +52 -0
  47. data/lib/vagrant/action/vm/forward_ports.rb +133 -0
  48. data/lib/vagrant/action/vm/forward_ports_helpers.rb +28 -0
  49. data/lib/vagrant/action/vm/halt.rb +29 -0
  50. data/lib/vagrant/action/vm/host_name.rb +21 -0
  51. data/lib/vagrant/action/vm/import.rb +40 -0
  52. data/lib/vagrant/action/vm/match_mac_address.rb +26 -0
  53. data/lib/vagrant/action/vm/modify.rb +37 -0
  54. data/lib/vagrant/action/vm/network.rb +146 -0
  55. data/lib/vagrant/action/vm/nfs.rb +160 -0
  56. data/lib/vagrant/action/vm/nfs_helpers.rb +11 -0
  57. data/lib/vagrant/action/vm/package.rb +23 -0
  58. data/lib/vagrant/action/vm/package_vagrantfile.rb +33 -0
  59. data/lib/vagrant/action/vm/provision.rb +34 -0
  60. data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
  61. data/lib/vagrant/action/vm/resume.rb +20 -0
  62. data/lib/vagrant/action/vm/share_folders.rb +78 -0
  63. data/lib/vagrant/action/vm/suspend.rb +20 -0
  64. data/lib/vagrant/action/warden.rb +85 -0
  65. data/lib/vagrant/box.rb +90 -0
  66. data/lib/vagrant/box_collection.rb +53 -0
  67. data/lib/vagrant/cli.rb +55 -0
  68. data/lib/vagrant/command.rb +25 -0
  69. data/lib/vagrant/command/base.rb +106 -0
  70. data/lib/vagrant/command/box.rb +33 -0
  71. data/lib/vagrant/command/destroy.rb +17 -0
  72. data/lib/vagrant/command/group_base.rb +107 -0
  73. data/lib/vagrant/command/halt.rb +18 -0
  74. data/lib/vagrant/command/helpers.rb +33 -0
  75. data/lib/vagrant/command/init.rb +14 -0
  76. data/lib/vagrant/command/named_base.rb +14 -0
  77. data/lib/vagrant/command/package.rb +41 -0
  78. data/lib/vagrant/command/provision.rb +23 -0
  79. data/lib/vagrant/command/reload.rb +17 -0
  80. data/lib/vagrant/command/resume.rb +17 -0
  81. data/lib/vagrant/command/ssh.rb +49 -0
  82. data/lib/vagrant/command/ssh_config.rb +29 -0
  83. data/lib/vagrant/command/status.rb +31 -0
  84. data/lib/vagrant/command/suspend.rb +17 -0
  85. data/lib/vagrant/command/up.rb +19 -0
  86. data/lib/vagrant/command/upgrade_to_060.rb +45 -0
  87. data/lib/vagrant/command/version.rb +13 -0
  88. data/lib/vagrant/config.rb +123 -0
  89. data/lib/vagrant/config/base.rb +85 -0
  90. data/lib/vagrant/config/error_recorder.rb +19 -0
  91. data/lib/vagrant/config/nfs.rb +10 -0
  92. data/lib/vagrant/config/package.rb +9 -0
  93. data/lib/vagrant/config/ssh.rb +38 -0
  94. data/lib/vagrant/config/top.rb +61 -0
  95. data/lib/vagrant/config/vagrant.rb +17 -0
  96. data/lib/vagrant/config/vm.rb +148 -0
  97. data/lib/vagrant/config/vm/provisioner.rb +56 -0
  98. data/lib/vagrant/config/vm/sub_vm.rb +17 -0
  99. data/lib/vagrant/data_store.rb +70 -0
  100. data/lib/vagrant/downloaders.rb +7 -0
  101. data/lib/vagrant/downloaders/base.rb +23 -0
  102. data/lib/vagrant/downloaders/file.rb +22 -0
  103. data/lib/vagrant/downloaders/http.rb +70 -0
  104. data/lib/vagrant/environment.rb +516 -0
  105. data/lib/vagrant/errors.rb +352 -0
  106. data/lib/vagrant/hosts.rb +9 -0
  107. data/lib/vagrant/hosts/arch.rb +27 -0
  108. data/lib/vagrant/hosts/base.rb +76 -0
  109. data/lib/vagrant/hosts/bsd.rb +58 -0
  110. data/lib/vagrant/hosts/fedora.rb +11 -0
  111. data/lib/vagrant/hosts/linux.rb +69 -0
  112. data/lib/vagrant/plugin.rb +79 -0
  113. data/lib/vagrant/provisioners.rb +9 -0
  114. data/lib/vagrant/provisioners/base.rb +67 -0
  115. data/lib/vagrant/provisioners/chef.rb +155 -0
  116. data/lib/vagrant/provisioners/chef_client.rb +120 -0
  117. data/lib/vagrant/provisioners/chef_solo.rb +135 -0
  118. data/lib/vagrant/provisioners/puppet.rb +137 -0
  119. data/lib/vagrant/provisioners/puppet_server.rb +55 -0
  120. data/lib/vagrant/provisioners/shell.rb +96 -0
  121. data/lib/vagrant/ssh.rb +224 -0
  122. data/lib/vagrant/ssh/session.rb +136 -0
  123. data/lib/vagrant/systems.rb +13 -0
  124. data/lib/vagrant/systems/arch.rb +34 -0
  125. data/lib/vagrant/systems/base.rb +87 -0
  126. data/lib/vagrant/systems/debian.rb +36 -0
  127. data/lib/vagrant/systems/freebsd.rb +84 -0
  128. data/lib/vagrant/systems/gentoo.rb +27 -0
  129. data/lib/vagrant/systems/linux.rb +82 -0
  130. data/lib/vagrant/systems/linux/config.rb +21 -0
  131. data/lib/vagrant/systems/linux/error.rb +9 -0
  132. data/lib/vagrant/systems/redhat.rb +48 -0
  133. data/lib/vagrant/systems/solaris.rb +67 -0
  134. data/lib/vagrant/systems/suse.rb +9 -0
  135. data/lib/vagrant/systems/ubuntu.rb +17 -0
  136. data/lib/vagrant/test_helpers.rb +128 -0
  137. data/lib/vagrant/ui.rb +81 -0
  138. data/lib/vagrant/util.rb +13 -0
  139. data/lib/vagrant/util/busy.rb +59 -0
  140. data/lib/vagrant/util/counter.rb +24 -0
  141. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  142. data/lib/vagrant/util/platform.rb +57 -0
  143. data/lib/vagrant/util/retryable.rb +25 -0
  144. data/lib/vagrant/util/safe_exec.rb +35 -0
  145. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  146. data/lib/vagrant/util/template_renderer.rb +83 -0
  147. data/lib/vagrant/version.rb +6 -0
  148. data/lib/vagrant/vm.rb +181 -0
  149. data/templates/chef_server_client.erb +32 -0
  150. data/templates/chef_solo_solo.erb +23 -0
  151. data/templates/commands/init/Vagrantfile.erb +86 -0
  152. data/templates/config/validation_failed.erb +7 -0
  153. data/templates/locales/en.yml +556 -0
  154. data/templates/network_entry_arch.erb +9 -0
  155. data/templates/network_entry_debian.erb +8 -0
  156. data/templates/network_entry_gentoo.erb +5 -0
  157. data/templates/network_entry_redhat.erb +9 -0
  158. data/templates/nfs/exports.erb +5 -0
  159. data/templates/nfs/exports_linux.erb +5 -0
  160. data/templates/package_Vagrantfile.erb +11 -0
  161. data/templates/ssh_config.erb +15 -0
  162. data/test/unit/locales/en.yml +8 -0
  163. data/test/unit/test_helper.rb +28 -0
  164. data/test/unit/vagrant/action/box/destroy_test.rb +18 -0
  165. data/test/unit/vagrant/action/box/download_test.rb +125 -0
  166. data/test/unit/vagrant/action/box/package_test.rb +25 -0
  167. data/test/unit/vagrant/action/box/unpackage_test.rb +84 -0
  168. data/test/unit/vagrant/action/box/verify_test.rb +30 -0
  169. data/test/unit/vagrant/action/builder_test.rb +207 -0
  170. data/test/unit/vagrant/action/env/set_test.rb +24 -0
  171. data/test/unit/vagrant/action/environment_test.rb +27 -0
  172. data/test/unit/vagrant/action/general/package_test.rb +268 -0
  173. data/test/unit/vagrant/action/general/validate_test.rb +31 -0
  174. data/test/unit/vagrant/action/vm/boot_test.rb +66 -0
  175. data/test/unit/vagrant/action/vm/check_accessible_test.rb +61 -0
  176. data/test/unit/vagrant/action/vm/check_box_test.rb +56 -0
  177. data/test/unit/vagrant/action/vm/check_guest_additions_test.rb +9 -0
  178. data/test/unit/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
  179. data/test/unit/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
  180. data/test/unit/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
  181. data/test/unit/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
  182. data/test/unit/vagrant/action/vm/customize_test.rb +37 -0
  183. data/test/unit/vagrant/action/vm/destroy_test.rb +25 -0
  184. data/test/unit/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
  185. data/test/unit/vagrant/action/vm/discard_state_test.rb +45 -0
  186. data/test/unit/vagrant/action/vm/export_test.rb +107 -0
  187. data/test/unit/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
  188. data/test/unit/vagrant/action/vm/forward_ports_test.rb +213 -0
  189. data/test/unit/vagrant/action/vm/halt_test.rb +79 -0
  190. data/test/unit/vagrant/action/vm/host_name_test.rb +36 -0
  191. data/test/unit/vagrant/action/vm/import_test.rb +66 -0
  192. data/test/unit/vagrant/action/vm/match_mac_address_test.rb +40 -0
  193. data/test/unit/vagrant/action/vm/modify_test.rb +38 -0
  194. data/test/unit/vagrant/action/vm/network_test.rb +286 -0
  195. data/test/unit/vagrant/action/vm/nfs_helpers_test.rb +26 -0
  196. data/test/unit/vagrant/action/vm/nfs_test.rb +260 -0
  197. data/test/unit/vagrant/action/vm/package_test.rb +25 -0
  198. data/test/unit/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
  199. data/test/unit/vagrant/action/vm/provision_test.rb +65 -0
  200. data/test/unit/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
  201. data/test/unit/vagrant/action/vm/resume_test.rb +35 -0
  202. data/test/unit/vagrant/action/vm/share_folders_test.rb +144 -0
  203. data/test/unit/vagrant/action/vm/suspend_test.rb +35 -0
  204. data/test/unit/vagrant/action/warden_test.rb +125 -0
  205. data/test/unit/vagrant/action_test.rb +89 -0
  206. data/test/unit/vagrant/box_collection_test.rb +45 -0
  207. data/test/unit/vagrant/box_test.rb +74 -0
  208. data/test/unit/vagrant/cli_test.rb +35 -0
  209. data/test/unit/vagrant/command/base_test.rb +23 -0
  210. data/test/unit/vagrant/command/group_base_test.rb +15 -0
  211. data/test/unit/vagrant/command/helpers_test.rb +88 -0
  212. data/test/unit/vagrant/command/package_test.rb +27 -0
  213. data/test/unit/vagrant/config/base_test.rb +52 -0
  214. data/test/unit/vagrant/config/error_recorder_test.rb +18 -0
  215. data/test/unit/vagrant/config/ssh_test.rb +12 -0
  216. data/test/unit/vagrant/config/vagrant_test.rb +35 -0
  217. data/test/unit/vagrant/config/vm/provisioner_test.rb +92 -0
  218. data/test/unit/vagrant/config/vm_test.rb +56 -0
  219. data/test/unit/vagrant/config_test.rb +162 -0
  220. data/test/unit/vagrant/data_store_test.rb +77 -0
  221. data/test/unit/vagrant/downloaders/base_test.rb +28 -0
  222. data/test/unit/vagrant/downloaders/file_test.rb +48 -0
  223. data/test/unit/vagrant/downloaders/http_test.rb +82 -0
  224. data/test/unit/vagrant/environment_test.rb +598 -0
  225. data/test/unit/vagrant/errors_test.rb +42 -0
  226. data/test/unit/vagrant/hosts/base_test.rb +46 -0
  227. data/test/unit/vagrant/hosts/bsd_test.rb +53 -0
  228. data/test/unit/vagrant/hosts/linux_test.rb +54 -0
  229. data/test/unit/vagrant/plugin_test.rb +9 -0
  230. data/test/unit/vagrant/provisioners/base_test.rb +63 -0
  231. data/test/unit/vagrant/provisioners/chef_client_test.rb +190 -0
  232. data/test/unit/vagrant/provisioners/chef_solo_test.rb +114 -0
  233. data/test/unit/vagrant/provisioners/chef_test.rb +202 -0
  234. data/test/unit/vagrant/provisioners/puppet_server_test.rb +68 -0
  235. data/test/unit/vagrant/provisioners/puppet_test.rb +182 -0
  236. data/test/unit/vagrant/provisioners/shell_test.rb +79 -0
  237. data/test/unit/vagrant/ssh/session_test.rb +40 -0
  238. data/test/unit/vagrant/ssh_test.rb +307 -0
  239. data/test/unit/vagrant/systems/base_test.rb +18 -0
  240. data/test/unit/vagrant/systems/linux_test.rb +104 -0
  241. data/test/unit/vagrant/ui_test.rb +29 -0
  242. data/test/unit/vagrant/util/busy_test.rb +106 -0
  243. data/test/unit/vagrant/util/counter_test.rb +29 -0
  244. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
  245. data/test/unit/vagrant/util/platform_test.rb +18 -0
  246. data/test/unit/vagrant/util/retryable_test.rb +50 -0
  247. data/test/unit/vagrant/util/stacked_proc_runner_test.rb +43 -0
  248. data/test/unit/vagrant/util/template_renderer_test.rb +145 -0
  249. data/test/unit/vagrant/vm_test.rb +300 -0
  250. data/vagrant.gemspec +35 -0
  251. metadata +431 -0
@@ -0,0 +1,21 @@
1
+ require 'fileutils'
2
+
3
+ module Vagrant
4
+ class Action
5
+ module Box
6
+ class Destroy
7
+ def initialize(app, env)
8
+ @app = app
9
+ @env = env
10
+ end
11
+
12
+ def call(env)
13
+ env.ui.info I18n.t("vagrant.actions.box.destroy.destroying", :name => env["box"].name)
14
+ FileUtils.rm_rf(env["box"].directory)
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,72 @@
1
+ module Vagrant
2
+ class Action
3
+ module Box
4
+ class Download
5
+ BASENAME = "box"
6
+
7
+ include Util
8
+
9
+ attr_reader :temp_path
10
+
11
+ def initialize(app, env)
12
+ @app = app
13
+ @env = env
14
+ @env["download.classes"] ||= []
15
+ @env["download.classes"] += [Downloaders::HTTP, Downloaders::File]
16
+ @downloader = nil
17
+ end
18
+
19
+ def call(env)
20
+ @env = env
21
+
22
+ download if instantiate_downloader
23
+ @app.call(@env)
24
+
25
+ recover(env) # called in both cases to cleanup workspace
26
+ end
27
+
28
+ def instantiate_downloader
29
+ @env["download.classes"].each do |klass|
30
+ if klass.match?(@env["box"].uri)
31
+ @env.ui.info I18n.t("vagrant.actions.box.download.with", :class => klass.to_s)
32
+ @downloader = klass.new(@env)
33
+ end
34
+ end
35
+
36
+ raise Errors::BoxDownloadUnknownType if !@downloader
37
+
38
+ @downloader.prepare(@env["box"].uri)
39
+ true
40
+ end
41
+
42
+ def download
43
+ with_tempfile do |tempfile|
44
+ download_to(tempfile)
45
+ @temp_path = @env["download.temp_path"] = tempfile.path
46
+ end
47
+ end
48
+
49
+ def recover(env)
50
+ if temp_path && File.exist?(temp_path)
51
+ env.ui.info I18n.t("vagrant.actions.box.download.cleaning")
52
+ File.unlink(temp_path)
53
+ end
54
+ end
55
+
56
+ def with_tempfile
57
+ File.open(box_temp_path, Platform.tar_file_options) do |tempfile|
58
+ yield tempfile
59
+ end
60
+ end
61
+
62
+ def box_temp_path
63
+ @env.env.tmp_path.join(BASENAME + Time.now.to_i.to_s)
64
+ end
65
+
66
+ def download_to(f)
67
+ @downloader.download!(@env["box"].uri, f)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,19 @@
1
+ require 'vagrant/action/general/package'
2
+
3
+ module Vagrant
4
+ class Action
5
+ module Box
6
+ # Packages a box which has already been unpackaged (such as
7
+ # for the `vagrant box repackage` command) by leveraging the
8
+ # general packager middleware.
9
+ class Package < General::Package
10
+ # Alias instead of calling super for testability
11
+ alias_method :general_call, :call
12
+ def call(env)
13
+ env["package.directory"] = env["box"].directory
14
+ general_call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,55 @@
1
+ require 'fileutils'
2
+ require 'archive/tar/minitar'
3
+
4
+ module Vagrant
5
+ class Action
6
+ module Box
7
+ # Unpackages a downloaded box to a given directory with a given
8
+ # name.
9
+ #
10
+ # # Required Variables
11
+ #
12
+ # * `download.temp_path` - A location for the downloaded box. This is
13
+ # set by the {Download} action.
14
+ # * `box` - A {Vagrant::Box} object.
15
+ #
16
+ class Unpackage
17
+ attr_reader :box_directory
18
+
19
+ def initialize(app, env)
20
+ @app = app
21
+ @env = env
22
+ end
23
+
24
+ def call(env)
25
+ @env = env
26
+
27
+ setup_box_directory
28
+ decompress
29
+
30
+ @app.call(@env)
31
+ end
32
+
33
+ def recover(env)
34
+ if box_directory && File.directory?(box_directory)
35
+ FileUtils.rm_rf(box_directory)
36
+ end
37
+ end
38
+
39
+ def setup_box_directory
40
+ raise Errors::BoxAlreadyExists, :name => @env["box"].name if File.directory?(@env["box"].directory)
41
+
42
+ FileUtils.mkdir_p(@env["box"].directory)
43
+ @box_directory = @env["box"].directory
44
+ end
45
+
46
+ def decompress
47
+ Dir.chdir(@env["box"].directory) do
48
+ @env.ui.info I18n.t("vagrant.actions.box.unpackage.extracting")
49
+ Archive::Tar::Minitar.unpack(@env["download.temp_path"], @env["box"].directory.to_s)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,23 @@
1
+ module Vagrant
2
+ class Action
3
+ module Box
4
+ class Verify
5
+ def initialize(app, env)
6
+ @app = app
7
+ @env = env
8
+ end
9
+
10
+ def call(env)
11
+ begin
12
+ env.ui.info I18n.t("vagrant.actions.box.verify.verifying")
13
+ VirtualBox::Appliance.new(env["box"].ovf_file.to_s)
14
+ rescue Exception
15
+ raise Errors::BoxVerificationFailed
16
+ end
17
+
18
+ @app.call(env)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,124 @@
1
+ module Vagrant
2
+ class Action
3
+ # Action builder which provides a nice DSL for building up
4
+ # a middleware sequence for Vagrant actions. This code is based
5
+ # heavily off of `Rack::Builder` and `ActionDispatch::MiddlewareStack`
6
+ # in Rack and Rails, respectively.
7
+ #
8
+ # Usage
9
+ #
10
+ # Building an action sequence is very easy:
11
+ #
12
+ # app = Vagrant::Action::Builder.new do
13
+ # use MiddlewareA
14
+ # use MiddlewareB
15
+ # end
16
+ #
17
+ # Vagrant::Action.run(app)
18
+ #
19
+ class Builder
20
+ # Initializes the builder. An optional block can be passed which
21
+ # will be evaluated in the context of the instance.
22
+ def initialize(&block)
23
+ instance_eval(&block) if block_given?
24
+ end
25
+
26
+ # Returns the current stack of middlewares. You probably won't
27
+ # need to use this directly, and it's recommended that you don't.
28
+ #
29
+ # @return [Array]
30
+ def stack
31
+ @stack ||= []
32
+ end
33
+
34
+ # Returns a mergeable version of the builder. If `use` is called with
35
+ # the return value of this method, then the stack will merge, instead
36
+ # of being treated as a separate single middleware.
37
+ def flatten
38
+ lambda do |env|
39
+ self.call(env)
40
+ end
41
+ end
42
+
43
+ # Adds a middleware class to the middleware stack. Any additional
44
+ # args and a block, if given, are saved and passed to the initializer
45
+ # of the middleware.
46
+ #
47
+ # @param [Class] middleware The middleware class
48
+ def use(middleware, *args, &block)
49
+ if middleware.kind_of?(Builder)
50
+ # Prepend with a environment setter if args are given
51
+ self.use(Env::Set, *args, &block) if !args.empty? && args.first.is_a?(Hash)
52
+
53
+ # Merge in the other builder's stack into our own
54
+ self.stack.concat(middleware.stack)
55
+ else
56
+ self.stack << [middleware, args, block]
57
+ end
58
+
59
+ self
60
+ end
61
+
62
+ # Inserts a middleware at the given index or directly before the
63
+ # given middleware object.
64
+ def insert(index, middleware, *args, &block)
65
+ index = self.index(index) unless index.is_a?(Integer)
66
+ stack.insert(index, [middleware, args, block])
67
+ end
68
+
69
+ alias_method :insert_before, :insert
70
+
71
+ # Inserts a middleware after the given index or middleware object.
72
+ def insert_after(index, middleware, *args, &block)
73
+ index = self.index(index) unless index.is_a?(Integer)
74
+ raise "no such middleware to insert after: #{index.inspect}" unless index
75
+ insert(index + 1, middleware, *args, &block)
76
+ end
77
+
78
+ # Swaps out the given middlware object or index with the new
79
+ # middleware.
80
+ def swap(index, middleware, *args, &block)
81
+ if index.is_a?(Integer)
82
+ delete(index)
83
+ insert(index, middleware, *args, &block)
84
+ else
85
+ insert_before(index, middleware, *args, &block)
86
+ delete(index)
87
+ end
88
+ end
89
+
90
+ # Deletes the given middleware object or index
91
+ def delete(index)
92
+ index = self.index(index) unless index.is_a?(Integer)
93
+ stack.delete_at(index)
94
+ end
95
+
96
+ # Returns the numeric index for the given middleware object.
97
+ #
98
+ # @param [Object] object The item to find the index for
99
+ # @return [Integer]
100
+ def index(object)
101
+ stack.each_with_index do |item, i|
102
+ return i if item[0] == object
103
+ end
104
+
105
+ nil
106
+ end
107
+
108
+ # Converts the builder stack to a runnable action sequence.
109
+ #
110
+ # @param [Vagrant::Action::Environment] env The action environment
111
+ # @return [Object] A callable object
112
+ def to_app(env)
113
+ # Wrap the middleware stack with the Warden to provide a consistent
114
+ # and predictable behavior upon exceptions.
115
+ Warden.new(stack.dup, env)
116
+ end
117
+
118
+ # Runs the builder stack with the given environment.
119
+ def call(env)
120
+ to_app(env).call(env)
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,108 @@
1
+ module Vagrant
2
+ class Action
3
+ # Registers the builtin actions. These are locked away in a
4
+ # method so that their definition can be deferred until after
5
+ # all the necessary Vagrant libraries are loaded. Hopefully
6
+ # in the future this will no longer be necessary with autoloading.
7
+ def self.builtin!
8
+ # provision - Provisions a running VM
9
+ register(:provision, Builder.new do
10
+ use VM::Provision
11
+ end)
12
+
13
+ # start - Starts a VM, assuming it already exists on the
14
+ # environment.
15
+ register(:start, Builder.new do
16
+ use VM::CleanMachineFolder
17
+ use VM::ClearForwardedPorts
18
+ use VM::ForwardPorts
19
+ use VM::Provision
20
+ use VM::NFS
21
+ use VM::ClearSharedFolders
22
+ use VM::ShareFolders
23
+ use VM::HostName
24
+ use VM::Network
25
+ use VM::Customize
26
+ use VM::Modify
27
+ use VM::Boot
28
+ end)
29
+
30
+ # halt - Halts the VM, attempting gracefully but then forcing
31
+ # a restart if fails.
32
+ register(:halt, Builder.new do
33
+ use VM::DiscardState
34
+ use VM::Halt
35
+ end)
36
+
37
+ # suspend - Suspends the VM
38
+ register(:suspend, Builder.new do
39
+ use VM::Suspend
40
+ end)
41
+
42
+ # resume - Resume a VM
43
+ register(:resume, Builder.new do
44
+ use VM::Resume
45
+ end)
46
+
47
+ # reload - Halts then restarts the VM
48
+ register(:reload, Builder.new do
49
+ use Action[:halt]
50
+ use Action[:start]
51
+ end)
52
+
53
+ # up - Imports, prepares, then starts a fresh VM.
54
+ register(:up, Builder.new do
55
+ use VM::CheckBox
56
+ use VM::Import
57
+ use VM::MatchMACAddress
58
+ use VM::CheckGuestAdditions
59
+ use Action[:start]
60
+ end)
61
+
62
+ # destroy - Halts, cleans up, and destroys an existing VM
63
+ register(:destroy, Builder.new do
64
+ use Action[:halt], :force => true
65
+ use VM::ProvisionerCleanup
66
+ use VM::ClearNFSExports
67
+ use VM::Destroy
68
+ use VM::CleanMachineFolder
69
+ use VM::DestroyUnusedNetworkInterfaces
70
+ end)
71
+
72
+ # package - Export and package the VM
73
+ register(:package, Builder.new do
74
+ use Action[:halt]
75
+ use VM::ClearForwardedPorts
76
+ use VM::ClearSharedFolders
77
+ use VM::Modify
78
+ use VM::Export
79
+ use VM::PackageVagrantfile
80
+ use VM::Package
81
+ end)
82
+
83
+ # box_add - Download and add a box.
84
+ register(:box_add, Builder.new do
85
+ use Box::Download
86
+ use Box::Unpackage
87
+ use Box::Verify
88
+ end)
89
+
90
+ # box_remove - Removes/deletes a box.
91
+ register(:box_remove, Builder.new do
92
+ use Box::Destroy
93
+ end)
94
+
95
+ # box_repackage - Repackages a box.
96
+ register(:box_repackage, Builder.new do
97
+ use Box::Package
98
+ end)
99
+
100
+ # Other callbacks. There will be more of these in the future. For
101
+ # now, these are limited to what are needed internally.
102
+ register(:before_action_run, Builder.new do
103
+ use General::Validate
104
+ use VM::CheckAccessible
105
+ end)
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,7 @@
1
+ module Vagrant
2
+ class Action
3
+ module Env
4
+ autoload :Set, 'vagrant/action/env/set'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Vagrant
2
+ class Action
3
+ module Env
4
+ # A middleware which just sets up the environment with some
5
+ # options which are passed to it.
6
+ class Set
7
+ def initialize(app,env,options=nil)
8
+ @app = app
9
+ env.merge!(options || {})
10
+ end
11
+
12
+ def call(env)
13
+ @app.call(env)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end