poolparty 0.2.6 → 0.2.18

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 (208) hide show
  1. data/Manifest.txt +123 -4
  2. data/PostInstall.txt +2 -1
  3. data/bin/cloud +16 -7
  4. data/bin/cloud-provision +9 -5
  5. data/bin/cloud-run +19 -0
  6. data/bin/cloud-ssh +2 -7
  7. data/bin/cloud-start +2 -1
  8. data/bin/pool +3 -3
  9. data/bin/server-build-messenger +20 -0
  10. data/bin/server-fire-cmd +14 -0
  11. data/bin/server-get-load +29 -0
  12. data/bin/server-list-active +25 -0
  13. data/bin/server-list-responding +24 -0
  14. data/bin/server-rerun +24 -0
  15. data/bin/server-start-master +27 -0
  16. data/bin/server-start-node +33 -0
  17. data/config/requirements.rb +1 -1
  18. data/erl_crash.dump +8409 -0
  19. data/lib/erlang/messenger/Emakefile +1 -0
  20. data/lib/erlang/messenger/Makefile +15 -0
  21. data/lib/erlang/messenger/README +5 -0
  22. data/lib/erlang/messenger/Rakefile +60 -0
  23. data/lib/erlang/messenger/control +11 -0
  24. data/lib/erlang/messenger/ebin/master.app +19 -0
  25. data/lib/erlang/messenger/ebin/master_app.beam +0 -0
  26. data/lib/erlang/messenger/ebin/node.app +19 -0
  27. data/lib/erlang/messenger/ebin/node_app.beam +0 -0
  28. data/lib/erlang/messenger/ebin/packager.app +19 -0
  29. data/lib/erlang/messenger/ebin/pm_client.beam +0 -0
  30. data/lib/erlang/messenger/ebin/pm_cluster.beam +0 -0
  31. data/lib/erlang/messenger/ebin/pm_event_handler.beam +0 -0
  32. data/lib/erlang/messenger/ebin/pm_master.beam +0 -0
  33. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -0
  34. data/lib/erlang/messenger/ebin/pm_master_supervisor.beam +0 -0
  35. data/lib/erlang/messenger/ebin/pm_node.beam +0 -0
  36. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -0
  37. data/lib/erlang/messenger/ebin/pm_node_supervisor.beam +0 -0
  38. data/lib/erlang/messenger/ebin/pm_packager.beam +0 -0
  39. data/lib/erlang/messenger/ebin/utils.beam +0 -0
  40. data/lib/erlang/messenger/lib/eunit/AUTHORS +2 -0
  41. data/lib/erlang/messenger/lib/eunit/CHANGELOG +14 -0
  42. data/lib/erlang/messenger/lib/eunit/COPYING +504 -0
  43. data/lib/erlang/messenger/lib/eunit/Makefile +28 -0
  44. data/lib/erlang/messenger/lib/eunit/NOTES +276 -0
  45. data/lib/erlang/messenger/lib/eunit/README +3 -0
  46. data/lib/erlang/messenger/lib/eunit/doc/edoc-info +3 -0
  47. data/lib/erlang/messenger/lib/eunit/doc/erlang.png +0 -0
  48. data/lib/erlang/messenger/lib/eunit/doc/eunit.html +172 -0
  49. data/lib/erlang/messenger/lib/eunit/doc/index.html +17 -0
  50. data/lib/erlang/messenger/lib/eunit/doc/modules-frame.html +12 -0
  51. data/lib/erlang/messenger/lib/eunit/doc/overview-summary.html +984 -0
  52. data/lib/erlang/messenger/lib/eunit/doc/overview.edoc +980 -0
  53. data/lib/erlang/messenger/lib/eunit/doc/packages-frame.html +11 -0
  54. data/lib/erlang/messenger/lib/eunit/doc/stylesheet.css +55 -0
  55. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  56. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  57. data/lib/erlang/messenger/lib/eunit/ebin/eunit.app +21 -0
  58. data/lib/erlang/messenger/lib/eunit/ebin/eunit.appup +1 -0
  59. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  60. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  61. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  62. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  63. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  64. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  65. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  66. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  67. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  68. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  69. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  70. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  71. data/lib/erlang/messenger/lib/eunit/examples/eunit_examples.erl +339 -0
  72. data/lib/erlang/messenger/lib/eunit/examples/fib.erl +19 -0
  73. data/lib/erlang/messenger/lib/eunit/examples/tests.txt +1 -0
  74. data/lib/erlang/messenger/lib/eunit/include/eunit.hrl +313 -0
  75. data/lib/erlang/messenger/lib/eunit/src/Makefile +46 -0
  76. data/lib/erlang/messenger/lib/eunit/src/autoload.erl +388 -0
  77. data/lib/erlang/messenger/lib/eunit/src/code_monitor.erl +243 -0
  78. data/lib/erlang/messenger/lib/eunit/src/eunit.app.src +21 -0
  79. data/lib/erlang/messenger/lib/eunit/src/eunit.appup.src +1 -0
  80. data/lib/erlang/messenger/lib/eunit/src/eunit.erl +196 -0
  81. data/lib/erlang/messenger/lib/eunit/src/eunit_autoexport.erl +102 -0
  82. data/lib/erlang/messenger/lib/eunit/src/eunit_data.erl +798 -0
  83. data/lib/erlang/messenger/lib/eunit/src/eunit_internal.hrl +48 -0
  84. data/lib/erlang/messenger/lib/eunit/src/eunit_lib.erl +682 -0
  85. data/lib/erlang/messenger/lib/eunit/src/eunit_proc.erl +552 -0
  86. data/lib/erlang/messenger/lib/eunit/src/eunit_serial.erl +157 -0
  87. data/lib/erlang/messenger/lib/eunit/src/eunit_server.erl +340 -0
  88. data/lib/erlang/messenger/lib/eunit/src/eunit_striptests.erl +64 -0
  89. data/lib/erlang/messenger/lib/eunit/src/eunit_test.erl +334 -0
  90. data/lib/erlang/messenger/lib/eunit/src/eunit_tests.erl +45 -0
  91. data/lib/erlang/messenger/lib/eunit/src/eunit_tty.erl +272 -0
  92. data/lib/erlang/messenger/lib/eunit/src/file_monitor.erl +409 -0
  93. data/lib/erlang/messenger/lib/eunit/sys.config +9 -0
  94. data/lib/erlang/messenger/lib/eunit/vsn.mk +1 -0
  95. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  96. data/lib/erlang/messenger/pm_master_rel-0.1.script +242 -0
  97. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  98. data/lib/erlang/messenger/pm_node_rel-0.1.script +242 -0
  99. data/lib/erlang/messenger/src/master_app.erl +39 -0
  100. data/lib/erlang/messenger/src/node_app.erl +39 -0
  101. data/lib/erlang/messenger/src/pm_client.erl +19 -0
  102. data/lib/erlang/messenger/src/pm_cluster.erl +57 -0
  103. data/lib/erlang/messenger/src/pm_event_handler.erl +21 -0
  104. data/lib/erlang/messenger/src/pm_master.erl +118 -0
  105. data/lib/erlang/messenger/src/pm_master_supervisor.erl +40 -0
  106. data/lib/erlang/messenger/src/pm_node.erl +124 -0
  107. data/lib/erlang/messenger/src/pm_node_supervisor.erl +40 -0
  108. data/lib/erlang/messenger/src/pm_packager.erl +73 -0
  109. data/lib/erlang/messenger/src/utils.erl +38 -0
  110. data/lib/poolparty/base_packages/haproxy.rb +9 -2
  111. data/lib/poolparty/base_packages/heartbeat.rb +40 -28
  112. data/lib/poolparty/base_packages/poolparty.rb +39 -16
  113. data/lib/poolparty/base_packages/ruby.rb +2 -3
  114. data/lib/poolparty/config/allowed_commands.yml +1 -0
  115. data/lib/poolparty/core/array.rb +5 -2
  116. data/lib/poolparty/core/hash.rb +16 -2
  117. data/lib/poolparty/core/string.rb +9 -2
  118. data/lib/poolparty/core/symbol.rb +2 -2
  119. data/lib/poolparty/dependency_resolutions/base.rb +12 -0
  120. data/lib/poolparty/dependency_resolutions/puppet.rb +49 -0
  121. data/lib/poolparty/exceptions/UnacceptableCommand.rb +5 -0
  122. data/lib/poolparty/helpers/console.rb +3 -2
  123. data/lib/poolparty/helpers/display.rb +3 -3
  124. data/lib/poolparty/helpers/messenger.rb +29 -0
  125. data/lib/poolparty/helpers/optioner.rb +6 -2
  126. data/lib/poolparty/helpers/provisioner_base.rb +18 -11
  127. data/lib/poolparty/helpers/provisioners/master.rb +24 -22
  128. data/lib/poolparty/helpers/provisioners/slave.rb +8 -4
  129. data/lib/poolparty/modules/definable_resource.rb +1 -0
  130. data/lib/poolparty/modules/file_writer.rb +11 -10
  131. data/lib/poolparty/modules/method_missing_sugar.rb +1 -1
  132. data/lib/poolparty/modules/pretty_printer.rb +11 -11
  133. data/lib/poolparty/modules/resourcing_dsl.rb +61 -0
  134. data/lib/poolparty/monitors/base_monitor.rb +17 -3
  135. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +15 -0
  136. data/lib/poolparty/monitors/monitors/memory_monitor.rb +23 -0
  137. data/lib/poolparty/net/remote_instance.rb +6 -1
  138. data/lib/poolparty/net/remoter.rb +23 -5
  139. data/lib/poolparty/net/remoter_base.rb +5 -1
  140. data/lib/poolparty/plugins/git.rb +22 -24
  141. data/lib/poolparty/pool/base.rb +22 -6
  142. data/lib/poolparty/pool/cloud.rb +28 -4
  143. data/lib/poolparty/pool/custom_resource.rb +6 -6
  144. data/lib/poolparty/pool/loggable.rb +3 -0
  145. data/lib/poolparty/pool/pool.rb +1 -1
  146. data/lib/poolparty/pool/resource.rb +58 -94
  147. data/lib/poolparty/pool/resources/class_package.rb +6 -6
  148. data/lib/poolparty/pool/resources/conditional.rb +5 -1
  149. data/lib/poolparty/pool/resources/exec.rb +6 -2
  150. data/lib/poolparty/pool/resources/gem.rb +22 -8
  151. data/lib/poolparty/pool/resources/remote_file.rb +5 -1
  152. data/lib/poolparty/pool/resources/symlink.rb +25 -0
  153. data/lib/poolparty/pool/resources/variable.rb +8 -7
  154. data/lib/poolparty/pool/tmp/.ppkeys +3 -0
  155. data/lib/poolparty/pool/tmp/happydayz +1 -0
  156. data/lib/poolparty/pool/tmp/install_master.sh +33 -0
  157. data/lib/poolparty/pool/tmp/pool.spec +11 -0
  158. data/lib/poolparty/pool/tmp/poolparty.pp +600 -0
  159. data/lib/poolparty/pool/tmp/tc-instances.list +1 -0
  160. data/lib/poolparty/templates/cib.xml +54 -0
  161. data/lib/poolparty/templates/ha.cf +12 -3
  162. data/lib/poolparty/templates/haproxy.conf +3 -3
  163. data/lib/poolparty/templates/haresources +3 -0
  164. data/lib/poolparty/templates/poolparty.monitor +14 -0
  165. data/lib/poolparty/templates/puppet.conf +3 -4
  166. data/lib/poolparty/version.rb +1 -1
  167. data/lib/poolparty.rb +9 -6
  168. data/poolparty.gemspec +7 -6
  169. data/setup.rb +3 -3
  170. data/spec/poolparty/bin/console_spec.rb +1 -1
  171. data/spec/poolparty/core/array_spec.rb +5 -0
  172. data/spec/poolparty/core/hash_spec.rb +19 -1
  173. data/spec/poolparty/core/string_spec.rb +13 -0
  174. data/spec/poolparty/dependency_resolutions/base_spec.rb +11 -0
  175. data/spec/poolparty/helpers/messenger_spec.rb +14 -0
  176. data/spec/poolparty/helpers/optioner_spec.rb +2 -1
  177. data/spec/poolparty/helpers/provisioner_base_spec.rb +1 -1
  178. data/spec/poolparty/helpers/provisioners/master_spec.rb +2 -2
  179. data/spec/poolparty/helpers/provisioners/slave_spec.rb +3 -3
  180. data/spec/poolparty/modules/file_writer_spec.rb +9 -0
  181. data/spec/poolparty/monitors/base_monitor_spec.rb +19 -0
  182. data/spec/poolparty/monitors/monitors/cpu_monitor_spec.rb +17 -0
  183. data/spec/poolparty/net/remote_instance_spec.rb +6 -1
  184. data/spec/poolparty/net/remote_spec.rb +51 -42
  185. data/spec/poolparty/net/remoter_spec.rb +2 -1
  186. data/spec/poolparty/plugins/git_spec.rb +2 -2
  187. data/spec/poolparty/pool/base_spec.rb +20 -2
  188. data/spec/poolparty/pool/cloud_spec.rb +30 -1
  189. data/spec/poolparty/pool/custom_resource_spec.rb +2 -2
  190. data/spec/poolparty/pool/plugin_spec.rb +4 -4
  191. data/spec/poolparty/pool/pool_spec.rb +1 -1
  192. data/spec/poolparty/pool/resource_spec.rb +66 -0
  193. data/spec/poolparty/pool/resources/gem_spec.rb +29 -3
  194. data/spec/poolparty/pool/resources/symlink_spec.rb +22 -0
  195. data/spec/poolparty/pool/resources/variable_spec.rb +4 -0
  196. data/spec/poolparty/spec_helper.rb +5 -0
  197. data/tasks/cloud.rake +0 -54
  198. data/tasks/development.rake +0 -12
  199. data/tasks/ec2.rake +1 -16
  200. data/tasks/instance.rake +0 -61
  201. data/test_manifest.pp +286 -166
  202. data/website/index.html +5 -5
  203. data/website/index.txt +3 -3
  204. metadata +137 -8
  205. data/bin/pool-start-monitor +0 -1
  206. data/lib/erlang/eb_server.erl +0 -27
  207. data/lib/poolparty/plugins/gem_package.rb +0 -17
  208. data/spec/poolparty/modules/tmp/willy/nilly.rb +0 -1
