poolparty 0.2.6 → 0.2.18

Sign up to get free protection for your applications and to get access to all the features.
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}")