vagrantup 0.5.4 → 0.6.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 (235) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.yardopts +1 -0
  4. data/CHANGELOG.md +56 -0
  5. data/Gemfile +14 -3
  6. data/Gemfile.lock +38 -11
  7. data/README.md +1 -1
  8. data/bin/vagrant +20 -5
  9. data/config/default.rb +6 -8
  10. data/lib/vagrant.rb +40 -13
  11. data/lib/vagrant/action.rb +56 -16
  12. data/lib/vagrant/action/box/destroy.rb +3 -1
  13. data/lib/vagrant/action/box/download.rb +8 -13
  14. data/lib/vagrant/action/box/unpackage.rb +8 -11
  15. data/lib/vagrant/action/box/verify.rb +3 -3
  16. data/lib/vagrant/action/builder.rb +3 -30
  17. data/lib/vagrant/action/builtin.rb +6 -1
  18. data/lib/vagrant/action/environment.rb +14 -62
  19. data/lib/vagrant/action/general/package.rb +29 -22
  20. data/lib/vagrant/action/vm/boot.rb +5 -12
  21. data/lib/vagrant/action/vm/check_box.rb +4 -4
  22. data/lib/vagrant/action/vm/check_guest_additions.rb +4 -6
  23. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +2 -2
  24. data/lib/vagrant/action/vm/clear_nfs_exports.rb +1 -1
  25. data/lib/vagrant/action/vm/clear_shared_folders.rb +1 -1
  26. data/lib/vagrant/action/vm/customize.rb +1 -1
  27. data/lib/vagrant/action/vm/destroy.rb +1 -2
  28. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +1 -1
  29. data/lib/vagrant/action/vm/disable_networks.rb +11 -9
  30. data/lib/vagrant/action/vm/discard_state.rb +2 -2
  31. data/lib/vagrant/action/vm/export.rb +10 -11
  32. data/lib/vagrant/action/vm/forward_ports.rb +21 -9
  33. data/lib/vagrant/action/vm/halt.rb +3 -8
  34. data/lib/vagrant/action/vm/import.rb +16 -14
  35. data/lib/vagrant/action/vm/match_mac_address.rb +1 -1
  36. data/lib/vagrant/action/vm/network.rb +9 -16
  37. data/lib/vagrant/action/vm/nfs.rb +14 -18
  38. data/lib/vagrant/action/vm/provision.rb +5 -5
  39. data/lib/vagrant/action/vm/resume.rb +1 -1
  40. data/lib/vagrant/action/vm/share_folders.rb +6 -44
  41. data/lib/vagrant/action/vm/suspend.rb +1 -1
  42. data/lib/vagrant/action/warden.rb +74 -0
  43. data/lib/vagrant/box.rb +18 -82
  44. data/lib/vagrant/box_collection.rb +47 -0
  45. data/lib/vagrant/cli.rb +55 -0
  46. data/lib/vagrant/command/base.rb +106 -0
  47. data/lib/vagrant/command/box.rb +33 -0
  48. data/lib/vagrant/command/destroy.rb +17 -0
  49. data/lib/vagrant/command/group_base.rb +99 -0
  50. data/lib/vagrant/command/halt.rb +18 -0
  51. data/lib/vagrant/command/helpers.rb +33 -0
  52. data/lib/vagrant/command/init.rb +14 -0
  53. data/lib/vagrant/command/named_base.rb +14 -0
  54. data/lib/vagrant/command/package.rb +41 -0
  55. data/lib/vagrant/command/provision.rb +17 -0
  56. data/lib/vagrant/command/reload.rb +17 -0
  57. data/lib/vagrant/command/resume.rb +17 -0
  58. data/lib/vagrant/command/ssh.rb +41 -0
  59. data/lib/vagrant/command/ssh_config.rb +21 -0
  60. data/lib/vagrant/command/status.rb +23 -0
  61. data/lib/vagrant/command/suspend.rb +17 -0
  62. data/lib/vagrant/command/up.rb +20 -0
  63. data/lib/vagrant/command/upgrade_to_060.rb +45 -0
  64. data/lib/vagrant/command/version.rb +13 -0
  65. data/lib/vagrant/config.rb +107 -189
  66. data/lib/vagrant/config/base.rb +67 -0
  67. data/lib/vagrant/config/error_recorder.rb +19 -0
  68. data/lib/vagrant/config/nfs.rb +10 -0
  69. data/lib/vagrant/config/package.rb +9 -0
  70. data/lib/vagrant/config/ssh.rb +28 -0
  71. data/lib/vagrant/config/vagrant.rb +21 -0
  72. data/lib/vagrant/config/vm.rb +111 -0
  73. data/lib/vagrant/data_store.rb +68 -0
  74. data/lib/vagrant/downloaders/file.rb +3 -3
  75. data/lib/vagrant/downloaders/http.rb +5 -5
  76. data/lib/vagrant/environment.rb +246 -243
  77. data/lib/vagrant/errors.rb +306 -0
  78. data/lib/vagrant/hosts/base.rb +1 -1
  79. data/lib/vagrant/hosts/bsd.rb +3 -9
  80. data/lib/vagrant/hosts/linux.rb +3 -9
  81. data/lib/vagrant/plugin.rb +50 -0
  82. data/lib/vagrant/provisioners/base.rb +0 -6
  83. data/lib/vagrant/provisioners/chef.rb +63 -58
  84. data/lib/vagrant/provisioners/chef_server.rb +9 -11
  85. data/lib/vagrant/provisioners/chef_solo.rb +2 -2
  86. data/lib/vagrant/ssh.rb +34 -37
  87. data/lib/vagrant/systems/base.rb +0 -13
  88. data/lib/vagrant/systems/linux.rb +10 -33
  89. data/lib/vagrant/systems/solaris.rb +59 -0
  90. data/lib/vagrant/test_helpers.rb +109 -0
  91. data/lib/vagrant/ui.rb +65 -0
  92. data/lib/vagrant/util.rb +9 -19
  93. data/lib/vagrant/util/glob_loader.rb +19 -17
  94. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  95. data/lib/vagrant/util/plain_logger.rb +2 -0
  96. data/lib/vagrant/util/platform.rb +2 -0
  97. data/lib/vagrant/util/resource_logger.rb +5 -70
  98. data/lib/vagrant/util/retryable.rb +25 -0
  99. data/lib/vagrant/util/template_renderer.rb +1 -1
  100. data/lib/vagrant/version.rb +1 -1
  101. data/lib/vagrant/vm.rb +27 -13
  102. data/templates/commands/init/Vagrantfile.erb +13 -0
  103. data/templates/config/validation_failed.erb +7 -0
  104. data/templates/locales/en.yml +402 -0
  105. data/templates/package_Vagrantfile.erb +1 -1
  106. data/test/locales/en.yml +8 -0
  107. data/test/test_helper.rb +19 -103
  108. data/test/vagrant/action/box/destroy_test.rb +7 -19
  109. data/test/vagrant/action/box/download_test.rb +9 -25
  110. data/test/vagrant/action/box/package_test.rb +2 -2
  111. data/test/vagrant/action/box/unpackage_test.rb +8 -34
  112. data/test/vagrant/action/box/verify_test.rb +10 -19
  113. data/test/vagrant/action/builder_test.rb +0 -15
  114. data/test/vagrant/action/env/set_test.rb +1 -1
  115. data/test/vagrant/action/environment_test.rb +8 -26
  116. data/test/vagrant/action/general/package_test.rb +53 -53
  117. data/test/vagrant/action/vm/boot_test.rb +5 -22
  118. data/test/vagrant/action/vm/check_box_test.rb +35 -25
  119. data/test/vagrant/action/vm/clean_machine_folder_test.rb +1 -1
  120. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +1 -1
  121. data/test/vagrant/action/vm/clear_nfs_exports_test.rb +1 -1
  122. data/test/vagrant/action/vm/clear_shared_folders_test.rb +1 -1
  123. data/test/vagrant/action/vm/customize_test.rb +2 -1
  124. data/test/vagrant/action/vm/destroy_test.rb +1 -2
  125. data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +1 -1
  126. data/test/vagrant/action/vm/disable_networks_test.rb +10 -1
  127. data/test/vagrant/action/vm/discard_state_test.rb +10 -1
  128. data/test/vagrant/action/vm/export_test.rb +9 -37
  129. data/test/vagrant/action/vm/forward_ports_helpers_test.rb +2 -2
  130. data/test/vagrant/action/vm/forward_ports_test.rb +19 -16
  131. data/test/vagrant/action/vm/halt_test.rb +11 -1
  132. data/test/vagrant/action/vm/import_test.rb +37 -21
  133. data/test/vagrant/action/vm/match_mac_address_test.rb +1 -1
  134. data/test/vagrant/action/vm/network_test.rb +8 -7
  135. data/test/vagrant/action/vm/nfs_helpers_test.rb +6 -3
  136. data/test/vagrant/action/vm/nfs_test.rb +20 -45
  137. data/test/vagrant/action/vm/package_test.rb +1 -1
  138. data/test/vagrant/action/vm/package_vagrantfile_test.rb +1 -1
  139. data/test/vagrant/action/vm/provision_test.rb +10 -17
  140. data/test/vagrant/action/vm/resume_test.rb +1 -1
  141. data/test/vagrant/action/vm/share_folders_test.rb +25 -106
  142. data/test/vagrant/action/vm/suspend_test.rb +1 -1
  143. data/test/vagrant/action/warden_test.rb +105 -0
  144. data/test/vagrant/action_test.rb +5 -27
  145. data/test/vagrant/box_collection_test.rb +44 -0
  146. data/test/vagrant/box_test.rb +5 -105
  147. data/test/vagrant/cli_test.rb +35 -0
  148. data/test/vagrant/command/base_test.rb +23 -0
  149. data/test/vagrant/command/group_base_test.rb +15 -0
  150. data/test/vagrant/command/helpers_test.rb +88 -0
  151. data/test/vagrant/config/base_test.rb +52 -0
  152. data/test/vagrant/config/error_recorder_test.rb +18 -0
  153. data/test/vagrant/config/ssh_test.rb +12 -0
  154. data/test/vagrant/config/vagrant_test.rb +11 -0
  155. data/test/vagrant/config/vm_test.rb +70 -0
  156. data/test/vagrant/config_test.rb +113 -206
  157. data/test/vagrant/data_store_test.rb +68 -0
  158. data/test/vagrant/downloaders/base_test.rb +1 -1
  159. data/test/vagrant/downloaders/file_test.rb +4 -3
  160. data/test/vagrant/downloaders/http_test.rb +14 -4
  161. data/test/vagrant/environment_test.rb +290 -590
  162. data/test/vagrant/errors_test.rb +42 -0
  163. data/test/vagrant/hosts/base_test.rb +1 -1
  164. data/test/vagrant/hosts/bsd_test.rb +3 -6
  165. data/test/vagrant/hosts/linux_test.rb +3 -5
  166. data/test/vagrant/plugin_test.rb +9 -0
  167. data/test/vagrant/provisioners/base_test.rb +1 -1
  168. data/test/vagrant/provisioners/chef_server_test.rb +31 -35
  169. data/test/vagrant/provisioners/chef_solo_test.rb +1 -1
  170. data/test/vagrant/provisioners/chef_test.rb +7 -7
  171. data/test/vagrant/ssh_session_test.rb +3 -10
  172. data/test/vagrant/ssh_test.rb +25 -33
  173. data/test/vagrant/systems/linux_test.rb +6 -71
  174. data/test/vagrant/ui_test.rb +29 -0
  175. data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
  176. data/test/vagrant/util/resource_logger_test.rb +14 -81
  177. data/test/vagrant/util/retryable_test.rb +38 -0
  178. data/test/vagrant/util/template_renderer_test.rb +4 -4
  179. data/test/vagrant/vm_test.rb +47 -26
  180. data/vagrant.gemspec +14 -12
  181. metadata +121 -89
  182. data/bin/.gitignore +0 -0
  183. data/lib/vagrant/action/action_exception.rb +0 -16
  184. data/lib/vagrant/action/env/error_halt.rb +0 -16
  185. data/lib/vagrant/action/exception_catcher.rb +0 -14
  186. data/lib/vagrant/action/vm/persist.rb +0 -22
  187. data/lib/vagrant/active_list.rb +0 -83
  188. data/lib/vagrant/command.rb +0 -27
  189. data/lib/vagrant/commands/base.rb +0 -181
  190. data/lib/vagrant/commands/box.rb +0 -16
  191. data/lib/vagrant/commands/box/add.rb +0 -30
  192. data/lib/vagrant/commands/box/list.rb +0 -30
  193. data/lib/vagrant/commands/box/remove.rb +0 -30
  194. data/lib/vagrant/commands/box/repackage.rb +0 -35
  195. data/lib/vagrant/commands/destroy.rb +0 -37
  196. data/lib/vagrant/commands/halt.rb +0 -43
  197. data/lib/vagrant/commands/init.rb +0 -36
  198. data/lib/vagrant/commands/package.rb +0 -81
  199. data/lib/vagrant/commands/provision.rb +0 -31
  200. data/lib/vagrant/commands/reload.rb +0 -36
  201. data/lib/vagrant/commands/resume.rb +0 -35
  202. data/lib/vagrant/commands/ssh.rb +0 -78
  203. data/lib/vagrant/commands/ssh_config.rb +0 -45
  204. data/lib/vagrant/commands/status.rb +0 -125
  205. data/lib/vagrant/commands/suspend.rb +0 -36
  206. data/lib/vagrant/commands/up.rb +0 -44
  207. data/lib/vagrant/exceptions/uncallable_action.rb +0 -17
  208. data/lib/vagrant/util/translator.rb +0 -35
  209. data/templates/strings.yml +0 -341
  210. data/templates/unison/crontab_entry.erb +0 -1
  211. data/templates/unison/script.erb +0 -71
  212. data/test/vagrant/action/env/error_halt_test.rb +0 -21
  213. data/test/vagrant/action/exception_catcher_test.rb +0 -30
  214. data/test/vagrant/action/vm/persist_test.rb +0 -50
  215. data/test/vagrant/active_list_test.rb +0 -173
  216. data/test/vagrant/command_test.rb +0 -53
  217. data/test/vagrant/commands/base_test.rb +0 -139
  218. data/test/vagrant/commands/box/add_test.rb +0 -34
  219. data/test/vagrant/commands/box/list_test.rb +0 -32
  220. data/test/vagrant/commands/box/remove_test.rb +0 -41
  221. data/test/vagrant/commands/box/repackage_test.rb +0 -52
  222. data/test/vagrant/commands/destroy_test.rb +0 -44
  223. data/test/vagrant/commands/halt_test.rb +0 -50
  224. data/test/vagrant/commands/init_test.rb +0 -71
  225. data/test/vagrant/commands/package_test.rb +0 -97
  226. data/test/vagrant/commands/provision_test.rb +0 -60
  227. data/test/vagrant/commands/reload_test.rb +0 -47
  228. data/test/vagrant/commands/resume_test.rb +0 -44
  229. data/test/vagrant/commands/ssh_config_test.rb +0 -77
  230. data/test/vagrant/commands/ssh_test.rb +0 -129
  231. data/test/vagrant/commands/status_test.rb +0 -40
  232. data/test/vagrant/commands/suspend_test.rb +0 -44
  233. data/test/vagrant/commands/up_test.rb +0 -49
  234. data/test/vagrant/util/translator_test.rb +0 -61
  235. data/test/vagrant/util_test.rb +0 -27
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  module Vagrant
2
4
  class Action