@@ -0,0 +1,29 @@
1
+ module PoolParty
2
+ module Messenger
3
+
4
+ # TODO: Fix cookie setting
5
+ def self.erl_command(hostname, extra="")
6
+ command_line_opts = "-pa #{append_dir}/ebin -sname #{hostname} -setcookie poolparty"
7
+
8
+ "erl #{command_line_opts} #{extra}"
9
+ end
10
+
11
+ def self.append_dir
12
+ ::File.join( ::File.dirname(__FILE__), "..", "..", "erlang/messenger" )
13
+ end
14
+
15
+ def messenger_send!(cmd="", testing=false)
16
+ cmd = Messenger.erl_command("client", "-rsh ssh -noshell -run pm_client #{cmd} -s erlang halt")
17
+ testing ? cmd : Kernel.system(cmd)
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+ module PoolParty
24
+ module Cloud
25
+ class Cloud
26
+ include PoolParty::Messenger
27
+ end
28
+ end
29
+ end
@@ -9,7 +9,7 @@ module PoolParty
9
9
  include MethodMissingSugar
10
10
 
11
11
  def initialize(args=[], opts={}, &block)
12
- @arguments = args
12
+ @arguments = parse_args(args)
13
13
  @parse_options = opts[:parse_options] ? opts[:parse_options] : true
