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,47 @@
1
+ module Vagrant
2
+ module Hosts
3
+ # Represents a Linux based host, such as Ubuntu.
4
+ class Linux < Base
5
+ include Util
6
+ include Util::Retryable
7
+
8
+ def nfs?
9
+ retryable(:tries => 10, :on => TypeError) do
10
+ # Check procfs to see if NFSd is a supported filesystem
11
+ system("cat /proc/filesystems | grep nfsd > /dev/null 2>&1")
12
+ end
13
+ end
14
+
15
+ def nfs_export(ip, folders)
16
+ output = TemplateRenderer.render('nfs/exports_linux',
17
+ :uuid => env.vm.uuid,
18
+ :ip => ip,
19
+ :folders => folders)
20
+
21
+ env.ui.info I18n.t("vagrant.hosts.linux.nfs_export.prepare")
22
+ sleep 0.5
23
+
24
+ output.split("\n").each do |line|
25
+ # This should only ask for administrative permission once, even
26
+ # though its executed in multiple subshells.
27
+ system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"])
28
+ end
29
+
30
+ # We run restart here instead of "update" just in case nfsd
31
+ # is not starting
32
+ system("sudo /etc/init.d/nfs-kernel-server restart")
33
+ end
34
+
35
+ def nfs_cleanup
36
+ return if !File.exist?("/etc/exports")
37
+ system("cat /etc/exports | grep 'VAGRANT-BEGIN: #{env.vm.uuid}' > /dev/null 2>&1")
38
+
39
+ if $?.to_i == 0
40
+ # Use sed to just strip out the block of code which was inserted
41
+ # by Vagrant
42
+ system("sudo sed -e '/^# VAGRANT-BEGIN: #{env.vm.uuid}/,/^# VAGRANT-END: #{env.vm.uuid}/ d' -ibak /etc/exports")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,57 @@
1
+ require "rubygems"
2
+
3
+ module Vagrant
4
+ # Represents a single plugin and also manages loading plugins from
5
+ # RubyGems. If a plugin has a `vagrant_init.rb` file somewhere on its
6
+ # load path, then this class will find it and load it. For logging purposes
7
+ # (for debugging), the list of loaded plugins is stored in the {plugins}
8
+ # array.
9
+ class Plugin
10
+ # The array of loaded plugins.
11
+ @@plugins = []
12
+
13
+ # The gemspec of this plugin. This is an actual gemspec object.
14
+ attr_reader :gemspec
15
+
16
+ # The path to the `vagrant_init.rb` file which was loaded for this plugin.
17
+ attr_reader :file
18
+
19
+ # Loads all the plugins for Vagrant. Plugins are currently
20
+ # gems which have a "vagrant_init.rb" somewhere on their
21
+ # load path. This file is loaded to kick off the load sequence
22
+ # for that plugin.
23
+ def self.load!
24
+ # Stupid hack since Rails 2.3.x overrides Gem.source_index with their
25
+ # own incomplete replacement which causes issues.
26
+ index = Gem.source_index
27
+ index = [index.installed_source_index, index.vendor_source_index] if defined?(Rails::VendorGemSourceIndex) && index.is_a?(Rails::VendorGemSourceIndex)
28
+
29
+ # Look for a vagrant_init.rb in all the gems, but only the
30
+ # latest version of the gems.
31
+ [index].flatten.each do |source|
32
+ source.latest_specs.each do |spec|
33
+ file = Gem.searcher.matching_files(spec, "vagrant_init.rb").first
34
+ next if !file
35
+
36
+ @@plugins << new(spec, file)
37
+ end
38
+ end
39
+ end
40
+
41
+ # Returns the array of plugins which are currently loaded by
42
+ # Vagrant.
43
+ #
44
+ # @return [Array]
45
+ def self.plugins; @@plugins; end
46
+
47
+ # Initializes a new plugin, given a Gemspec and the path to the
48
+ # gem's `vagrant_init.rb` file. This should never be called manually.
49
+ # Instead {load!} creates all the instances.
50
+ def initialize(spec, file)
51
+ @gemspec = spec
52
+ @file = file
53
+
54
+ load file
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,9 @@
1
+ # These aren't autoloaded because they have to register things such
2
+ # as configuration classes right away with Vagrant.
3
+ require 'vagrant/provisioners/base'
4
+ require 'vagrant/provisioners/chef'
5
+ require 'vagrant/provisioners/chef_server'
6
+ require 'vagrant/provisioners/chef_solo'
7
+ require 'vagrant/provisioners/puppet'
8
+ require 'vagrant/provisioners/puppet_server'
9
+ require 'vagrant/provisioners/shell'
@@ -0,0 +1,63 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ # The base class for a "provisioner." A provisioner is responsible for
4
+ # provisioning a Vagrant system. This has been abstracted out to provide
5
+ # support for multiple solutions such as Chef Solo, Chef Client, and
6
+ # Puppet.
7
+ class Base
8
+ include Vagrant::Util
9
+
10
+ # The environment which provisioner is running in. This is a
11
+ # {Vagrant::Action::Environment}
12
+ attr_reader :action_env
13
+
14
+ # The configuration for this provisioner. This will be an instance of
15
+ # the `Config` class which is part of the provisioner.
16
+ attr_reader :config
17
+
18
+ # Registers a provisioner with a given shortcut. This allows that provisioner
19
+ # to be referenced with the shortcut.
20
+ #
21
+ # @param [Symbol] shortcut
22
+ def self.register(shortcut)
23
+ registered[shortcut] = self
24
+ end
25
+
26
+ # Returns the provisioner associated with the given shortcut.
27
+ def self.registered
28
+ @@registered ||= {}
29
+ end
30
+
31
+ def initialize(env, config)
32
+ @action_env = env
33
+ @config = config
34
+ end
35
+
36
+ # Returns the actual {Vagrant::Environment} which this provisioner
37
+ # represents.
38
+ #
39
+ # @return [Vagrant::Environment]
40
+ def env
41
+ action_env.env
42
+ end
43
+
44
+ # Returns the VM which this provisioner is working on.
45
+ #
46
+ # @return [Vagrant::VM]
47
+ def vm
48
+ env.vm
49
+ end
50
+
51
+ # This is the method called to "prepare" the provisioner. This is called
52
+ # before any actions are run by the action runner (see {Vagrant::Actions::Runner}).
53
+ # This can be used to setup shared folders, forward ports, etc. Whatever is
54
+ # necessary on a "meta" level.
55
+ def prepare; end
56
+
57
+ # This is the method called to provision the system. This method
58
+ # is expected to do whatever necessary to provision the system (create files,
59
+ # SSH, etc.)
60
+ def provision!; end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,130 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ # This class is a base class where the common functionality shared between
4
+ # chef-solo and chef-client provisioning are stored. This is **not an actual
5
+ # provisioner**. Instead, {ChefSolo} or {ChefServer} should be used.
6
+ class Chef < Base
7
+ def prepare
8
+ raise ChefError, :invalid_provisioner
9
+ end
10
+
11
+ def verify_binary(binary)
12
+ vm.ssh.execute do |ssh|
13
+ # Checks for the existence of chef binary and error if it
14
+ # doesn't exist.
15
+ ssh.sudo!("which #{binary}", :error_class => ChefError, :_key => :chef_not_detected, :binary => binary)
16
+ end
17
+ end
18
+
19
+ def chown_provisioning_folder
20
+ vm.ssh.execute do |ssh|
21
+ ssh.sudo!("mkdir -p #{config.provisioning_path}")
22
+ ssh.sudo!("chown #{env.config.ssh.username} #{config.provisioning_path}")
23
+ end
24
+ end
25
+
26
+ def setup_config(template, filename, template_vars)
27
+ config_file = TemplateRenderer.render(template, {
28
+ :log_level => config.log_level.to_sym,
29
+ :http_proxy => config.http_proxy,
30
+ :http_proxy_user => config.http_proxy_user,
31
+ :http_proxy_pass => config.http_proxy_pass,
32
+ :https_proxy => config.https_proxy,
33
+ :https_proxy_user => config.https_proxy_user,
34
+ :https_proxy_pass => config.https_proxy_pass,
35
+ :no_proxy => config.no_proxy
36
+ }.merge(template_vars))
37
+
38
+ vm.ssh.upload!(StringIO.new(config_file), File.join(config.provisioning_path, filename))
39
+ end
40
+
41
+ def setup_json
42
+ env.ui.info I18n.t("vagrant.provisioners.chef.json")
43
+
44
+ # Set up initial configuration
45
+ data = {
46
+ :config => env.config.to_hash,
47
+ :directory => env.config.vm.shared_folders["v-root"][:guestpath],
48
+ }
49
+
50
+ # And wrap it under the "vagrant" namespace
51
+ data = { :vagrant => data }
52
+
53
+ # Merge with the "extra data" which isn't put under the
54
+ # vagrant namespace by default
55
+ data.merge!(config.json)
56
+
57
+ json = data.to_json
58
+
59
+ vm.ssh.upload!(StringIO.new(json), File.join(config.provisioning_path, "dna.json"))
60
+ end
61
+ end
62
+
63
+ class Chef < Base
64
+ class ChefError < Errors::VagrantError
65
+ error_namespace("vagrant.provisioners.chef")
66
+ end
67
+ end
68
+
69
+ class Chef < Base
70
+ # This is the configuration which is available through `config.chef`
71
+ class Config < Vagrant::Config::Base
72
+ # Shared config
73
+ attr_accessor :node_name
74
+ attr_accessor :provisioning_path
75
+ attr_accessor :log_level
76
+ attr_accessor :json
77
+ attr_accessor :http_proxy
78
+ attr_accessor :http_proxy_user
79
+ attr_accessor :http_proxy_pass
80
+ attr_accessor :https_proxy
81
+ attr_accessor :https_proxy_user
82
+ attr_accessor :https_proxy_pass
83
+ attr_accessor :no_proxy
84
+
85
+ def initialize
86
+ @provisioning_path = "/tmp/vagrant-chef"
87
+ @log_level = :info
88
+ @json = { :instance_role => "vagrant" }
89
+ @http_proxy = nil
90
+ @http_proxy_user = nil
91
+ @http_proxy_pass = nil
92
+ @https_proxy = nil
93
+ @https_proxy_user = nil
94
+ @https_proxy_pass = nil
95
+ @no_proxy = nil
96
+ end
97
+
98
+ # Returns the run list for the provisioning
99
+ def run_list
100
+ json[:run_list] ||= []
101
+ end
102
+
103
+ # Sets the run list to the specified value
104
+ def run_list=(value)
105
+ json[:run_list] = value
106
+ end
107
+
108
+ # Adds a recipe to the run list
109
+ def add_recipe(name)
110
+ name = "recipe[#{name}]" unless name =~ /^recipe\[(.+?)\]$/
111
+ run_list << name
112
+ end
113
+
114
+ # Adds a role to the run list
115
+ def add_role(name)
116
+ name = "role[#{name}]" unless name =~ /^role\[(.+?)\]$/
117
+ run_list << name
118
+ end
119
+
120
+ def instance_variables_hash
121
+ # Overridden so that the 'json' key could be removed, since its just
122
+ # merged into the config anyways
123
+ result = super
124
+ result.delete("json")
125
+ result
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,103 @@
1
+ require 'pathname'
2
+
3
+ module Vagrant
4
+ module Provisioners
5
+ # This class implements provisioning via chef-client, allowing provisioning
6
+ # with a chef server.
7
+ class ChefServer < Chef
8
+ register :chef_server
9
+
10
+ class Config < Chef::Config
11
+ attr_accessor :chef_server_url
12
+ attr_accessor :validation_key_path
13
+ attr_accessor :validation_client_name
14
+ attr_accessor :client_key_path
15
+ attr_accessor :file_cache_path
16
+ attr_accessor :file_backup_path
17
+
18
+ def initialize
19
+ super
20
+
21
+ @validation_client_name = "chef-validator"
22
+ @client_key_path = "/etc/chef/client.pem"
23
+ @file_cache_path = "/srv/chef/file_store"
24
+ @file_backup_path = "/srv/chef/cache"
25
+ end
26
+
27
+ def validate(errors)
28
+ super
29
+
30
+ errors.add(I18n.t("vagrant.config.chef.server_url_empty")) if !chef_server_url || chef_server_url.strip == ""
31
+ errors.add(I18n.t("vagrant.config.chef.validation_key_path")) if !validation_key_path
32
+ errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if json[:run_list] && run_list.empty?
33
+ end
34
+ end
35
+
36
+ def prepare
37
+ raise ChefError, :server_validation_key_required if config.validation_key_path.nil?
38
+ raise ChefError, :server_validation_key_doesnt_exist if !File.file?(validation_key_path)
39
+ raise ChefError, :server_url_required if config.chef_server_url.nil?
40
+ end
41
+
42
+ def provision!
43
+ verify_binary("chef-client")
44
+ chown_provisioning_folder
45
+ create_client_key_folder
46
+ upload_validation_key
47
+ setup_json
48
+ setup_server_config
49
+ run_chef_client
50
+ end
51
+
52
+ def create_client_key_folder
53
+ env.ui.info I18n.t("vagrant.provisioners.chef.client_key_folder")
54
+ path = Pathname.new(config.client_key_path)
55
+
56
+ vm.ssh.execute do |ssh|
57
+ ssh.sudo!("mkdir -p #{path.dirname}")
58
+ end
59
+ end
60
+
61
+ def upload_validation_key
62
+ env.ui.info I18n.t("vagrant.provisioners.chef.upload_validation_key")
63
+ vm.ssh.upload!(validation_key_path, guest_validation_key_path)
64
+ end
65
+
66
+ def setup_server_config
67
+ setup_config("chef_server_client", "client.rb", {
68
+ :node_name => config.node_name,
69
+ :chef_server_url => config.chef_server_url,
70
+ :validation_client_name => config.validation_client_name,
71
+ :validation_key => guest_validation_key_path,
72
+ :client_key => config.client_key_path,
73
+ :file_cache_path => config.file_cache_path,
74
+ :file_backup_path => config.file_backup_path
75
+ })
76
+ end
77
+
78
+ def run_chef_client
79
+ commands = ["cd #{config.provisioning_path}",
80
+ "chef-client -c client.rb -j dna.json"]
81
+
82
+ env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
83
+ vm.ssh.execute do |ssh|
84
+ ssh.sudo!(commands) do |channel, type, data|
85
+ if type == :exit_status
86
+ ssh.check_exit_status(data, commands)
87
+ else
88
+ env.ui.info("#{data}: #{type}")
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def validation_key_path
95
+ File.expand_path(config.validation_key_path, env.root_path)
96
+ end
97
+
98
+ def guest_validation_key_path
99
+ File.join(config.provisioning_path, "validation.pem")
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,142 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ # This class implements provisioning via chef-solo.
4
+ class ChefSolo < Chef
5
+ register :chef_solo
6
+
7
+ class Config < Chef::Config
8
+ attr_accessor :cookbooks_path
9
+ attr_accessor :roles_path
10
+ attr_accessor :recipe_url
11
+
12
+ def initialize
13
+ super
14
+
15
+ @cookbooks_path = ["cookbooks", [:vm, "cookbooks"]]
16
+ @roles_path = []
17
+ end
18
+
19
+ def validate(errors)
20
+ super
21
+
22
+ errors.add(I18n.t("vagrant.config.chef.cookbooks_path_empty")) if !cookbooks_path || [cookbooks_path].flatten.empty?
23
+ errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if !json[:run_list] || run_list.empty?
24
+ end
25
+ end
26
+
27
+ def prepare
28
+ share_cookbook_folders
29
+ share_role_folders
30
+ end
31
+
32
+ def provision!
33
+ verify_binary("chef-solo")
34
+ chown_provisioning_folder
35
+ setup_json
36
+ setup_solo_config
37
+ run_chef_solo
38
+ end
39
+
40
+ def share_cookbook_folders
41
+ host_cookbook_paths.each_with_index do |cookbook, i|
42
+ env.config.vm.share_folder("v-csc-#{i}", cookbook_path(i), cookbook)
43
+ end
44
+ end
45
+
46
+ def share_role_folders
47
+ host_role_paths.each_with_index do |role, i|
48
+ env.config.vm.share_folder("v-csr-#{i}", role_path(i), role)
49
+ end
50
+ end
51
+
52
+ def setup_solo_config
53
+ setup_config("chef_solo_solo", "solo.rb", {
54
+ :node_name => config.node_name,
55
+ :provisioning_path => config.provisioning_path,
56
+ :cookbooks_path => cookbooks_path,
57
+ :recipe_url => config.recipe_url,
58
+ :roles_path => roles_path,
59
+ })
60
+ end
61
+
62
+ def run_chef_solo
63
+ commands = ["cd #{config.provisioning_path}", "chef-solo -c solo.rb -j dna.json"]
64
+
65
+ env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
66
+ vm.ssh.execute do |ssh|
67
+ ssh.sudo!(commands) do |channel, type, data|
68
+ if type == :exit_status
69
+ ssh.check_exit_status(data, commands)
70
+ else
71
+ env.ui.info("#{data}: #{type}")
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def host_folder_paths(paths)
78
+ # Convert single cookbook paths such as "cookbooks" or [:vm, "cookbooks"]
79
+ # into a proper array representation.
80
+ paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
81
+
82
+ paths.inject([]) do |acc, path|
83
+ path = [:host, path] if !path.is_a?(Array)
84
+ type, path = path
85
+
86
+ acc << File.expand_path(path, env.root_path) if type == :host
87
+ acc
88
+ end
89
+ end
90
+
91
+ def folder_path(*args)
92
+ File.join(config.provisioning_path, args.join("-"))
93
+ end
94
+
95
+ def folders_path(folders, folder)
96
+ # Convert single cookbook paths such as "cookbooks" or [:vm, "cookbooks"]
97
+ # into a proper array representation.
98
+ folders = [folders] if folders.is_a?(String) || folders.first.is_a?(Symbol)
99
+
100
+ # Convert each path to the proper absolute path depending on if the path
101
+ # is a host path or a VM path
102
+ result = []
103
+ folders.each_with_index do |path, i|
104
+ path = [:host, path] if !path.is_a?(Array)
105
+ type, path = path
106
+
107
+ result << folder_path(folder, i) if type == :host
108
+ result << folder_path(path) if type == :vm
109
+ end
110
+
111
+ # We're lucky that ruby's string and array syntax for strings is the
112
+ # same as JSON, so we can just convert to JSON here and use that
113
+ result = result[0].to_s if result.length == 1
114
+ result
115
+ end
116
+
117
+ def host_cookbook_paths
118
+ host_folder_paths(config.cookbooks_path)
119
+ end
120
+
121
+ def host_role_paths
122
+ host_folder_paths(config.roles_path)
123
+ end
124
+
125
+ def cookbook_path(i)
126
+ folder_path("cookbooks", i)
127
+ end
128
+
129
+ def role_path(i)
130
+ folder_path("roles", i)
131
+ end
132
+
133
+ def cookbooks_path
134
+ folders_path(config.cookbooks_path, "cookbooks").to_json
135
+ end
136
+
137
+ def roles_path
138
+ folders_path(config.roles_path, "roles").to_json
139
+ end
140
+ end
141
+ end
142
+ end