3
5
  module Box
@@ -8,7 +10,7 @@ module Vagrant
8
10
  end
9
11
 
10
12
  def call(env)
11
- env.logger.info "Deleting box directory..."
13
+ env.ui.info I18n.t("vagrant.actions.box.destroy.destroying", :name => env["box"].name)
12
14
  FileUtils.rm_rf(env["box"].directory)
13
15
 
14
16
  @app.call(env)
@@ -13,31 +13,27 @@ module Vagrant
13
13
  @env = env
14
14
  @env["download.classes"] ||= []
15
15
  @env["download.classes"] += [Downloaders::HTTP, Downloaders::File]
16
+ @downloader = nil
16
17
  end
17
18
 
18
19
  def call(env)
19
20
  @env = env
20
21
 
21
22
  download if instantiate_downloader
22
- return if env.error?
23
-
24
23
  @app.call(@env)
25
24
 
26
- cleanup
25
+ recover(env) # called in both cases to cleanup workspace
27
26
  end
28
27
 
29
28
  def instantiate_downloader
30
29
  @env["download.classes"].each do |klass|
31
30
  if klass.match?(@env["box"].uri)
32
- @env.logger.info "Downloading with #{klass}..."
31
+ @env.ui.info I18n.t("vagrant.actions.box.download.with", :class => klass.to_s)
33
32
  @downloader = klass.new(@env)