14
14
 
15
15
  set_default_options
@@ -17,6 +17,10 @@ module PoolParty
17
17
  self
18
18
  end
19
19
 
20
+ def parse_args(argv, safe=[])
21
+ argv
22
+ end
23
+
20
24
  def parent
21
25
  self
22
26
  end
@@ -47,7 +51,7 @@ module PoolParty
47
51
  exit
48
52
  end
49
53
 
50
- opts.parse!(@arguments)
54
+ opts.parse(@arguments.dup)
51
55
 
52
56
  process_options
53
57
  output_options if verbose
@@ -17,7 +17,7 @@ module PoolParty
17
17
  end
18
18
 
19
19
  def self.provision_slaves(cloud, testing=false)
20
- cloud.nonmaster_nonterminated_instances.each do |sl|
20
+ cloud.nonmaster_nonterminated_instances.each do |sl|
21
21
  provision_slave(sl, cloud, testing)
22
22
  end
23
23
  end
@@ -53,7 +53,7 @@ module PoolParty
53
53
  loaded
54
54
  end
55
55
  # Callback after initialized
56
- def loaded
56
+ def loaded(opts={}, parent=self)
57
57
  end
58
58
  # This is the actual runner for the installation
59
59
  def install
@@ -71,10 +71,11 @@ module PoolParty
71
71
  setup_runner(@cloud)
