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,19 @@
1
+ module Vagrant
2
+ class Config
3
+ # A class which is passed into the various {Base#validate} methods and
4
+ # can be used as a helper to add error messages about a single config
5
+ # class.
6
+ class ErrorRecorder
7
+ attr_reader :errors
8
+
9
+ def initialize
10
+ @errors = []
11
+ end
12
+
13
+ # Adds an error to the list of errors.
14
+ def add(message)
15
+ @errors << message
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module Vagrant
2
+ class Config
3
+ class NFSConfig < Base
4
+ configures :nfs
5
+
6
+ attr_accessor :map_uid
7
+ attr_accessor :map_gid
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Vagrant
2
+ class Config
3
+ class PackageConfig < Base
4
+ configures :package
5
+
6
+ attr_accessor :name
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module Vagrant
2
+ class Config
3
+ class SSHConfig < Base
4
+ configures :ssh
5
+
6
+ attr_accessor :username
7
+ attr_accessor :host
8
+ attr_accessor :forwarded_port_key
9
+ attr_accessor :max_tries
10
+ attr_accessor :timeout
11
+ attr_writer :private_key_path
12
+ attr_accessor :forward_agent
13
+ attr_accessor :forward_x11
14
+ attr_accessor :sudo_shell
15
+
16
+ def initialize
17
+ @sudo_shell = "bash"
18
+ end
19
+
20
+ def private_key_path
21
+ File.expand_path(@private_key_path, env.root_path)
22
+ end
23
+
24
+ def validate(errors)
25
+ [:username, :host, :forwarded_port_key, :max_tries, :timeout, :private_key_path].each do |field|
26
+ errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
27
+ end
28
+
29
+ errors.add(I18n.t("vagrant.config.ssh.private_key_missing", :path => private_key_path)) if !File.file?(private_key_path)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ module Vagrant
2
+ class Config
3
+ # This class is the "top" configure class, which handles registering
4
+ # other configuration classes as well as validation of all configured
5
+ # classes. This is the object which is returned by {Environment#config}
6
+ # and has accessors to all other configuration classes.
7
+ #
8
+ # If you're looking to create your own configuration class, see {Base}.
9
+ class Top < Base
10
+ @@configures = {} if !defined?(@@configures)
11
+
12
+ # The environment that this configuration is for.
13
+ attr_reader :env
14
+
15
+ class << self
16
+ # The list of registered configuration classes as well as the key
17
+ # they're registered under.
18
+ def configures_list
19
+ @@configures ||= {}
20
+ end
21
+
22
+ # Registers a configuration class with the given key. This method shouldn't
23
+ # be called. Instead, inherit from {Base} and call {Base.configures}.
24
+ def configures(key, klass)
25
+ configures_list[key] = klass
26
+ attr_reader key.to_sym
27
+ end
28
+ end
29
+
30
+ def initialize(env=nil)
31
+ self.class.configures_list.each do |key, klass|
32
+ config = klass.new
33
+ config.top = self
34
+ instance_variable_set("@#{key}".to_sym, config)
35
+ end
36
+
37
+ @env = env
38
+ end
39
+
40
+ # Validates the configuration classes of this instance and raises an
41
+ # exception if they are invalid. If you are implementing a custom configuration
42
+ # class, the method you want to implement is {Base#validate}. This is
43
+ # the method that checks all the validation, not one which defines
44
+ # validation rules.
45
+ def validate!
46
+ # Validate each of the configured classes and store the results into
47
+ # a hash.
48
+ errors = self.class.configures_list.inject({}) do |container, data|
49
+ key, _ = data
50
+ recorder = ErrorRecorder.new
51
+ send(key.to_sym).validate(recorder)
52
+ container[key.to_sym] = recorder if !recorder.errors.empty?
53
+ container
54
+ end
55
+
56
+ return if errors.empty?
57
+ raise Errors::ConfigValidationFailed, :messages => Util::TemplateRenderer.render("config/validation_failed", :errors => errors)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,16 @@
1
+ module Vagrant
2
+ class Config
3
+ class VagrantConfig < Base
4
+ configures :vagrant
5
+
6
+ attr_accessor :dotfile_name
7
+ attr_accessor :host
8
+
9
+ def validate(errors)
10
+ [:dotfile_name, :host].each do |field|
11
+ errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,137 @@
1
+ require 'vagrant/config/vm/sub_vm'
2
+ require 'vagrant/config/vm/provisioner'
3
+
4
+ module Vagrant
5
+ class Config
6
+ class VMConfig < Base
7
+ configures :vm
8
+
9
+ include Util::StackedProcRunner
10
+
11
+ attr_accessor :auto_port_range
12
+ attr_accessor :box
13
+ attr_accessor :box_url
14
+ attr_accessor :box_ovf
15
+ attr_accessor :base_mac
16
+ attr_accessor :boot_mode
17
+ attr_accessor :host_name
18
+ attr_reader :forwarded_ports
19
+ attr_reader :shared_folders
20
+ attr_reader :network_options
21
+ attr_reader :provisioners
22
+ attr_accessor :disk_image_format
23
+ attr_writer :shared_folder_uid
24
+ attr_writer :shared_folder_gid
25
+ attr_accessor :system
26
+
27
+ def initialize
28
+ @forwarded_ports = {}
29
+ @shared_folders = {}
30
+ @network_options = []
31
+ @provisioners = []
32
+ end
33
+
34
+ def forward_port(name, guestport, hostport, options=nil)
35
+ options = {
36
+ :guestport => guestport,
37
+ :hostport => hostport,
38
+ :protocol => :tcp,
39
+ :adapter => 0,
40
+ :auto => false
41
+ }.merge(options || {})
42
+
43
+ forwarded_ports[name] = options
44
+ end
45
+
46
+ def share_folder(name, guestpath, hostpath, opts=nil)
47
+ @shared_folders[name] = {
48
+ :guestpath => guestpath,
49
+ :hostpath => hostpath
50
+ }.merge(opts || {})
51
+ end
52
+
53
+ def network(ip, options=nil)
54
+ options = {
55
+ :ip => ip,
56
+ :netmask => "255.255.255.0",
57
+ :adapter => 1,
58
+ :mac => nil,
59
+ :name => nil
60
+ }.merge(options || {})
61
+
62
+ @network_options[options[:adapter]] = options
63
+ end
64
+
65
+ def provision(name, options=nil, &block)
66
+ @provisioners << Provisioner.new(top, name, options, &block)
67
+ end
68
+
69
+ # This shows an error message to smooth the transition for the
70
+ # backwards incompatible provisioner syntax change introduced
71
+ # in Vagrant 0.7.0.
72
+ def provisioner=(_value)
73
+ raise Errors::VagrantError, :_key => :provisioner_equals_not_supported
74
+ end
75
+
76
+ def shared_folder_uid
77
+ @shared_folder_uid || env.config.ssh.username
78
+ end
79
+
80
+ def shared_folder_gid
81
+ @shared_folder_gid || env.config.ssh.username
82
+ end
83
+
84
+ def customize(&block)
85
+ push_proc(&block)
86
+ end
87
+
88
+ def has_multi_vms?
89
+ !defined_vms.empty?
90
+ end
91
+
92
+ def defined_vms
93
+ @defined_vms ||= {}
94
+ end
95
+
96
+ # This returns the keys of the sub-vms in the order they were
97
+ # defined.
98
+ def defined_vm_keys
99
+ @defined_vm_keys ||= []
100
+ end
101
+
102
+ def define(name, options=nil, &block)
103
+ name = name.to_sym
104
+ options ||= {}
105
+
106
+ # Add the name to the array of VM keys. This array is used to
107
+ # preserve the order in which VMs are defined.
108
+ defined_vm_keys << name
109
+
110
+ # Add the SubVM to the hash of defined VMs
111
+ defined_vms[name] ||= SubVM.new
112
+ defined_vms[name].options.merge!(options)
113
+ defined_vms[name].push_proc(&block)
114
+ end
115
+
116
+ def validate(errors)
117
+ errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
118
+ errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
119
+ errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
120
+ errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
121
+
122
+ shared_folders.each do |name, options|
123
+ if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
124
+ errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
125
+ :name => name,
126
+ :path => options[:hostpath]))
127
+ end
128
+ end
129
+
130
+ # Each provisioner can validate itself
131
+ provisioners.each do |prov|
132
+ prov.validate(errors)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,56 @@
1
+ module Vagrant
2
+ class Config
3
+ class VMConfig < Base
4
+ # Represents a single configured provisioner for a VM.
5
+ class Provisioner
6
+ attr_reader :top
7
+ attr_reader :shortcut
8
+ attr_reader :provisioner
9
+ attr_reader :config
10
+
11
+ def initialize(top, shortcut, options=nil, &block)
12
+ @top = top
13
+ @shortcut = shortcut
14
+ @provisioner = shortcut
15
+ @provisioner = Provisioners::Base.registered[shortcut] if shortcut.is_a?(Symbol)
16
+ @config = nil
17
+
18
+ configure(options, &block)
19
+ end
20
+
21
+ # Configures the provisioner if it can (if it is valid).
22
+ def configure(options=nil, &block)
23
+ # We don't want ancestors to be searched. This is the default in 1.8,
24
+ # but not in 1.9, hence this hackery.
25
+ const_args = ["Config"]
26
+ const_args << false if RUBY_VERSION >= "1.9"
27
+
28
+ # We assume that every provisioner has a `Config` class beneath
29
+ # it for configuring.
30
+ return if !@provisioner || !@provisioner.const_defined?(*const_args)
31
+
32
+ # Instantiate the config class and configure it
33
+ @config = @provisioner.const_get(*const_args).new
34
+ @config.top = top
35
+ @config.set_options(options) if options
36
+ block.call(@config) if block
37
+ end
38
+
39
+ def validate(errors)
40
+ if !provisioner
41
+ # If we don't have a provisioner then the whole thing is invalid.
42
+ errors.add(I18n.t("vagrant.config.vm.provisioner_not_found", :shortcut => shortcut))
43
+ return
44
+ end
45
+
46
+ if !(provisioner <= Provisioners::Base)
47
+ errors.add(I18n.t("vagrant.config.vm.provisioner_invalid_class", :shortcut => shortcut))
48
+ end
49
+
50
+ # Pass on validation to the provisioner config
51
+ config.validate(errors) if config
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ module Vagrant
2
+ class Config
3
+ class VMConfig < Base
4
+ # Represents a single sub-VM in a multi-VM environment.
5
+ class SubVM
6
+ include Util::StackedProcRunner
7
+
8
+ attr_reader :options
9
+
10
+ def initialize
11
+ @options = {}
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,70 @@
1
+ module Vagrant
2
+ # The Vagrant data store is a key-value store which is persisted
3
+ # as JSON in a local file which is specified in the initializer.
4
+ # The data store itself is accessed via typical hash accessors: `[]`
5
+ # and `[]=`. If a key is set to `nil`, then it is removed from the
6
+ # datastore. The data store is only updated on disk when {#commit}
7
+ # is called on the data store itself.
8
+ #
9
+ # The data store is a hash with indifferent access, meaning that
10
+ # while all keys are persisted as strings in the JSON, you can access
11
+ # them back as either symbols or strings. Note that this is only true
12
+ # for the top-level data store. As soon as you set a hash inside the
13
+ # data store, unless you explicitly use a {Util::HashWithIndifferentAccess},
14
+ # it will be a regular hash.
15
+ class DataStore < Util::HashWithIndifferentAccess
16
+ attr_reader :file_path
17
+
18
+ def initialize(file_path)
19
+ @file_path = file_path
20
+ return if !file_path
21
+
22
+ raise Errors::DotfileIsDirectory if File.directory?(file_path)
23
+
24
+ if File.exist?(file_path)
25
+ File.open(file_path, "r") do |f|
26
+ merge!(JSON.parse(f.read))
27
+ end
28
+ end
29
+ end
30
+
31
+ # Commits any changes to the data to disk. Even if the data
32
+ # hasn't changed, it will be reserialized and written to disk.
33
+ def commit
34
+ return if !file_path
35
+
36
+ clean_nil_and_empties
37
+
38
+ if empty?
39
+ # Delete the file since an empty data store is not useful
40
+ File.delete(file_path) if File.file?(file_path)
41
+ else
42
+ File.open(file_path, "w") { |f| f.write(to_json) }
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ # Removes the "nil" and "empty?" values from the hash (children
49
+ # included) so that the final output JSON is cleaner.
50
+ def clean_nil_and_empties(hash=self)
51
+ # Clean depth first
52
+ hash.each do |k, v|
53
+ clean_nil_and_empties(v) if v.is_a?(Hash)
54
+ end
55
+
56
+ # Clean ourselves, knowing that any children have already been
57
+ # cleaned up
58
+ bad_keys = hash.inject([]) do |acc, data|
59
+ k,v = data
60
+ acc.push(k) if v.nil?
61
+ acc.push(k) if v.respond_to?(:empty?) && v.empty?
62
+ acc
63
+ end
64
+
65
+ bad_keys.each do |key|
66
+ hash.delete(key)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,7 @@
1
+ module Vagrant
2
+ module Downloaders
3
+ autoload :Base, 'vagrant/downloaders/base'
4
+ autoload :File, 'vagrant/downloaders/file'
5
+ autoload :HTTP, 'vagrant/downloaders/http'
6
+ end
7
+ end