34
33
  end
35
34
  end
36
35
 
37
- if !@downloader
38
- @env.error!(:box_download_unknown_type)
39
- return false
40
- end
36
+ raise Errors::BoxDownloadUnknownType.new if !@downloader
41
37
 
42
38
  @downloader.prepare(@env["box"].uri)
43
39
  true
@@ -50,26 +46,25 @@ module Vagrant
50
46
  end
51
47
  end
52
48
 
53
- def cleanup
49
+ def recover(env)
54
50
  if temp_path && File.exist?(temp_path)
55
- @env.logger.info "Cleaning up downloaded box..."
51
+ env.ui.info I18n.t("vagrant.actions.box.download.cleaning")
56
52
  File.unlink(temp_path)
57
53
  end
58
54
  end
59
55
 
60
56
  def with_tempfile
61
- @env.logger.info "Creating tempfile for storing box file..."
62
57
  File.open(box_temp_path, Platform.tar_file_options) do |tempfile|
63
58
  yield tempfile
64
59
  end
65
60
  end
66
61
 
67
62
  def box_temp_path
68
- File.join(@env.env.tmp_path, BASENAME + Time.now.to_i.to_s)
63
+ @env.env.tmp_path.join(BASENAME + Time.now.to_i.to_s)
69
64
  end