72
72
 
73
73
  unless testing
74
- puts "Logging on to #{@instance.ip}"
74
+ puts "Logging on to #{@instance.ip}" if verbose
75
+ @cloud.prepare_reconfiguration
75
76
  @cloud.rsync_storage_files_to(@instance)
76
77
 
77
- cmd = "cd #{Base.remote_storage_path}/#{Base.tmp_path} && chmod +x install_#{name}.sh && /bin/sh install_#{name}.sh && rm -rf *"
78
+ cmd = "cd #{Base.remote_storage_path} && chmod +x install_#{name}.sh && /bin/sh install_#{name}.sh && rm install_#{name}.sh"
78
79
  hide_output do
79
80
  @cloud.run_command_on(cmd, @instance)
80
81
  end
@@ -94,9 +95,10 @@ module PoolParty
94
95
  setup_runner(@cloud)
95
96
 
96
97
  unless testing
98
+ puts "Logging on to #{@instance.ip}" if verbose
97
99
  @cloud.rsync_storage_files_to(@instance)
98
100
 
99
- cmd = "cd #{Base.remote_storage_path}/#{Base.tmp_path} && chmod +x configure_#{name}.sh && /bin/sh configure_#{name}.sh && rm -rf *"
101
+ cmd = "cd #{Base.remote_storage_path} && chmod +x configure_#{name}.sh && /bin/sh configure_#{name}.sh && rm configure_#{name}.sh"
100
102
  @cloud.run_command_on(cmd, @instance)
101
103
  end
102
104
  end
@@ -136,7 +138,8 @@ module PoolParty
136
138
  def default_install_tasks
137
139
  [
138
140
  upgrade_system,
139
- install_puppet_master,
141
+ fix_rubygems,
142
+ install_puppet,
140
143
  custom_install_tasks
141
144
  ] << install_tasks
142
145
  end
@@ -179,7 +182,7 @@ module PoolParty
179
182
  # Package installers for general *nix operating systems
180
183
  def self.installers
181
184
  @installers ||= {
182
- :ubuntu => "apt-get install -y",
185
+ :ubuntu => "aptitude install -y",
183
186
  :fedora => "yum install",
184
187
  :gentoo => "emerge"
185
188
  }
@@ -203,6 +206,10 @@ module PoolParty
203
206
  def template_directory
204
207
  File.join(File.dirname(__FILE__), "..", "templates")
205
208
  end
209
+
210
+ def fix_rubygems
211
+ "echo '#{open(::File.join(template_directory, "gem")).read}' > /usr/bin/gem"
212
+ end
206
213
 
207
214
  def create_local_node
208
215
  str = <<-EOS
@@ -224,21 +231,21 @@ module PoolParty
224
231
  "
