poolparty 0.0.4 → 0.2.6

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 (247) hide show
  1. data/History.txt +25 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +203 -0
  4. data/PostInstall.txt +18 -0
  5. data/README.txt +21 -82
  6. data/Rakefile +25 -18
  7. data/bin/cloud +31 -0
  8. data/bin/cloud-add-keypair +23 -0
  9. data/bin/cloud-configure +31 -0
  10. data/bin/cloud-contract +27 -0
  11. data/bin/cloud-expand +27 -0
  12. data/bin/cloud-list +32 -0
  13. data/bin/cloud-maintain +36 -0
  14. data/bin/cloud-osxcopy +22 -0
  15. data/bin/cloud-provision +31 -0
  16. data/bin/cloud-refresh +26 -0
  17. data/bin/cloud-ssh +18 -0
  18. data/bin/cloud-start +32 -0
  19. data/bin/cloud-terminate +23 -0
  20. data/bin/pool +25 -27
  21. data/bin/pool-console +12 -0
  22. data/bin/pool-describe +9 -0
  23. data/bin/pool-list +28 -0
  24. data/bin/pool-provision +34 -0
  25. data/bin/pool-spec +17 -0
  26. data/bin/pool-start +32 -0
  27. data/bin/pool-start-monitor +1 -0
  28. data/config/hoe.rb +115 -0
  29. data/config/requirements.rb +15 -0
  30. data/examples/basic.rb +20 -0
  31. data/examples/plugin_without_plugin_directory.rb +13 -0
  32. data/examples/poolparty.rb +12 -0
  33. data/examples/with_apache_plugin.rb +22 -0
  34. data/generators/poolspec/USAGE +5 -0
  35. data/generators/poolspec/poolspec_generator.rb +65 -0
  36. data/generators/poolspec/templates/pool_spec_template.erb +9 -0
  37. data/lib/erlang/eb_server.erl +27 -0
  38. data/lib/poolparty.rb +56 -0
  39. data/lib/poolparty/base_packages/haproxy.rb +42 -0
  40. data/lib/poolparty/base_packages/heartbeat.rb +45 -0
  41. data/lib/poolparty/base_packages/poolparty.rb +36 -0
  42. data/lib/poolparty/base_packages/ruby.rb +43 -0
  43. data/lib/poolparty/core/array.rb +24 -0
  44. data/lib/{core → poolparty/core}/exception.rb +0 -0
  45. data/lib/poolparty/core/float.rb +13 -0
  46. data/lib/poolparty/core/hash.rb +29 -0
  47. data/lib/poolparty/core/kernel.rb +37 -0
  48. data/lib/{core → poolparty/core}/module.rb +18 -0
  49. data/lib/poolparty/core/my_open_struct.rb +18 -0
  50. data/lib/poolparty/core/object.rb +54 -0
  51. data/lib/poolparty/core/proc.rb +7 -0
  52. data/lib/poolparty/core/string.rb +72 -0
  53. data/lib/poolparty/core/symbol.rb +8 -0
  54. data/lib/{core → poolparty/core}/time.rb +15 -0
  55. data/lib/poolparty/exceptions/RemoteException.rb +12 -0
  56. data/lib/poolparty/exceptions/ResourceException.rb +7 -0
  57. data/lib/poolparty/exceptions/RuntimeException.rb +7 -0
  58. data/lib/poolparty/exceptions/SpecException.rb +7 -0
  59. data/lib/poolparty/exceptions/TemplateNotFound.rb +7 -0
  60. data/lib/poolparty/helpers/binary.rb +31 -0
  61. data/lib/poolparty/helpers/console.rb +30 -0
  62. data/lib/poolparty/helpers/display.rb +34 -0
  63. data/lib/poolparty/helpers/optioner.rb +64 -0
  64. data/lib/poolparty/helpers/provisioner_base.rb +250 -0
  65. data/lib/poolparty/helpers/provisioners/master.rb +136 -0
  66. data/lib/poolparty/helpers/provisioners/slave.rb +44 -0
  67. data/lib/poolparty/modules/cloud_resourcer.rb +89 -0
  68. data/lib/poolparty/modules/configurable.rb +34 -0
  69. data/lib/poolparty/modules/definable_resource.rb +59 -0
  70. data/lib/poolparty/modules/file_writer.rb +55 -0
  71. data/lib/poolparty/modules/method_missing_sugar.rb +53 -0
  72. data/lib/poolparty/modules/output.rb +13 -0
  73. data/lib/poolparty/modules/pretty_printer.rb +39 -0
  74. data/lib/{core/string.rb → poolparty/modules/s3_string.rb} +5 -22
  75. data/lib/{modules → poolparty/modules}/safe_instance.rb +0 -0
  76. data/lib/poolparty/monitors/base_monitor.rb +16 -0
  77. data/lib/poolparty/net/remote.rb +35 -0
  78. data/lib/poolparty/net/remote_bases/ec2.rb +148 -0
  79. data/lib/poolparty/net/remote_instance.rb +69 -0
  80. data/lib/poolparty/net/remoter.rb +224 -0
  81. data/lib/poolparty/net/remoter_base.rb +117 -0
  82. data/lib/poolparty/plugins/gem_package.rb +17 -0
  83. data/lib/poolparty/plugins/git.rb +41 -0
  84. data/lib/poolparty/plugins/line.rb +76 -0
  85. data/lib/poolparty/plugins/svn.rb +48 -0
  86. data/lib/poolparty/pool/base.rb +75 -0
  87. data/lib/poolparty/pool/cloud.rb +164 -0
  88. data/lib/poolparty/pool/custom_resource.rb +61 -0
  89. data/lib/poolparty/pool/loggable.rb +29 -0
  90. data/lib/poolparty/pool/plugin.rb +41 -0
  91. data/lib/poolparty/pool/plugin_model.rb +48 -0
  92. data/lib/poolparty/pool/pool.rb +55 -0
  93. data/lib/poolparty/pool/resource.rb +248 -0
  94. data/lib/poolparty/pool/resources/class_package.rb +64 -0
  95. data/lib/poolparty/pool/resources/conditional.rb +41 -0
  96. data/lib/poolparty/pool/resources/cron.rb +14 -0
  97. data/lib/poolparty/pool/resources/directory.rb +23 -0
  98. data/lib/poolparty/pool/resources/exec.rb +26 -0
  99. data/lib/poolparty/pool/resources/file.rb +23 -0
  100. data/lib/poolparty/pool/resources/gem.rb +14 -0
  101. data/lib/poolparty/pool/resources/host.rb +14 -0
  102. data/lib/poolparty/pool/resources/package.rb +14 -0
  103. data/lib/poolparty/pool/resources/remote_file.rb +22 -0
  104. data/lib/poolparty/pool/resources/service.rb +21 -0
  105. data/lib/poolparty/pool/resources/sshkey.rb +19 -0
  106. data/lib/poolparty/pool/resources/variable.rb +27 -0
  107. data/lib/poolparty/pool/script.rb +44 -0
  108. data/lib/poolparty/templates/authkeys +2 -0
  109. data/{config/monit/nginx.monit.conf → lib/poolparty/templates/cib.xml} +0 -0
  110. data/lib/poolparty/templates/fileserver.conf +4 -0
  111. data/lib/poolparty/templates/gem +25 -0
  112. data/{config/heartbeat.conf → lib/poolparty/templates/ha.cf} +3 -2
  113. data/{config → lib/poolparty/templates}/haproxy.conf +13 -6
  114. data/lib/poolparty/templates/namespaceauth.conf +19 -0
  115. data/lib/poolparty/templates/puppet.conf +17 -0
  116. data/lib/poolparty/version.rb +9 -0
  117. data/lib/poolpartycl.rb +3 -0
  118. data/poolparty.gemspec +56 -47
  119. data/script/destroy +14 -0
  120. data/script/generate +14 -0
  121. data/script/txt2html +82 -0
  122. data/setup.rb +1585 -0
  123. data/spec/poolparty/base_packages/haproxy_spec.rb +13 -0
  124. data/spec/poolparty/base_packages/heartbeat_spec.rb +30 -0
  125. data/spec/poolparty/bin/console_spec.rb +80 -0
  126. data/spec/poolparty/core/array_spec.rb +26 -0
  127. data/spec/poolparty/core/float.rb +13 -0
  128. data/spec/poolparty/core/hash_spec.rb +63 -0
  129. data/spec/poolparty/core/kernel_spec.rb +24 -0
  130. data/spec/poolparty/core/module_spec.rb +15 -0
  131. data/spec/poolparty/core/object_spec.rb +40 -0
  132. data/spec/poolparty/core/string_spec.rb +152 -0
  133. data/spec/poolparty/core/time_spec.rb +52 -0
  134. data/spec/poolparty/helpers/binary_spec.rb +26 -0
  135. data/spec/poolparty/helpers/display_spec.rb +13 -0
  136. data/spec/poolparty/helpers/optioner_spec.rb +39 -0
  137. data/spec/poolparty/helpers/provisioner_base_spec.rb +121 -0
  138. data/spec/poolparty/helpers/provisioners/master_spec.rb +54 -0
  139. data/spec/poolparty/helpers/provisioners/slave_spec.rb +28 -0
  140. data/spec/poolparty/modules/cloud_resourcer_spec.rb +135 -0
  141. data/spec/poolparty/modules/configurable_spec.rb +26 -0
  142. data/spec/poolparty/modules/definable_resource.rb +9 -0
  143. data/spec/poolparty/modules/file_writer_spec.rb +49 -0
  144. data/spec/poolparty/modules/s3_string_spec.rb +15 -0
  145. data/spec/poolparty/modules/tmp/willy/nilly.rb +1 -0
  146. data/spec/poolparty/net/remote_bases/ec2_spec.rb +92 -0
  147. data/spec/poolparty/net/remote_instance_spec.rb +70 -0
  148. data/spec/poolparty/net/remote_spec.rb +286 -0
  149. data/spec/poolparty/net/remoter_base_spec.rb +80 -0
  150. data/spec/poolparty/net/remoter_spec.rb +191 -0
  151. data/spec/poolparty/plugins/git_spec.rb +33 -0
  152. data/spec/poolparty/plugins/line_spec.rb +16 -0
  153. data/spec/poolparty/plugins/svn_spec.rb +16 -0
  154. data/spec/poolparty/pool/base_spec.rb +108 -0
  155. data/spec/poolparty/pool/cloud_spec.rb +299 -0
  156. data/spec/poolparty/pool/configurers/files/ruby_basic.rb +17 -0
  157. data/spec/poolparty/pool/configurers/files/ruby_plugins.rb +16 -0
  158. data/spec/poolparty/pool/configurers/ruby_spec.rb +58 -0
  159. data/spec/poolparty/pool/custom_resource_spec.rb +115 -0
  160. data/spec/poolparty/pool/example_spec.rb +112 -0
  161. data/spec/poolparty/pool/plugin_model_spec.rb +63 -0
  162. data/spec/poolparty/pool/plugin_spec.rb +85 -0
  163. data/spec/poolparty/pool/pool_spec.rb +83 -0
  164. data/spec/poolparty/pool/resource_spec.rb +224 -0
  165. data/spec/poolparty/pool/resources/class_package_spec.rb +84 -0
  166. data/spec/poolparty/pool/resources/conditional_spec.rb +38 -0
  167. data/spec/poolparty/pool/resources/cron_spec.rb +49 -0
  168. data/spec/poolparty/pool/resources/directory_spec.rb +40 -0
  169. data/spec/poolparty/pool/resources/exec_spec.rb +37 -0
  170. data/spec/poolparty/pool/resources/file_spec.rb +40 -0
  171. data/spec/poolparty/pool/resources/gem_spec.rb +16 -0
  172. data/spec/poolparty/pool/resources/host_spec.rb +28 -0
  173. data/spec/poolparty/pool/resources/package_spec.rb +44 -0
  174. data/spec/poolparty/pool/resources/remote_file_spec.rb +40 -0
  175. data/spec/poolparty/pool/resources/service_spec.rb +45 -0
  176. data/spec/poolparty/pool/resources/sshkey_spec.rb +48 -0
  177. data/spec/poolparty/pool/resources/variable_spec.rb +20 -0
  178. data/spec/poolparty/pool/script_spec.rb +51 -0
  179. data/spec/poolparty/pool/test_plugins/sshkey_test +2 -0
  180. data/{test/test_pool_party.rb → spec/poolparty/pool/test_plugins/virtual_host_template.erb} +0 -0
  181. data/spec/poolparty/pool/test_plugins/webserver.rb +46 -0
  182. data/spec/poolparty/poolparty_spec.rb +33 -0
  183. data/spec/poolparty/spec_helper.rb +120 -0
  184. data/tasks/cloud.rake +57 -0
  185. data/tasks/deployment.rake +34 -0
  186. data/tasks/development.rake +78 -0
  187. data/tasks/ec2.rake +20 -0
  188. data/tasks/environment.rake +7 -0
  189. data/tasks/instance.rake +63 -0
  190. data/tasks/server.rake +42 -0
  191. data/tasks/spec.rake +17 -0
  192. data/tasks/website.rake +17 -0
  193. data/test/test_generator_helper.rb +29 -0
  194. data/test/test_helper.rb +2 -0
  195. data/test/test_pool_spec_generator.rb +47 -0
  196. data/test/test_poolparty.rb +11 -0
  197. data/test_manifest.pp +538 -0
  198. data/website/index.html +107 -0
  199. data/website/index.txt +95 -0
  200. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  201. data/website/stylesheets/code.css +29 -0
  202. data/website/stylesheets/screen.css +147 -0
  203. data/website/template.html.erb +49 -0
  204. metadata +282 -101
  205. data/CHANGELOG +0 -4
  206. data/Manifest +0 -55
  207. data/bin/instance +0 -54
  208. data/config/config.yml +0 -23
  209. data/config/create_proxy_ami.sh +0 -582
  210. data/config/heartbeat_authkeys.conf +0 -2
  211. data/config/monit.conf +0 -8
  212. data/config/monit/haproxy.monit.conf +0 -7
  213. data/config/nginx.conf +0 -24
  214. data/lib/core/array.rb +0 -10
  215. data/lib/core/kernel.rb +0 -9
  216. data/lib/core/object.rb +0 -14
  217. data/lib/modules/callback.rb +0 -55
  218. data/lib/modules/ec2_wrapper.rb +0 -74
  219. data/lib/pool_party.rb +0 -69
  220. data/lib/pool_party/application.rb +0 -133
  221. data/lib/pool_party/init.rb +0 -4
  222. data/lib/pool_party/master.rb +0 -189
  223. data/lib/pool_party/monitors.rb +0 -13
  224. data/lib/pool_party/monitors/cpu.rb +0 -18
  225. data/lib/pool_party/monitors/memory.rb +0 -21
  226. data/lib/pool_party/monitors/web.rb +0 -18
  227. data/lib/pool_party/optioner.rb +0 -16
  228. data/lib/pool_party/os.rb +0 -11
  229. data/lib/pool_party/os/ubuntu.rb +0 -78
  230. data/lib/pool_party/remote_instance.rb +0 -180
  231. data/lib/pool_party/remoting.rb +0 -112
  232. data/lib/pool_party/scheduler.rb +0 -93
  233. data/lib/pool_party/tasks.rb +0 -220
  234. data/lib/s3/s3_object_store_folders.rb +0 -44
  235. data/spec/application_spec.rb +0 -32
  236. data/spec/callback_spec.rb +0 -65
  237. data/spec/helpers/ec2_mock.rb +0 -56
  238. data/spec/helpers/remote_instance_mock.rb +0 -11
  239. data/spec/kernel_spec.rb +0 -11
  240. data/spec/master_spec.rb +0 -147
  241. data/spec/monitor_spec.rb +0 -16
  242. data/spec/optioner_spec.rb +0 -22
  243. data/spec/poolparty_spec.rb +0 -8
  244. data/spec/remote_instance_spec.rb +0 -29
  245. data/spec/remoting_spec.rb +0 -75
  246. data/spec/spec_helper.rb +0 -38
  247. data/spec/string_spec.rb +0 -28