70
65
 
71
66
  def download_to(f)
72
- @env.logger.info "Copying box to temporary location..."
67
+ @env.ui.info I18n.t("vagrant.actions.box.download.copying")
73
68
  @downloader.download!(@env["box"].uri, f)
74
69
  end
75
70
  end
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+ require 'archive/tar/minitar'
3
+
1
4
  module Vagrant
2
5
  class Action
3
6
  module Box
@@ -21,35 +24,29 @@ module Vagrant
21
24
  def call(env)
22
25
  @env = env
23
26
 
24
- return if !setup_box_directory
27
+ setup_box_directory
25
28
  decompress
26
29
 
27
30
  @app.call(@env)
28
-
29
- cleanup if @env.error?
30
31
  end
31
32
 
32
- def cleanup
33
+ def recover(env)
33
34
  if File.directory?(box_directory)
34
35
  FileUtils.rm_rf(box_directory)
35
36
  end
36
37
  end
37
38
 
38
39
  def setup_box_directory
39
- if File.directory?(@env["box"].directory)
40
- @env.error!(:box_already_exists, :box_name => @env["box"].name)
41
- return false
42
- end
40
+ raise Errors::BoxAlreadyExists.new(:name => @env["box"].name) if File.directory?(@env["box"].directory)
43
41
 