225
232
  touch /etc/apt/sources.list
226
233
  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
234
+ aptitude update -y
235
+ aptitude autoclean
229
236
  "
230
237
  else
231
238
  "# No system upgrade needed"
232
239
  end
233
240
  end
234
241
 
235
- def install_puppet_master
242
+ def install_puppet
236
243
  "#{installer_for( puppet_packages )}"
237
244
  end
238
245
 
239
246
  def create_poolparty_manifest
240
247
  <<-EOS
241
- mv #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes
248
+ cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes
242
249
  EOS
243
250
  end
244
251
  end
@@ -29,7 +29,7 @@ module PoolParty
29
29
 
30
30
  def configure_tasks
31
31
  [
32
- start_puppetmaster,
32
+ # start_puppetmaster,
33
33
  create_local_node,
34
34
  move_templates,
35
35
  create_poolparty_manifest,
@@ -37,14 +37,7 @@ module PoolParty
37
37
  ]
38
38
  end
39
39
 
40
- # def install_haproxy
41
- # "#{installer_for( "haproxy" )}"
42
- # end
43
- #
44
- # def install_heartbeat
45
- # "#{installer_for( "heartbeat-2" )}"
46
- # end
47
-
40
+ # If the master is not in the hosts file, then add it to the hosts file
48
41
  def create_local_hosts_entry
49
42
  <<-EOS
50
43
  if [ -z \"$(grep -v '#' /etc/hosts | grep 'master')" ]; then echo '#{@master_ip} puppet master' >> /etc/hosts; fi
@@ -59,7 +52,7 @@ echo "import 'nodes/*.pp'" > /etc/puppet/manifests/site.pp
59
52
  echo "import 'classes/*.pp'" >> /etc/puppet/manifests/site.pp
60
53
  mkdir -p /etc/puppet/manifests/nodes
61
54
  mkdir -p /etc/puppet/manifests/classes
62
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
55
+ cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
63
56
  EOS
64
57
  end
65
58
 
@@ -73,7 +66,7 @@ echo "#{open(File.join(template_directory, "puppet.conf")).read}" > /etc/puppet/
73
66
  <<-EOS
74
67
  echo "
75
68
  [files]
76
- path #{Base.remote_storage_path}/#{Base.tmp_path}
69
+ path #{Base.remote_storage_path}
77
70
  allow *" > /etc/puppet/fileserver.conf
78
71
  mkdir -p /var/poolparty/facts
79
72
  mkdir -p /var/poolparty/files
@@ -104,31 +97,40 @@ node "#{ri.name}" inherits default {}
104
97
  def move_templates
105
98
  <<-EOS
106
99
  mkdir -p #{Base.template_path}
107
- mv #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
100
+ cp #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
108
101
  EOS
109
102
  end
110
-
103
+
111
104
  def create_poolparty_manifest
112
105
  <<-EOS
113
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/poolparty.pp /etc/puppet/manifests/classes/poolparty.pp
114
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/#{Base.key_file_locations.first} "#{Base.base_config_directory}/.ppkeys"
115
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/#{Base.default_specfile_name} #{Base.base_config_directory}/#{Base.default_specfile_name}
116
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/#{@cloud.full_keypair_name} #{@cloud.remote_keypair_path}
106
+ mv #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolparty.pp
107
+ cp #{Base.remote_storage_path}/#{Base.key_file_locations.first} "#{Base.base_config_directory}/.ppkeys"
108
+ cp #{Base.remote_storage_path}/#{Base.default_specfile_name} #{Base.base_config_directory}/#{Base.default_specfile_name}
109
+ #{copy_ssh_app}
117
110
  EOS
118
111
  end
112
+
113
+ def copy_ssh_app
114
+ if @cloud.remote_keypair_path != "#{Base.remote_storage_path}/#{@cloud.full_keypair_name}"
115
+ "cp #{Base.remote_storage_path}/#{@cloud.full_keypair_name} #{@cloud.remote_keypair_path}"
116
+ end
117
+ end
119
118
 
119
+ # ps aux | grep puppetmasterd | awk '{print $2}' | xargs kill
120
+ # rm -rf /etc/puppet/ssl
121
+ # puppetmasterd --verbose
120
122
  def start_puppetmaster
121
123
  <<-EOS
122
- ps aux | grep puppetmasterd | awk '{print $2}' | xargs kill
123
- rm -rf /etc/puppet/ssl
124
- puppetmasterd
125
124
  EOS
126
125
  end
127
126
 
127
+ # puppetd --listen --fqdn #{@instance.name}
128
128
  def restart_puppetd
129
129
  <<-EOS