@@ -0,0 +1,8 @@
1
+ class Symbol
2
+ def to_string(prev="")
3
+ "#{prev}#{self.to_s}"
4
+ end
5
+ def sanitize
6
+ self.to_s.sanitize
7
+ end
8
+ end
@@ -38,4 +38,19 @@ class Numeric
38
38
  self * 7.days
39
39
  end
40
40
  alias :week :weeks
41
+
42
+ def months
43
+ self * 31.days
44
+ end
45
+ alias :month :months
46
+
47
+ def time_ago
48
+ out = %w(year month week day hour minute).detect {|unit| self > 1.send(unit) }
49
+ units_ago(out, self) rescue "Less than a minute ago"
50
+ end
51
+
52
+ def units_ago(unit,seconds)
53
+ in_units = (seconds / 1.send(unit))
54
+ "#{in_units.to_i} #{in_units != 1 ? unit.to_s.pluralize : unit} ago"
55
+ end
41
56
  end
@@ -0,0 +1,12 @@
1
+ class RemoteException < Exception
2
+ EXCEPTION_MESSAGES = {
3
+ :method_not_defined => "Method is not defined",
4
+ :invalid_formatting => "Invalid formatting",
5
+ :could_not_install => "Could not install"
6
+ }
7
+ attr_reader :message
8
+
9
+ def initialize(type=:method_not_defined, note="")
10
+ @message = "Remote Exception: #{EXCEPTION_MESSAGES[type]} #{note}"
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class ResourceException < Exception
2
+ attr_reader :message
3
+
4
+ def initialize(msg="Custom resource exception")
5
+ @message = "Custom resource error: #{msg}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class RuntimeException < Exception
2
+ attr_reader :message
3
+
4
+ def initialize(msg="Runtime exception")
5
+ @message = "There was a runtime error: #{msg}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class SpecException < Exception
2
+ attr_reader :message
3
+
4
+ def initialize(msg="Custom resource exception")
5
+ @message = "Spec error: #{msg}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class TemplateNotFound < Exception
2
+ attr_reader :message
3
+
4
+ def initialize(msg="Custom resource exception")
5
+ @message = "Template not found: #{msg}"
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ require "ftools"
2
+ module PoolParty
3
+ module Binary
4
+
5
+ class << self
6
+
7
+ def list_binaries_for(ty="pool")
8
+ available_binaries_for(ty).join(", ")
9
+ end
10
+ def available_binaries_for(ty="pool")
11
+ Dir["#{binary_directory}/#{ty}-*"].map {|a| File.basename(a.gsub(/#{ty}-/, '')) }.sort
12
+ end
13
+ def binary_directory
14
+ "#{::File.dirname(__FILE__)}/../../../bin"
15
+ end
16
+ def get_existing_spec_location
17
+ [
18
+ "#{Base.base_config_directory}/#{Base.default_specfile_name}",
19
+ "#{Base.remote_storage_path}/#{Base.default_specfile_name}",
20
+ ENV["POOL_SPEC"],
21
+ "#{Base.default_specfile_name}",
22
+ "#{Base.storage_directory}/#{Base.default_specfile_name}",
23
+ ].reject {|a| a.nil?}.reject do |f|
24
+ f unless ::File.file?(f)
25
+ end.first
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + "/display"
2
+
3
+ module PoolParty
4
+ module Console
5
+
6
+ include Display
7
+
8
+ # Load a file that contains a pool into memory
9
+ def load_pool(filename)
10
+ unless filename && ::File.file?(filename)
11
+ puts "Could not load pool"
12
+ exit
13
+ else
14
+ PoolParty::Script.inflate(open(filename).read, File.dirname(filename))
15
+ end
16
+ end
17
+
18
+ # Clear all the pools and reload the console
19
+ # Call within console to reset and reload the entire poolparty base
20
+ # as well
21
+ def reload!
22
+ reset!
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ class Object
29
+ include PoolParty::Console
30
+ end
@@ -0,0 +1,34 @@
1
+ module PoolParty
2
+ module Display
3
+
4
+ def pool_describe(options={})
5
+ if pools.size > 0
6
+ pools.each do |k,v|
7
+ print v.pretty_print
8
+ end
9
+ else
10
+ prev = "\t"
11
+ clouds.each do |name, cl|
12
+ puts cl.pretty_name(prev*2, cl)
13
+ puts cl.pretty_options(prev*2, cl) #cl.pretty_print("#{prev}\t")
14
+ end
15
+ end
16
+
17
+ puts ""
18
+ pools.size
19
+ end
20
+
21
+ def available_bases
22
+ puts Remote.available_bases
23
+ end
24
+
25
+ def header(str="")
26
+ "*** #{str}"
27
+ end
28
+
29
+ def subheader(str="")
30
+ "****** #{str}"
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,64 @@
1
+ require 'optparse'
2
+ require 'rdoc/usage'
3
+ require 'ostruct'
4
+ require 'date'
5
+
6
+ module PoolParty
7
+ class Optioner
8
+ include Configurable
9
+ include MethodMissingSugar
10
+
11
+ def initialize(args=[], opts={}, &block)
12
+ @arguments = args
13
+ @parse_options = opts[:parse_options] ? opts[:parse_options] : true
14
+
15
+ set_default_options
16
+ parse_options(&block) if @parse_options
17
+ self
18
+ end
19
+
20
+ def parent
21
+ self
22
+ end
23
+
24
+ def set_default_options
25
+ @options = {}
26
+ @options[:verbose] = false
27
+ @options[:quiet] = false
28
+ @options[:version] = PoolParty::VERSION::STRING
29
+ end
30
+
31
+ def parse_options(&blk)
32
+ opts = OptionParser.new
33
+ opts.banner = "Usage: pool [command] [options]"
34
+
35
+ opts.separator ""
36
+ opts.separator "Options:"
37
+
38
+ opts.on('-V', '--version', 'Display the version') { output_version ; exit 0 }
39
+ opts.on('-v', '--verbose', 'Be verbose') { @options[:verbose] = true }
40
+ opts.on('-s [file]', '--spec-file [file]', 'Set the spec file') { |file| self.spec file }
41
+ opts.on('-t', '--test', 'Testing mode') { self.testing "true" }
42
+
43
+ blk.call(opts, self) if blk
44
+
45
+ opts.on_tail("-h", "--help", "Show this message") do
46
+ puts opts
47
+ exit
48
+ end
49
+
50
+ opts.parse!(@arguments)
51
+
52
+ process_options
53
+ output_options if verbose
54
+ end
55
+ def process_options
56
+ @options[:verbose] = false if @options[:quiet]
57
+ end
58
+
59
+ def output_version
60
+ puts version
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,250 @@
1
+ =begin rdoc
2
+ The Provisioner is responsible for provisioning REMOTE servers
3
+ This class only comes in to play when calling the setup commands on
4
+ the development machine
5
+ =end
6
+ module PoolParty
7
+ module Provisioner
8
+
9
+ # Provision master
10
+ # Convenience method to clean
11
+ def self.provision_master(cloud, testing=false)
12
+ Provisioner::Master.new(cloud).process_install!(testing)
13
+ end
14
+
15
+ def self.configure_master(cloud, testing=false)
16
+ Provisioner::Master.new(cloud).process_configure!(testing)
17
+ end
18
+
19
+ def self.provision_slaves(cloud, testing=false)
20
+ cloud.nonmaster_nonterminated_instances.each do |sl|
21
+ provision_slave(sl, cloud, testing)
22
+ end
23
+ end
24
+
25
+ def self.configure_slaves(cloud, testing=false)
26
+ cloud.nonmaster_nonterminated_instances.each do |sl|
27
+ configure_slave(sl, cloud, testing)
28
+ end
29
+ end
30
+
31
+ def self.provision_slave(instance, cloud, testing=false)
32
+ Provisioner::Slave.new(instance, cloud).process_install!(testing)
33
+ end
34
+
35
+ def self.configure_slave(instance, cloud, testing=false)
36
+ Provisioner::Slave.new(instance, cloud).process_configure!(testing)
37
+ end
38
+
39
+ class ProvisionerBase
40
+
41
+ include Configurable
42
+ include CloudResourcer
43
+
44
+ def initialize(instance,cloud=self, os=:ubuntu)
45
+ @instance = instance
46
+ @cloud = cloud
47
+
48
+ options(cloud.options) if cloud && cloud.respond_to?(:options)
49
+ set_vars_from_options(instance.options) unless instance.nil? || instance.options.empty?
50
+ options(instance.options) if instance.respond_to?(:options)
51
+
52
+ @os = os.to_s.downcase.to_sym
53
+ loaded
54
+ end
55
+ # Callback after initialized
56
+ def loaded
57
+ end
58
+ # This is the actual runner for the installation
59
+ def install
60
+ valid? ? install_string : error
61
+ end
62
+ def write_install_file
63
+ error unless valid?
64
+ ::FileUtils.mkdir_p Base.storage_directory unless ::File.exists?(Base.storage_directory)
65
+ provisioner_file = ::File.join(Base.storage_directory, "install_#{name}.sh")
66
+ ::File.open(provisioner_file, "w+") {|f| f << install }
67
+ end
68
+ def process_install!(testing=false)
69
+ error unless valid?
70
+ write_install_file
71
+ setup_runner(@cloud)
72
+
73
+ unless testing
74
+ puts "Logging on to #{@instance.ip}"
75
+ @cloud.rsync_storage_files_to(@instance)
76
+
77
+ cmd = "cd #{Base.remote_storage_path}/#{Base.tmp_path} && chmod +x install_#{name}.sh && /bin/sh install_#{name}.sh && rm -rf *"
78
+ hide_output do
79
+ @cloud.run_command_on(cmd, @instance)
80
+ end
81
+ end
82
+ end
83
+ def configure
84
+ valid? ? configure_string : error
85
+ end
86
+ def write_configure_file
87
+ error unless valid?
88
+ provisioner_file = ::File.join(Base.storage_directory, "configure_#{name}.sh")
89
+ ::File.open(provisioner_file, "w+") {|f| f << configure }
90
+ end
91
+ def process_configure!(testing=false)
92
+ error unless valid?
93
+ write_configure_file
94
+ setup_runner(@cloud)
95
+
96
+ unless testing
97
+ @cloud.rsync_storage_files_to(@instance)
98
+
99
+ cmd = "cd #{Base.remote_storage_path}/#{Base.tmp_path} && chmod +x configure_#{name}.sh && /bin/sh configure_#{name}.sh && rm -rf *"
100
+ @cloud.run_command_on(cmd, @instance)
101
+ end
102
+ end
103
+ def setup_runner(cloud)
104
+ cloud.prepare_to_configuration
105
+ cloud.build_and_store_new_config_file
106
+ end
107
+ def valid?
108
+ true
109
+ end
110
+ def error
111
+ "Error in installation"
112
+ end
113
+ # Gather all the tasks into one string
114
+ def install_string
115
+ (default_install_tasks).each do |task|
116
+ case task.class
117
+ when String
118
+ task
119
+ when Method
120
+ self.send(task.to_sym)
121
+ end
122
+ end.nice_runnable
123
+ end
124
+ def configure_string
125
+ (default_configure_tasks).each do |task|
126
+ case task.class
127
+ when String
128
+ task
129
+ when Method
130
+ self.send(task.to_sym)
131
+ end
132
+ end.nice_runnable
133
+ end
134
+ # Tasks with default tasks
135
+ # These are run on all the provisioners, master or slave
136
+ def default_install_tasks
137
+ [
138
+ upgrade_system,
139
+ install_puppet_master,
140
+ custom_install_tasks
141
+ ] << install_tasks
142
+ end
143
+ # Tasks with default configuration tasks
144
+ # This is run on the provisioner, regardless
145
+ def default_configure_tasks
146
+ [
147
+ custom_configure_tasks
148
+ ] << configure_tasks
149
+ end
150
+ # Build a list of the tasks to run on the instance
151
+ def install_tasks(a=[])
152
+ @install_task ||= a
153
+ end
154
+ def configure_tasks(a=[])
155
+ @configure_tasks ||= a
156
+ end
157
+ # Custom installation tasks
158
+ # Allow the remoter bases to attach their own tasks on the
159
+ # installation process
160
+ def custom_install_tasks
161
+ @cloud.custom_install_tasks_for(@instance) || []
162
+ end
163
+ # Custom configure tasks
164
+ # Allows the remoter bases to attach their own
165
+ # custom configuration tasks to the configuration process
166
+ def custom_configure_tasks
167
+ @cloud.custom_configure_tasks_for(@instance) || []
168
+ end
169
+
170
+ # Get the packages associated with each os
171
+ def puppet_packages
172
+ case @os
173
+ when :fedora
174
+ "puppet-server puppet factor"
175
+ else
176
+ "puppet puppetmaster"
177
+ end
178
+ end
179
+ # Package installers for general *nix operating systems
180
+ def self.installers
181
+ @installers ||= {
182
+ :ubuntu => "apt-get install -y",
183
+ :fedora => "yum install",
184
+ :gentoo => "emerge"
185
+ }
186
+ end
187
+ # Convenience method to grab the installer
188
+ def installer_for(names=[])
189
+ packages = names.is_a?(Array) ? names.join(" ") : names
190
+ "#{self.class.installers[@os]} #{packages}"
191
+ end
192
+
193
+ # Install from the class-level
194
+ def self.install(instance, cl=self)
195
+ new(instance, cl).install
196
+ end
197
+
198
+ def self.configure(instance, cl=self)
199
+ new(instance, cl).configure
200
+ end
201
+
202
+ # Template directory from the provisioner base
203
+ def template_directory
204
+ File.join(File.dirname(__FILE__), "..", "templates")
205
+ end
206
+
207
+ def create_local_node
208
+ str = <<-EOS
209
+ node default {
210
+ include poolparty
211
+ }
212
+ EOS
213
+ @cloud.list_of_running_instances.each do |ri|
214
+ str << <<-EOS
215
+ node "#{ri.name}" {}
216
+ EOS
217
+ end
218
+ "echo '#{str}' > /etc/puppet/manifests/nodes/nodes.pp"
219
+ end
220
+
221
+ def upgrade_system
222
+ case @os
223
+ when :ubuntu
224
+ "
225
+ touch /etc/apt/sources.list
226
+ echo 'deb http://mirrors.kernel.org/ubuntu hardy main universe' >> /etc/apt/sources.list
227
+ apt-get update --fix-missing -y
228
+ apt-get upgrade -y
229
+ "
230
+ else
231
+ "# No system upgrade needed"
232
+ end
233
+ end
234
+
235
+ def install_puppet_master
236
+ "#{installer_for( puppet_packages )}"
237
+ end
238
+
239
+ def create_poolparty_manifest
240
+ <<-EOS
241
+ mv #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes
242
+ EOS
243
+ end
244
+ end
245
+ end
246
+ end
247
+ ## Load the provisioners
248
+ Dir[File.dirname(__FILE__) + "/provisioners/*.rb"].each do |file|
249
+ require file
250
+ end