44
42
  FileUtils.mkdir_p(@env["box"].directory)
45
43
  @box_directory = @env["box"].directory
46
- true
47
44
  end
48
45
 
49
46
  def decompress
50
47
  Dir.chdir(@env["box"].directory) do
51
- @env.logger.info "Extracting box to #{@env["box"].directory}..."
52
- Archive::Tar::Minitar.unpack(@env["download.temp_path"], @env["box"].directory)
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)
53
50
  end
54
51
  end
55
52
  end
@@ -9,10 +9,10 @@ module Vagrant
9
9
 
10
10
  def call(env)
11
11
  begin
12
- env.logger.info "Verifying box..."
13
- VirtualBox::Appliance.new(env["box"].ovf_file)
12
+ env.ui.info I18n.t("vagrant.actions.box.verify.verifying")
13
+ VirtualBox::Appliance.new(env["box"].ovf_file.to_s)
14
14
  rescue Exception
15
- return env.error!(:box_verification_failed)
15
+ raise Errors::BoxVerificationFailed.new
16
16
  end
17
17
 
18
18
  @app.call(env)
@@ -110,36 +110,9 @@ module Vagrant
110
110
  # @param [Vagrant::Action::Environment] env The action environment
111
111
  # @return [Object] A callable object
112
112
  def to_app(env)
