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,26 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class ProvisionerCleanup
5
+ def initialize(app, env)
6
+ @app = app
7
+ @env = env
8
+ end
9
+
10
+ def call(env)
11
+ enabled_provisioners.each do |instance|
12
+ instance.cleanup
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+
18
+ def enabled_provisioners
19
+ @env["config"].vm.provisioners.map do |provisioner|
20
+ provisioner.provisioner.new(@env, provisioner.config)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ 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,78 @@
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
+ proc = lambda do |vm|
37
+ @env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
38
+
39
+ shared_folders.each do |name, data|
40
+ folder = VirtualBox::SharedFolder.new
41
+ folder.name = name
42
+ folder.host_path = File.expand_path(data[:hostpath], @env.env.root_path)
43
+ vm.shared_folders << folder
44
+ end
45
+ end
46
+
47
+ @env["vm.modify"].call(proc)
48
+ end
49
+
50
+ def mount_shared_folders
51
+ @env.ui.info I18n.t("vagrant.actions.vm.share_folders.mounting")
52
+
53
+ @env["vm"].ssh.execute do |ssh|
54
+ shared_folders.each do |name, data|
55
+ if data[:guestpath]
56
+ # Guest path specified, so mount the folder to specified point
57
+ @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
58
+ :name => name,
59
+ :guest_path => data[:guestpath]))
60
+
61
+ # Calculate the owner and group
62
+ owner = data[:owner] || @env["config"].ssh.username
63
+ group = data[:group] || @env["config"].ssh.username
64
+
65
+ # Mount the actual folder
66
+ @env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath], owner, group)
67
+ else
68
+ # If no guest path is specified, then automounting is disabled
69
+ @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
70
+ :name => name))
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ 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,85 @@
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
+ action = @actions.shift
29
+ env["logger"].info("warden") { "Calling action: #{action}" }
30
+ @stack.unshift(action).first.call(env)
31
+ raise Errors::VagrantInterrupt if env.interrupted?
32
+ rescue SystemExit
33
+ # This means that an "exit" or "abort" was called. In these cases,
34
+ # we just exit immediately.
35
+ raise
36
+ rescue Exception => e
37
+ env["logger"].info("warden") { "Error occurred: #{e}" }
38
+ env["vagrant.error"] = e
39
+
40
+ # Something went horribly wrong. Start the rescue chain then
41
+ # reraise the exception to properly kick us out of limbo here.
42
+ begin_rescue(env)
43
+ raise
44
+ end
45
+ end
46
+
47
+ # Begins the recovery sequence for all middlewares which have run.
48
+ # It does this by calling `recover` (if it exists) on each middleware
49
+ # which has already run, in reverse order.
50
+ def begin_rescue(env)
51
+ @stack.each do |act|
52
+ if act.respond_to?(:recover)
53
+ env["logger"].info("warden") { "Calling recover: #{act}" }
54
+ act.recover(env)
55
+ end
56
+ end
57
+
58
+ # Clear stack so that warden down the middleware chain doesn't
59
+ # rescue again.
60
+ @stack.clear
61
+ end
62
+
63
+ # A somewhat confusing function which simply initializes each
64
+ # middleware properly to call the next middleware in the sequence.
65
+ def finalize_action(action, env)
66
+ klass, args, block = action
67
+
68
+ if klass.is_a?(Class)
69
+ # A action klass which is to be instantiated with the
70
+ # app, env, and any arguments given
71
+ klass.new(self, env, *args, &block)
72
+ elsif klass.respond_to?(:call)
73
+ # Make it a lambda which calls the item then forwards
74
+ # up the chain
75
+ lambda do |e|
76
+ klass.call(e)
77
+ self.call(e)
78
+ end
79
+ else
80
+ raise "Invalid action: #{action.inspect}"
81
+ end
82
+ end
83
+ end
84
+ end
85
+ 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
+
@@ -0,0 +1,55 @@
1
+ require 'thor'
2
+
3
+ module Vagrant
4
+ # Entrypoint for the Vagrant CLI. This class should never be
5
+ # initialized directly (like a typical Thor class). Instead,
6
+ # use {Environment#cli} to invoke the CLI.
7
+ #
8
+ # # Defining Custom CLI Commands
9
+ #
10
+ # If you're looking to define custom CLI commands, then look at
11
+ # one of the two following classes:
12
+ #
13
+ # * {Command::Base} - Implementing a single command such as `vagrant up`, e.g.
14
+ # one without subcommands. Also take a look at {Command::NamedBase}.
15
+ # * {Command::GroupBase} - Implementing a command with subcommands, such as
16
+ # `vagrant box`, which has the `list`, `add`, etc. subcommands.
17
+ #
18
+ # The above linked classes contain the main documentation for each
19
+ # type of command.
20
+ class CLI < Thor
21
+ # Registers the given class with the CLI so it can be accessed.
22
+ # The class must be a subclass of either {Command::Base} or {Command::GroupBase}.
23
+ # Don't call this method directly, instead call the {Command::Base.register}
24
+ # or {Command::GroupBase.register} methods.
25
+ #
26
+ # @param [Class] klass Command class
27
+ # @param [String] name Command name, accessed at `vagrant NAME`
28
+ # @param [String] usage Command usage, such as "vagrant NAME [--option]"
29
+ # @param [String] description Description of the command shown during the
30
+ # command listing.
31
+ # @param [Hash] opts Other options (not gone into detail here, look at
32
+ # the source instead).
33
+ def self.register(klass, name, usage, description, opts=nil)
34
+ opts ||= {}
35
+
36
+ if klass <= Command::GroupBase
37
+ # A subclass of GroupBase is a subcommand, since it contains
38
+ # many smaller commands within it.
39
+ desc usage, description, opts
40
+ subcommand name, klass
41
+ elsif klass <= Command::Base
42
+ # A subclass of Base is a single command, since it
43
+ # is invoked as a whole (as Thor::Group)
44
+ desc usage, description, opts
45
+ define_method(name) { |*args| invoke klass, args }
46
+ end
47
+
48
+ if opts[:alias]
49
+ # Alises are defined for this command, so properly alias the
50
+ # newly defined method/subcommand:
51
+ map opts[:alias] => name
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,25 @@
1
+ module Vagrant
2
+ module Command
3
+ autoload :Base, 'vagrant/command/base'
4
+ autoload :GroupBase, 'vagrant/command/group_base'
5
+ autoload :Helpers, 'vagrant/command/helpers'
6
+ autoload :NamedBase, 'vagrant/command/named_base'
7
+ end
8
+ end
9
+
10
+ # The built-in commands must always be loaded
11
+ require 'vagrant/command/box'
12
+ require 'vagrant/command/destroy'
13
+ require 'vagrant/command/halt'
14
+ require 'vagrant/command/init'
15
+ require 'vagrant/command/package'
16
+ require 'vagrant/command/provision'
17
+ require 'vagrant/command/reload'
18
+ require 'vagrant/command/resume'
19
+ require 'vagrant/command/ssh'
20
+ require 'vagrant/command/ssh_config'
21
+ require 'vagrant/command/status'
22
+ require 'vagrant/command/suspend'
23
+ require 'vagrant/command/up'
24
+ require 'vagrant/command/upgrade_to_060'
25
+ require 'vagrant/command/version'