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,120 @@
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 ChefClient < Chef
8
+ register :chef_client
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
+ attr_accessor :environment
18
+ attr_accessor :encrypted_data_bag_secret_key_path
19
+ attr_accessor :encrypted_data_bag_secret
20
+
21
+ def initialize
22
+ super
23
+
24
+ @validation_client_name = "chef-validator"
25
+ @client_key_path = "/etc/chef/client.pem"
26
+ @file_cache_path = "/srv/chef/file_store"
27
+ @file_backup_path = "/srv/chef/cache"
28
+ @encrypted_data_bag_secret_key_path = nil
29
+ @encrypted_data_bag_secret = "/etc/chef/encrypted_data_bag_secret"
30
+ end
31
+
32
+ def validate(errors)
33
+ super
34
+
35
+ errors.add(I18n.t("vagrant.config.chef.server_url_empty")) if !chef_server_url || chef_server_url.strip == ""
36
+ errors.add(I18n.t("vagrant.config.chef.validation_key_path")) if !validation_key_path
37
+ errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if @run_list && @run_list.empty?
38
+ end
39
+ end
40
+
41
+ def prepare
42
+ raise ChefError, :server_validation_key_required if config.validation_key_path.nil?
43
+ raise ChefError, :server_validation_key_doesnt_exist if !File.file?(validation_key_path)
44
+ raise ChefError, :server_url_required if config.chef_server_url.nil?
45
+ end
46
+
47
+ def provision!
48
+ verify_binary(chef_binary_path("chef-client"))
49
+ chown_provisioning_folder
50
+ create_client_key_folder
51
+ upload_validation_key
52
+ upload_encrypted_data_bag_secret if config.encrypted_data_bag_secret_key_path
53
+ setup_json
54
+ setup_server_config
55
+ run_chef_client
56
+ end
57
+
58
+ def create_client_key_folder
59
+ env.ui.info I18n.t("vagrant.provisioners.chef.client_key_folder")
60
+ path = Pathname.new(config.client_key_path)
61
+
62
+ vm.ssh.execute do |ssh|
63
+ ssh.sudo!("mkdir -p #{path.dirname}")
64
+ end
65
+ end
66
+
67
+ def upload_validation_key
68
+ env.ui.info I18n.t("vagrant.provisioners.chef.upload_validation_key")
69
+ vm.ssh.upload!(validation_key_path, guest_validation_key_path)
70
+ end
71
+
72
+ def upload_encrypted_data_bag_secret
73
+ env.ui.info I18n.t("vagrant.provisioners.chef.upload_encrypted_data_bag_secret_key")
74
+ vm.ssh.upload!(encrypted_data_bag_secret_key_path, config.encrypted_data_bag_secret)
75
+ end
76
+
77
+ def setup_server_config
78
+ setup_config("chef_server_client", "client.rb", {
79
+ :node_name => config.node_name,
80
+ :chef_server_url => config.chef_server_url,
81
+ :validation_client_name => config.validation_client_name,
82
+ :validation_key => guest_validation_key_path,
83
+ :client_key => config.client_key_path,
84
+ :file_cache_path => config.file_cache_path,
85
+ :file_backup_path => config.file_backup_path,
86
+ :environment => config.environment,
87
+ :encrypted_data_bag_secret => config.encrypted_data_bag_secret
88
+ })
89
+ end
90
+
91
+ def run_chef_client
92
+ command_env = config.binary_env ? "#{config.binary_env} " : ""
93
+ command = "#{command_env}#{chef_binary_path("chef-client")} -c #{config.provisioning_path}/client.rb -j #{config.provisioning_path}/dna.json"
94
+
95
+ env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
96
+ vm.ssh.execute do |ssh|
97
+ ssh.sudo!(command) do |channel, type, data|
98
+ if type == :exit_status
99
+ ssh.check_exit_status(data, command)
100
+ else
101
+ env.ui.info("#{data}: #{type}")
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ def validation_key_path
108
+ File.expand_path(config.validation_key_path, env.root_path)
109
+ end
110
+
111
+ def encrypted_data_bag_secret_key_path
112
+ File.expand_path(config.encrypted_data_bag_secret_key_path, env.root_path)
113
+ end
114
+
115
+ def guest_validation_key_path
116
+ File.join(config.provisioning_path, "validation.pem")
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,135 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ # This class implements provisioning via chef-solo.
4
+ class ChefSolo < Chef
5
+ register :chef_solo
6
+
7
+ extend Util::Counter
8
+ include Util::Counter
9
+
10
+ class Config < Chef::Config
11
+ attr_accessor :cookbooks_path
12
+ attr_accessor :roles_path
13
+ attr_accessor :data_bags_path
14
+ attr_accessor :recipe_url
15
+ attr_accessor :nfs
16
+
17
+ def initialize
18
+ super
19
+
20
+ @cookbooks_path = ["cookbooks", [:vm, "cookbooks"]]
21
+ @roles_path = nil
22
+ @data_bags_path = nil
23
+ @nfs = false
24
+ end
25
+
26
+ def validate(errors)
27
+ super
28
+
29
+ errors.add(I18n.t("vagrant.config.chef.cookbooks_path_empty")) if !cookbooks_path || [cookbooks_path].flatten.empty?
30
+ errors.add(I18n.t("vagrant.config.chef.run_list_empty")) if !run_list || run_list.empty?
31
+ end
32
+ end
33
+
34
+ attr_reader :cookbook_folders
35
+ attr_reader :role_folders
36
+ attr_reader :data_bags_folders
37
+
38
+ def prepare
39
+ @cookbook_folders = expanded_folders(config.cookbooks_path)
40
+ @role_folders = expanded_folders(config.roles_path)
41
+ @data_bags_folders = expanded_folders(config.data_bags_path)
42
+
43
+ share_folders("csc", @cookbook_folders)
44
+ share_folders("csr", @role_folders)
45
+ share_folders("csdb", @data_bags_folders)
46
+ end
47
+
48
+ def provision!
49
+ verify_binary(chef_binary_path("chef-solo"))
50
+ chown_provisioning_folder
51
+ setup_json
52
+ setup_solo_config
53
+ run_chef_solo
54
+ end
55
+
56
+ # Converts paths to a list of properly expanded paths with types.
57
+ def expanded_folders(paths)
58
+ return [] if paths.nil?
59
+
60
+ # Convert the path to an array if it is a string or just a single
61
+ # path element which contains the folder location (:host or :vm)
62
+ paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
63
+
64
+ paths.map do |path|
65
+ path = [:host, path] if !path.is_a?(Array)
66
+ type, path = path
67
+
68
+ # Create the local/remote path based on whether this is a host
69
+ # or VM path.
70
+ local_path = nil
71
+ local_path = File.expand_path(path, env.root_path) if type == :host
72
+ remote_path = nil
73
+ if type == :host
74
+ # Path exists on the host, setup the remote path
75
+ remote_path = "#{config.provisioning_path}/chef-solo-#{get_and_update_counter(:cookbooks_path)}"
76
+ else
77
+ # Path already exists on the virtual machine. Expand it
78
+ # relative to where we're provisioning.
79
+ remote_path = File.expand_path(path, config.provisioning_path)
80
+ end
81
+
82
+ # Return the result
83
+ [type, local_path, remote_path]
84
+ end
85
+ end
86
+
87
+ # Shares the given folders with the given prefix. The folders should
88
+ # be of the structure resulting from the `expanded_folders` function.
89
+ def share_folders(prefix, folders)
90
+ folders.each do |type, local_path, remote_path|
91
+ if type == :host
92
+ env.config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter(:shared_folder)}",
93
+ remote_path, local_path, :nfs => config.nfs)
94
+ end
95
+ end
96
+ end
97
+
98
+ def setup_solo_config
99
+ cookbooks_path = guest_paths(@cookbook_folders)
100
+ roles_path = guest_paths(@role_folders).first
101
+ data_bags_path = guest_paths(@data_bags_folders).first
102
+
103
+ setup_config("chef_solo_solo", "solo.rb", {
104
+ :node_name => config.node_name,
105
+ :provisioning_path => config.provisioning_path,
106
+ :cookbooks_path => cookbooks_path,
107
+ :recipe_url => config.recipe_url,
108
+ :roles_path => roles_path,
109
+ :data_bags_path => data_bags_path,
110
+ })
111
+ end
112
+
113
+ def run_chef_solo
114
+ command_env = config.binary_env ? "#{config.binary_env} " : ""
115
+ command = "#{command_env}#{chef_binary_path("chef-solo")} -c #{config.provisioning_path}/solo.rb -j #{config.provisioning_path}/dna.json"
116
+
117
+ env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
118
+ vm.ssh.execute do |ssh|
119
+ ssh.sudo!(command) do |channel, type, data|
120
+ if type == :exit_status
121
+ ssh.check_exit_status(data, command)
122
+ else
123
+ env.ui.info("#{data}: #{type}")
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ # Extracts only the remote paths from a list of folders
130
+ def guest_paths(folders)
131
+ folders.map { |parts| parts[2] }
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,137 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ class PuppetError < Vagrant::Errors::VagrantError
4
+ error_namespace("vagrant.provisioners.puppet")
5
+ end
6
+
7
+ class Puppet < Base
8
+ register :puppet
9
+
10
+ class Config < Vagrant::Config::Base
11
+ attr_accessor :manifest_file
12
+ attr_accessor :manifests_path
13
+ attr_accessor :module_path
14
+ attr_accessor :pp_path
15
+ attr_accessor :options
16
+
17
+ def initialize
18
+ @manifest_file = nil
19
+ @manifests_path = "manifests"
20
+ @module_path = nil
21
+ @pp_path = "/tmp/vagrant-puppet"
22
+ @options = []
23
+ end
24
+
25
+ # Returns the manifests path expanded relative to the root path of the
26
+ # environment.
27
+ def expanded_manifests_path
28
+ Pathname.new(manifests_path).expand_path(env.root_path)
29
+ end
30
+
31
+ # Returns the manifest file if set otherwise returns the box name pp file
32
+ # which may or may not exist.
33
+ def computed_manifest_file
34
+ manifest_file || "#{top.vm.box}.pp"
35
+ end
36
+
37
+ # Returns the module paths as an array of paths expanded relative to the
38
+ # root path.
39
+ def expanded_module_paths
40
+ return [] if !module_path
41
+
42
+ # Get all the paths and expand them relative to the root path, returning
43
+ # the array of expanded paths
44
+ paths = module_path
45
+ paths = [paths] if !paths.is_a?(Array)
46
+ paths.map do |path|
47
+ Pathname.new(path).expand_path(env.root_path)
48
+ end
49
+ end
50
+
51
+ def validate(errors)
52
+ super
53
+
54
+ # Manifests path/file validation
55
+ if !expanded_manifests_path.directory?
56
+ errors.add(I18n.t("vagrant.provisioners.puppet.manifests_path_missing", :path => expanded_manifests_path))
57
+ else
58
+ if !expanded_manifests_path.join(computed_manifest_file).file?
59
+ errors.add(I18n.t("vagrant.provisioners.puppet.manifest_missing", :manifest => computed_manifest_file))
60
+ end
61
+ end
62
+
63
+ # Module paths validation
64
+ expanded_module_paths.each do |path|
65
+ if !path.directory?
66
+ errors.add(I18n.t("vagrant.provisioners.puppet.module_path_missing", :path => path))
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ def prepare
73
+ set_module_paths
74
+ share_manifests
75
+ share_module_paths
76
+ end
77
+
78
+ def provision!
79
+ verify_binary("puppet")
80
+ run_puppet_client
81
+ end
82
+
83
+ def share_manifests
84
+ env.config.vm.share_folder("manifests", manifests_guest_path, config.expanded_manifests_path)
85
+ end
86
+
87
+ def share_module_paths
88
+ count = 0
89
+ @module_paths.each do |from, to|
90
+ # Sorry for the cryptic key here, but VirtualBox has a strange limit on
91
+ # maximum size for it and its something small (around 10)
92
+ env.config.vm.share_folder("v-pp-m#{count}", to, from)
93
+ count += 1
94
+ end
95
+ end
96
+
97
+ def set_module_paths
98
+ @module_paths = {}
99
+ config.expanded_module_paths.each_with_index do |path, i|
100
+ @module_paths[path] = File.join(config.pp_path, "modules-#{i}")
101
+ end
102
+ end
103
+
104
+ def manifests_guest_path
105
+ File.join(config.pp_path, "manifests")
106
+ end
107
+
108
+ def verify_binary(binary)
109
+ vm.ssh.execute do |ssh|
110
+ ssh.sudo!("which #{binary}", :error_class => PuppetError, :_key => :puppet_not_detected, :binary => binary)
111
+ end
112
+ end
113
+
114
+ def run_puppet_client
115
+ options = [config.options].flatten
116
+ options << "--modulepath '#{@module_paths.values.join(':')}'" if !@module_paths.empty?
117
+ options << config.computed_manifest_file
118
+ options = options.join(" ")
119
+
120
+ commands = ["cd #{manifests_guest_path}",
121
+ "puppet apply #{options}"]
122
+
123
+ env.ui.info I18n.t("vagrant.provisioners.puppet.running_puppet", :manifest => config.computed_manifest_file)
124
+
125
+ vm.ssh.execute do |ssh|
126
+ ssh.sudo! commands do |ch, type, data|
127
+ if type == :exit_status
128
+ ssh.check_exit_status(data, commands)
129
+ else
130
+ env.ui.info(data)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,55 @@
1
+ module Vagrant
2
+ module Provisioners
3
+ class PuppetServerError < Vagrant::Errors::VagrantError
4
+ error_namespace("vagrant.provisioners.puppet_server")
5
+ end
6
+
7
+ class PuppetServer < Base
8
+ register :puppet_server
9
+
10
+ class Config < Vagrant::Config::Base
11
+ attr_accessor :puppet_server
12
+ attr_accessor :puppet_node
13
+ attr_accessor :options
14
+
15
+ def initialize
16
+ @puppet_server = "puppet"
17
+ @puppet_node = "puppet_node"
18
+ @options = []
19
+ end
20
+ end
21
+
22
+ def provision!
23
+ verify_binary("puppetd")
24
+ run_puppetd_client
25
+ end
26
+
27
+ def verify_binary(binary)
28
+ vm.ssh.execute do |ssh|
29
+ ssh.sudo!("which #{binary}", :error_class => PuppetServerError, :_key => :puppetd_not_detected, :binary => binary)
30
+ end
31
+ end
32
+
33
+ def run_puppetd_client
34
+ options = config.options
35
+ options = options.join(" ") if options.is_a?(Array)
36
+ if config.puppet_node
37
+ cn = config.puppet_node
38
+ else
39
+ cn = env.config.vm.box
40
+ end
41
+
42
+ commands = "puppetd #{options} --server #{config.puppet_server} --certname #{cn}"
43
+
44
+ env.ui.info I18n.t("vagrant.provisioners.puppet_server.running_puppetd")
45
+
46
+ vm.ssh.execute do |ssh|
47
+ ssh.sudo!(commands) do |channel, type, data|
48
+ ssh.check_exit_status(data, commands) if type == :exit_status
49
+ env.ui.info(data) if type != :exit_status
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end