113
- # Prepend the error halt task so errneous environments are halted
114
- # before the chain even begins.
115
- items = stack.dup.unshift([Env::ErrorHalt, [], nil])
116
-
117
- # Convert each middleware into a lambda which takes the next
118
- # middleware.
119
- items = items.collect do |item|
120
- klass, args, block = item
121
-
122
- lambda do |app|
123
- if klass.is_a?(Class)
124
- # A middleware klass which is to be instantiated with the
125
- # app, env, and any arguments given
126
- klass.new(app, env, *args, &block)
127
- elsif klass.respond_to?(:call)
128
- # Make it a lambda which calls the item then forwards
129
- # up the chain
130
- lambda do |e|
131
- klass.call(e)
132
- app.call(e)
133
- end
134
- else
135
- raise "Invalid middleware: #{item.inspect}"
136
- end
137
- end
138
- end
139
-
140
- # Append the final step and convert into flattened call chain.
141
- items << lambda { |env| }
142
- items[0...-1].reverse.inject(items.last) { |a,e| e.call(a) }
113
+ # Wrap the middleware stack with the Warden to provide a consistent
114
+ # and predictable behavior upon exceptions.
115
+ Warden.new(stack.dup, env)
143
116
  end
144
117
 
145
118
  # Runs the builder stack with the given environment.
@@ -65,7 +65,6 @@ module Vagrant
65
65
  up = Builder.new do
66
66
  use VM::CheckBox
67
67
  use VM::Import
68
- use VM::Persist
69
68
  use VM::MatchMACAddress
70
69
  use VM::CheckGuestAdditions
71
70
  use Action[:start]
@@ -118,6 +117,12 @@ module Vagrant
118
117
  end
119
118
 
120
119
  register :box_repackage, box_repackage
120
+
121
+ # post_load - Called after environment is loaded
122
+ environment_load = Builder.new do
123
+ end
124
+
125
+ register :environment_load, environment_load
121
126
  end
122
127
  end
123
128
  end
@@ -4,15 +4,11 @@ module Vagrant
4
4
  # to the `call` method of each action. This environment contains
5
5
  # some helper methods for accessing the environment as well
6
6
  # as being a hash, to store any additional options.
7
- class Environment < Hash
7
+ class Environment < Util::HashWithIndifferentAccess
8
8
  # The {Vagrant::Environment} object represented by this
9
9
  # action environment.
10
10
  attr_reader :env
11
11
 
12
- # If nonnil, the error associated with this environment. Set
13
- # using {#error!}
14
- attr_reader :error
15
-
16
12
  def initialize(env)
17
13
  super() do |h,k|
18
14
  # By default, try to find the key as a method on the
@@ -26,72 +22,28 @@ module Vagrant
26
22
  end
27
23
 
28
24
  @env = env
29
- @error = nil
30
- end
31
-
32
- # Returns a logger associated with the environment.
33
- def logger
34
- env.logger
25
+ @interrupted = false
35
26
  end
36
27
 
37
- # Flags the environment as erroneous. Stores the given key
38
- # and options until the end of the action sequence.
39
- #
40
- # @param [Symbol] key Key to translation to display error message.
41
- # @param [Hash] options Variables to pass to the translation
42
- def error!(key, options=nil)
43
- @error = [key, (options || {})]
28
+ # Returns a UI object from the environment
29
+ def ui
30
+ env.ui
44
31
  end
