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,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,38 @@
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 :forwarded_port_destination
10
+ attr_accessor :max_tries
11
+ attr_accessor :timeout
12
+ attr_writer :private_key_path
13
+ attr_accessor :forward_agent
14
+ attr_accessor :forward_x11
15
+ attr_accessor :shell
16
+ attr_accessor :port
17
+
18
+ def initialize
19
+ @shell = "bash"
20
+ @port = nil
21
+ @forward_agent = false
22
+ @forward_x11 = false
23
+ end
24
+
25
+ def private_key_path
26
+ File.expand_path(@private_key_path, env.root_path)
27
+ end
28
+
29
+ def validate(errors)
30
+ [:username, :host, :forwarded_port_key, :max_tries, :timeout, :private_key_path].each do |field|
31
+ errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
32
+ end
33
+
34
+ errors.add(I18n.t("vagrant.config.ssh.private_key_missing", :path => private_key_path)) if !File.file?(private_key_path)
35
+ end
36
+ end
37
+ end
38
+ 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,17 @@
1
+ module Vagrant
2
+ class Config
3
+ class VagrantConfig < Base
4
+ configures :vagrant
5
+
6
+ attr_accessor :dotfile_name
7
+ attr_accessor :host
8
+ attr_accessor :ssh_session_cache
9
+
10
+ def validate(errors)
11
+ [:dotfile_name, :host].each do |field|
12
+ errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,148 @@
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 :system
23
+
24
+ def initialize
25
+ @forwarded_ports = {}
26
+ @shared_folders = {}
27
+ @network_options = []
28
+ @provisioners = []
29
+ end
30
+
31
+ def forward_port(name, guestport, hostport, options=nil)
32
+ options = {
33
+ :guestport => guestport,
34
+ :hostport => hostport,
35
+ :protocol => :tcp,
36
+ :adapter => 0,
37
+ :auto => false
38
+ }.merge(options || {})
39
+
40
+ forwarded_ports[name] = options
41
+ end
42
+
43
+ def share_folder(name, guestpath, hostpath, opts=nil)
44
+ @shared_folders[name] = {
45
+ :guestpath => guestpath,
46
+ :hostpath => hostpath,
47
+ :owner => nil,
48
+ :group => nil,
49
+ :nfs => false
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
+ def customize(&block)
70
+ push_proc(&block)
71
+ end
72
+
73
+ def has_multi_vms?
74
+ !defined_vms.empty?
75
+ end
76
+
77
+ def defined_vms
78
+ @defined_vms ||= {}
79
+ end
80
+
81
+ # This returns the keys of the sub-vms in the order they were
82
+ # defined.
83
+ def defined_vm_keys
84
+ @defined_vm_keys ||= []
85
+ end
86
+
87
+ def define(name, options=nil, &block)
88
+ name = name.to_sym
89
+ options ||= {}
90
+
91
+ # Add the name to the array of VM keys. This array is used to
92
+ # preserve the order in which VMs are defined.
93
+ defined_vm_keys << name
94
+
95
+ # Add the SubVM to the hash of defined VMs
96
+ defined_vms[name] ||= SubVM.new
97
+ defined_vms[name].options.merge!(options)
98
+ defined_vms[name].push_proc(&block)
99
+ end
100
+
101
+ def validate(errors)
102
+ errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
103
+ errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
104
+ errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
105
+ errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
106
+
107
+ shared_folders.each do |name, options|
108
+ if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
109
+ errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
110
+ :name => name,
111
+ :path => options[:hostpath]))
112
+ end
113
+
114
+ if options[:nfs] && (options[:owner] || options[:group])
115
+ # Owner/group don't work with NFS
116
+ errors.add(I18n.t("vagrant.config.vm.shared_folder_nfs_owner_group",
117
+ :name => name))
118
+ end
119
+ end
120
+
121
+ # Validate some basic networking
122
+ network_options.each do |options|
123
+ next if !options
124
+
125
+ ip = options[:ip].split(".")
126
+
127
+ if ip.length != 4
128
+ errors.add(I18n.t("vagrant.config.vm.network_ip_invalid",
129
+ :ip => options[:ip]))
130
+ elsif ip.last == "1"
131
+ errors.add(I18n.t("vagrant.config.vm.network_ip_ends_one",
132
+ :ip => options[:ip]))
133
+ end
134
+ end
135
+
136
+ # Each provisioner can validate itself
137
+ provisioners.each do |prov|
138
+ # TODO: Remove at some point
139
+ if prov.shortcut == :chef_server
140
+ errors.add(I18n.t("vagrant.config.vm.provisioner_chef_server_changed"))
141
+ else
142
+ prov.validate(errors)
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ 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
@@ -0,0 +1,23 @@
1
+ module Vagrant
2
+ module Downloaders
3
+ # Represents a base class for a downloader. A downloader handles
4
+ # downloading a box file to a temporary file.
5
+ class Base
6
+ include Vagrant::Util
7
+
8
+ # The environment which this downloader is operating.
9
+ attr_reader :env
10
+
11
+ def initialize(env)
12
+ @env = env
13
+ end
14
+
15
+ # Called prior to execution so any error checks can be done
16
+ def prepare(source_url); end
17
+
18
+ # Downloads the source file to the destination file. It is up to
19
+ # implementors of this class to handle the logic.
20
+ def download!(source_url, destination_file); end
21
+ end
22
+ end
23
+ end