130
- puppetd --listen --fqdn=#{@instance.name} --server=master
131
- puppetrun --host #{@instance.name}
130
+ killall ruby
131
+ rm -rf /etc/puppet/ssl/*
132
+ puppetmasterd --verbose
133
+ . /etc/profile && #{@instance.puppet_runner_command}
132
134
  EOS
133
135
  end
134
136
  end
@@ -17,21 +17,25 @@ module PoolParty
17
17
 
18
18
  def setup_puppet
19
19
  <<-EOE
20
- puppetd --mkusers
21
20
  if [ -z "$(grep -v '#' /etc/hosts | grep 'master')" ]; then echo "#{master_ip} puppet master" >> /etc/hosts; else echo "host already set"; fi
22
- mv #{Base.remote_storage_path}/#{Base.tmp_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
21
+ cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
22
+ echo 'DAEMON_OPTS="-w 120 –fqdn #{@instance.name} –server master"' > /etc/default/puppet
23
23
  EOE
24
24
  end
25
25
 
26
26
  def setup_configs
27
- <<-EOS
27
+ <<-EOS
28
28
  echo "#{open(File.join(template_directory, "puppet.conf")).read}" > /etc/puppet/puppet.conf
29
29
  EOS
30
30
  end
31
31
 
32
+ # /etc/init.d/puppetmasterd stop
33
+ # puppetd --listen --fqdn #{@instance.name}
32
34
  def start_puppet
33
35
  <<-EOS
34
- puppetd --listen --fqdn=#{@instance.name}
36
+ ps aux | grep "puppetmasterd" | awk '{print $2}' | xargs kill
37
+ rm -rf /etc/puppet/ssl*
38
+ puppetd --test 2>&1 &
35
39
  EOS
36
40
  end
37
41
 
@@ -52,6 +52,7 @@ module PoolParty
52
52
  klass = "PoolParty::Resources::#{symc}".constantize
53
53
  klass.module_eval &block if block
54
54
  klass.send :define_method, :virtual_resource?, Proc.new{true}
55
+ klass.send :define_method, :printable?, Proc.new{false}
55
56
  klass
56
57
  end
57
58
 
@@ -1,21 +1,21 @@
1
1
  module PoolParty
2
2
  module FileWriter
3
- def copy_file_to_storage_directory(file)
3
+ def copy_file_to_storage_directory(file, preceded="")
4
4
  make_base_directory
5
- path = ::File.join( Base.storage_directory, ::File.basename(file) )
6
- FileUtils.cp file, path
5
+ path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
6
+ FileUtils.cp file, path unless file == path || ::File.exists?(path)
7
7
  end
8
8
  def copy_template_to_storage_directory(file)
9
9
  make_template_directory
10
- path = ::File.join( Base.template_directory, ::File.basename(file) )
11
- FileUtils.cp file, path
10
+ path = ::File.join( Base.tmp_path, Base.template_directory, ::File.basename(file) )
11
+ FileUtils.cp file, path unless file == path || ::File.exists?(path)
12
12
  end
13
- def write_to_file_in_storage_directory(file, str, &block)
14
- path = ::File.join( Base.storage_directory, ::File.basename(file) )
13
+ def write_to_file_in_storage_directory(file, str, preceded="", &block)
14
+ path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
15
15
  write_to_file(path, str, &block)
16
16
  end
17
- def write_to_file(file, str, &block)
18
- path = ::File.join( Base.storage_directory, ::File.basename(file) )
17
+ def write_to_file(file, str, preceded="", &block)
18
+ path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
19
19
  make_base_path( Base.storage_directory )
20
20
  ::File.open(path, "w+") do |f|
21
21
  f.print str
@@ -46,7 +46,8 @@ module PoolParty
46
46
  FileUtils.mkdir_p Base.storage_directory unless ::File.directory?(Base.storage_directory)
47
47
  end
48
48
  def make_template_directory
49
- FileUtils.mkdir_p Base.template_directory unless ::File.directory?(Base.template_directory)
49
+ path = ::File.join(Base.tmp_path, Base.template_directory)
50
+ FileUtils.mkdir_p path unless ::File.directory?(path)
50
51
  end
51
52
  def clear_base_directory
52
53
  FileUtils::rm_rf "#{Base.storage_directory}"
@@ -42,7 +42,7 @@ module PoolParty
42
42
  if options.has_key?(m)
43
43
  options[m]
44
44
  else
45
- (parent.nil? || parent.class == self.class || !parent.respond_to?(:options)) ? nil : parent.send(m, *args, &block)
45
+ (parent.nil? || parent.class == self.class || !parent.respond_to?(:options) || parent.options.has_key?(m)) ? nil : parent.send(m, *args, &block)
46
46
  end
47
47
  else
48
48
  options[m] = (args.is_a?(Array) && args.size > 1) ? args : args[0]
@@ -1,20 +1,20 @@
1
1
  module PoolParty
2
2
  module PrettyPrinter
3
3
 
4
- def pretty_print(prev="\t")
4
+ def pretty_print(pre="\t")
5
5
  returning Array.new do |out|
6
- out << pretty_name(prev, self)
7
- out << pretty_options(prev, self)
6
+ out << pretty_name(pre, self)
7
+ out << pretty_options(pre, self)
8
8
 
9
9
  if self.respond_to?(:clouds)
10
10
  clouds.each do |name, cl|
11
- out << pretty_name(prev*2, cl)
12
- out << pretty_options(prev*2, cl) #cl.pretty_print("#{prev}\t")
11
+ out << pretty_name(pre*2, cl)
12
+ out << pretty_options(pre*2, cl) #cl.pretty_print("#{pre}\t")
13
13
  end
14
14
  end
15
15
  if self.respond_to?(:plugins)
16
- out << "#{prev}\t\tPlugins"
17
- out << "#{prev}\t\t" + plugins.map {|a| a}.join("\n")
16
+ out << "#{pre}\t\tPlugins"
17
+ out << "#{pre}\t\t" + plugins.map {|a| a}.join("\n")
18
18
  end
19
19
  end.join("\n")
20
20
  end
@@ -22,17 +22,17 @@ module PoolParty
22
22
  # Gather options on the object
23
23
  # Do not print if the option is nil or empty.
24
24
  # Also, don't show the option if the option is empty or the default option on the cloud
25
- def pretty_options(prev, o)
25
+ def pretty_options(pre, o)
26
26
  return "" unless o.respond_to?(:options)
27
27
  print_options = (o.respond_to?(:parent) && o.parent && o.parent.respond_to?(:options)) ?
28
28
  (o.options.delete_if {|k,v| o.parent.options.has_key?(k) && o.parent.options[k] == o.options[k] && !o.options[k].nil? } ) :
29
29
  o.options
30
30
  print_options = print_options.map {|k,v| [k, o.send(k.to_sym).to_s] }.inject({}) { |r,e| r[e[0]] = e[1] unless o.class.default_options[e[0]] == e[1] || e[1].nil? || e[1].empty?; r }
31
- print_options.flush_out("#{prev}\t")
31
+ print_options.flush_out("#{pre}\t")
32
32
  end
33
33
 
34
- def pretty_name(prev, o)
35
- "#{prev}#{o.class.to_s.top_level_class.capitalize}: #{o.name if o.respond_to?(:name)}"
34
+ def pretty_name(pre, o)
35
+ "#{pre}#{o.class.to_s.top_level_class.capitalize}: #{o.name if o.respond_to?(:name)}"
36
36
  end
37
37
 
38
38
  end
@@ -0,0 +1,61 @@
1
+ module PoolParty
2
+ module ResourcingDsl
3
+ # Overrides for syntax
4
+ # Allows us to send require to require a resource
5
+ def require(str="")
6
+ str ? options.merge!(:require => str) : options[:require]
7
+ end
8
+ def requires(str=nil)
9
+ str ? options.append!(:require => str) : options[:require]
10
+ end
11
+ def ensures(str="running")
12
+ if %w(absent running).map {|a| self.send a.to_sym}.include?(str)
13
+ str == "absent" ? is_absent : is_present
14
+ else
15
+ options.append!(:ensure => str)
16
+ end
17
+ str
18
+ end
19
+ # Allows us to send an ensure to ensure the presence of a resource
20
+ def is_present(*args)
21
+ options.merge!(:ensure => present)
22
+ end
23
+ # Ensures that what we are sending is absent
24
+ def is_absent(*args)
25
+ options.merge!(:ensure => absent)
26
+ end
27
+ # Alias for unless
28
+ def ifnot(str="")
29
+ options.merge!(:unless => str)
30
+ end
31
+ def present
32
+ "present"
33
+ end
34
+ def absent
35
+ "absent"
36
+ end
37
+ def cancel(*args)
38
+ options[:cancelled] = args.empty? ? true : args[0]
39
+ end
40
+ def cancelled?
41
+ options[:cancelled] || false
42
+ end
43
+ # Give us a template to work with on the resource
44
+ # Make sure this template is moved to the tmp directory as well
45
+ #
46
+ # TODO: Change this method to store the template files for later
47
+ # copying to prevent unnecessary copying and tons of directories
48
+ # everywhere
49
+ def template(file, opts={})
50
+ raise TemplateNotFound.new("no template given") unless file
51
+ raise TemplateNotFound.new("template cannot be found #{file}") unless ::File.file?(file)
52
+ unless opts[:just_copy]
53
+ options.merge!({:content => "template(\"#{::File.basename(file)}\")"})
54
+ options.delete(:source) if options.has_key?(:source)
55
+ copy_template_to_storage_directory(file)
56
+ else
57
+ copy_file_to_storage_directory(file)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -6,11 +6,25 @@
6
6
  module PoolParty
7
7
  module Monitors
8
8
 
9
+ def self.register_monitor(*args)
10
+ args.each do |arg|
11
+ (available_monitors << "#{arg}".downcase.to_sym)
12
+ end
13
+ end
14
+
15
+ def self.available_monitors
16
+ $available_monitors ||= []
17
+ end
18
+
9
19
  class BaseMonitor
10
20
 
11
-
12
-
21
+ def self.run
22
+ new.run
23
+ end
24
+
13
25
  end
14
26
 
15
27
  end
16
- end
28
+ end
29
+
30
+ Dir["#{File.dirname(__FILE__)}/monitors/*.rb"].each {|f| require f}
@@ -0,0 +1,15 @@
1
+ module PoolParty
2
+ module Monitors
3
+
4
+ class CpuMonitor < BaseMonitor
5
+
6
+ def run
7
+ str = %x[uptime]
8
+ str.split(/\s+/)[-2].to_f rescue 0.0
9
+ end
10
+
11
+ end
12
+
13
+ register_monitor :cpu
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module PoolParty
2
+ module Monitors
3
+
4
+ class MemoryMonitor < BaseMonitor
5
+
6
+ def run
7
+ str = %x[free -m | grep -i mem]
8
+ begin
9
+ total_memory = str.split[1].to_f
10
+ used_memory = str.split[2].to_f
11
+
12
+ used_memory / total_memory
13
+ rescue Exception => e
14
+ 0.0
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ register_monitor :memory
22
+ end
23
+ end
@@ -61,7 +61,12 @@ module PoolParty
61
61
  # Printing. This is how we extract the instances into the listing on the
62
62
  # local side into the local listing file
63
63
  def to_s
64
- "#{name} #{ip}"
64
+ "#{name}\t#{ip}"
65
+ end
66
+
67
+ # Commands for the servers
68
+ def puppet_runner_command
69
+ ". /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1"
65
70
  end
66
71
  end
67
72
 
@@ -9,7 +9,7 @@ module PoolParty
9
9
  module Remoter
10
10
  def rsync_storage_files_to_command(remote_instance)
11
11
  if remote_instance
12
- "#{rsync_command} #{Base.storage_directory} #{remote_instance.ip}:#{Base.remote_storage_path}"
12
+ "#{rsync_command} #{Base.storage_directory}/ #{remote_instance.ip}:#{Base.remote_storage_path}"
13
13
  end
14
14
  end
15
15
  def run_command_on_command(cmd="ls -l", remote_instance=nil)
@@ -152,7 +152,7 @@ module PoolParty
152
152
  request_launch_new_instances(1) if list_of_pending_instances.size.zero? && can_start_a_new_instance? && !is_master_running?
153
153
 
154
154
  when_no_pending_instances do
155
- wait "10.seconds"
155
+ wait "20.seconds"
156
156
  hide_output { Provisioner.provision_master(self, testing) }
157
157
  end
158
158
 
@@ -180,8 +180,10 @@ module PoolParty
180
180
 
181
181
  reset!
182
182
  when_no_pending_instances do
183
- @ri = list_of_running_instances.last
184
- PoolParty::Provisioner.provision_slave(@ri, self, !force)
183
+ wait "20.seconds" # Give some time for ssh to startup
184
+ PoolParty::Provisioner.provision_slaves(self)
185
+ PoolParty::Provisioner.configure_master(self, testing)
186
+ # prepare_reconfiguration
185
187
  end
186
188
  end
187
189
  end
@@ -195,7 +197,7 @@ module PoolParty
195
197
  end
196
198
 
197
199
  # Rsync command to the instance
198
- def rsync_storage_files_to(instance=nil)
200
+ def rsync_storage_files_to(instance=nil)
199
201
  hide_output do
200
202
  Kernel.system "#{rsync_storage_files_to_command(instance)}" if instance
201
203
  end
@@ -215,6 +217,22 @@ module PoolParty
215
217
  def ssh_into_instance_number(num=0)
216
218
  ssh_into( get_instance_by_number( num || 0 ) )
217
219
  end
220
+
221
+ # Run command on the instance by the number
222
+ def run_command_on_instance_number(cmd="ls -l", num=0)
223
+ run_command_on(cmd, get_instance_by_number( num || 0 ) )
224
+ end
225
+
226
+ # Prepare reconfiguration on the master
227
+ # TODO: Fix the killall
228
+ # TODO: Curious about the puppet/ssl problems...
229
+ def prepare_reconfiguration
230
+ unless @prepared
231
+ cmd = "killall ruby && rm -rf /etc/puppet/ssl/*; puppetmasterd --verbose; puppetd --test --no-daemonize 2>&1 &"
232
+ run_command_on(cmd, master)
233
+ @prepared = true
234
+ end
235
+ end
218
236
 
219
237
  def self.included(receiver)
220
238
  receiver.extend self
@@ -8,7 +8,7 @@ module PoolParty
8
8
 
9
9
  def remote_bases
10
10
  $remote_bases ||= []
11
- end
11
+ end
12
12
 
13
13
  module Remote
14
14
  # This class is the base class for all remote types
@@ -61,6 +61,10 @@ module PoolParty
61
61
  def list_of_nonterminated_instances(list = remote_instances_list)
62
62
  list.reject {|i| i.terminating? || i.terminated? }
63
63
  end
64
+ # get the master instance
65
+ def master
66
+ get_instance_by_number(0)
67
+ end
64
68
  # Get instance by number
65
69
  def get_instance_by_number(i=0, list = remote_instances_list)
66
70
  name = (i.zero? ? "master" : "node#{i}")