45
32
 
46
- # Returns boolean denoting if environment is in erroneous state.
47
- #
48
- # @return [Boolean]
49
- def error?
50
- !error.nil?
33
+ # Marks an environment as interrupted (by an outside signal or
34
+ # anything). This will trigger any middleware sequences using this
35
+ # environment to halt. This is automatically set by {Action} when
36
+ # a SIGINT is captured.
37
+ def interrupt!
38
+ @interrupted = true
51
39
  end
52
40
 
53
41
  # Returns a boolean denoting if environment has been interrupted
54
42
  # with a SIGINT.
43
+ #
44
+ # @return [Bool]
55
45
  def interrupted?
56
- error? && error.first == :interrupt
57
- end
58
-
59
- #-----------------------------------------------------------------
60
- # Hash with indifferent access
61
- #-----------------------------------------------------------------
62
- def [](key)
63
- super(convert_key(key))
64
- end
65
-
66
- def []=(key, value)
67
- super(convert_key(key), value)
68
- end
69
-
70
- def delete(key)
71
- super(convert_key(key))
72
- end
73
-
74
- def values_at(*indices)
75
- indices.collect { |key| self[convert_key(key)] }
76
- end
77
-
78
- def merge(other)
79
- dup.merge!(other)
80
- end
81
-
82
- def merge!(other)
83
- other.each do |key, value|
84
- self[convert_key(key)] = value
85
- end
86
- self
87
- end
88
-
89
- def has_key?(key)
90
- super(convert_key(key))
91
- end
92
-
93
- def convert_key(key)
94
- key.is_a?(Symbol) ? key.to_s : key
46
+ !!@interrupted
95
47
  end
96
48
  end
97
49
  end
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+ require 'archive/tar/minitar'
3
+
1
4
  module Vagrant
2
5
  class Action
3
6
  module General
@@ -19,55 +22,59 @@ module Vagrant
19
22
  @env = env
20
23
  @env["package.output"] ||= env["config"].package.name
21
24
  @env["package.include"] ||= []
25
+ @env["package.vagrantfile"] ||= nil
22
26
  end
23
27
 
24
28
  def call(env)
25
29
  @env = env
26
30
 
27
- return env.error!(:package_output_exists) if File.exist?(tar_path)
28
- return env.error!(:package_requires_directory) if !@env["package.directory"] || !File.directory?(@env["package.directory"])
29
- return if !verify_included_files
31
+ raise Errors::PackageOutputExists.new if File.exist?(tar_path)
32
+ raise Errors::PackageRequiresDirectory.new if !@env["package.directory"] || !File.directory?(@env["package.directory"])
33
+
34
+ verify_files_to_copy
30
35
  compress
31
36
 
32
37
  @app.call(env)
33
-
34
- cleanup if env.error?
35
38
  end
36
39
 
37
- def cleanup
40
+ def recover(env)
38
41
  # Cleanup any packaged files if the packaging failed at some point.
39
42
  File.delete(tar_path) if File.exist?(tar_path)
40
43
  end
41
44
 
42
- def verify_included_files
43
- @env["package.include"].each do |file|
44
- if !File.exist?(file)
45
- @env.error!(:package_include_file_doesnt_exist, :filename => file)
46
- return false
47
- end
45
+ def files_to_copy
46
+ package_dir = Pathname.new(@env["package.directory"]).join("include")
47
+
48
+ files = @env["package.include"].inject({}) do |acc, file|
49
+ source = Pathname.new(file)
50
+ acc[file] = source.relative? ? package_dir.join(source) : package_dir.join(source.basename)
51
+ acc
48
52
  end
49
53
 
50
- true
54
+ files[@env["package.vagrantfile"]] = package_dir.join("_Vagrantfile") if @env["package.vagrantfile"]
55
+ files
56
+ end
57
+
58
+ def verify_files_to_copy
59
+ files_to_copy.each do |file, _|
60
+ raise Errors::PackageIncludeMissing.new(:file => file) if !File.exist?(file)
61
+ end
51
62
  end
52
63
 
53
64
  # This method copies the include files (passed in via command line)
54
65
  # to the temporary directory so they are included in a sub-folder within
55
66
  # the actual box
56
67
  def copy_include_files
57
- if @env["package.include"].length > 0
58
- include_dir = File.join(@env["package.directory"], "include")
59
- FileUtils.mkdir_p(include_dir)
60
-
61
- @env["package.include"].each do |f|
62
- @env.logger.info "Packaging additional file: #{f}"
63
- FileUtils.cp(f, include_dir)
64
- end
68
+ files_to_copy.each do |from, to|
69
+ @env.ui.info I18n.t("vagrant.actions.general.package.packaging", :file => from)
70
+ FileUtils.mkdir_p(to.parent)
71
+ FileUtils.cp(from, to)
65
72
  end
66
73
  end
67
74
 
68
75
  # Compress the exported file into a package
69
76
  def compress
70
- @env.logger.info "Compressing package to #{tar_path}..."
77
+ @env.ui.info I18n.t("vagrant.actions.general.package.compressing", :tar_path => tar_path)
71
78
  File.open(tar_path, Platform.tar_file_options) do |tar|
72
79
  Archive::Tar::Minitar::Output.open(tar) do |output|
73
80
  begin
@@ -8,32 +8,25 @@ module Vagrant
8
8
  end
9
9
 
10
10
  def call(env)
11
- # Do nothing if the environment is erroneous
12
- return if env.error?
13
-
14
11
  @env = env
15
12
 
16
13
  # Start up the VM and wait for it to boot.
17
14
  boot
18
- return env.error!(:vm_failed_to_boot) if !wait_for_boot
19
- return if env.error?
20
-
15
+ raise Errors::VMFailedToBoot.new if !wait_for_boot
21
16
  @app.call(env)
22
17
  end
23
18
 
24
19
  def boot
25
- @env.logger.info "Booting VM..."
20
+ @env.ui.info I18n.t("vagrant.actions.vm.boot.booting")
26
21
  @env["vm"].vm.start(@env.env.config.vm.boot_mode)
27
22
  end
28
23
 
29
24
  def wait_for_boot
30
- @env.logger.info "Waiting for VM to boot..."
25
+ @env.ui.info I18n.t("vagrant.actions.vm.boot.waiting")
31
26
 
32
27
  @env.env.config.ssh.max_tries.to_i.times do |i|
33
- @env.logger.info "Trying to connect (attempt ##{i+1} of #{@env.env.config[:ssh][:max_tries]})..."
34
-
35
28
  if @env["vm"].ssh.up?
36
- @env.logger.info "VM booted and ready for use!"
29
+ @env.ui.info I18n.t("vagrant.actions.vm.boot.ready")
37
30
  return true
38
31
  end
39
32
 
@@ -44,7 +37,7 @@ module Vagrant
44
37
  sleep 5 if !@env["vagrant.test"]
45
38
  end
46
39
 
47
- @env.logger.info "Failed to connect to VM! Failed to boot?"
40
+ @env.ui.error I18n.t("vagrant.actions.vm.boot.failed")
48
41
  false
49
42
  end
50
43
  end
@@ -8,13 +8,13 @@ module Vagrant
8
8
 
9
9
  def call(env)
10
10
  box_name = env["config"].vm.box
11
- return env.error!(:box_not_specified) if !box_name
11
+ raise Errors::BoxNotSpecified.new if !box_name
12
12
 
13
- if !Vagrant::Box.find(env.env , box_name)
13
+ if !env.env.boxes.find(box_name)
14
14
  box_url = env["config"].vm.box_url
15
- return env.error!(:box_specified_doesnt_exist, :box_name => box_name) if !box_url
15
+ raise Errors::BoxSpecifiedDoesntExist.new(:name => box_name) if !box_url
16
16
 
17
- env.logger.info "Box #{box_name} not found. Fetching box since URL specified..."
17
+ env.ui.info I18n.t("vagrant.actions.vm.check_box.not_found", :name => box_name)
18
18
  Vagrant::Box.add(env.env, box_name, box_url)
19
19
  env.env.load_box!
20
20
  end