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,124 @@
1
+ %%%-------------------------------------------------------------------
2
+ %%% File : pm_node.erl
3
+ %%% Author : Ari Lerner <arilerner@mac.com>
4
+ %%% The client is a running process that will run on the master node
5
+ %%% and spawn requests to the pm_nodes and compile the responses
6
+ %%% for use within the poolparty network
7
+ %%%-------------------------------------------------------------------
8
+ -module(pm_node).
9
+ -behaviour(gen_server).
10
+
11
+ %% API
12
+ -export([start_link/0]).
13
+
14
+ %% gen_server callbacks
15
+ -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
16
+ terminate/2, code_change/3]).
17
+ -record(state, {}).
18
+ -define(SERVER, ?MODULE).
19
+
20
+ % Client function definitions
21
+ -export ([stop/0]).
22
+ -export ([get_load_for_type/1, fire_cmd/1, run_reconfig/0]).
23
+
24
+ %%====================================================================
25
+ %% API
26
+ %%====================================================================
27
+ %%--------------------------------------------------------------------
28
+ %% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
29
+ %% Description: Starts the server
30
+ %%
31
+ %% Starts the timer to fire off a ping to the master to let the master
32
+ %% know that it is alive
33
+ %%
34
+ %% Fires a ping every 10 seconds
35
+ %%--------------------------------------------------------------------
36
+ start_link() ->
37
+ utils:start_timer(10000, fun() -> net_adm:ping(master) end),
38
+ gen_server:start_link({global, ?SERVER}, ?MODULE, [], []).
39
+
40
+ %%====================================================================
41
+ %% gen_server callbacks
42
+ %%====================================================================
43
+
44
+ %%--------------------------------------------------------------------
45
+ %% Function: init(Args) -> {ok, State} |
46
+ %% {ok, State, Timeout} |
47
+ %% ignore |
48
+ %% {stop, Reason}
49
+ %% Description: Initiates the server
50
+ %%--------------------------------------------------------------------
51
+ init([]) ->
52
+ process_flag(trap_exit, true),
53
+ {ok, #state{}}.
54
+
55
+ %%--------------------------------------------------------------------
56
+ %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
57
+ %% {reply, Reply, State, Timeout} |
58
+ %% {noreply, State} |
59
+ %% {noreply, State, Timeout} |
60
+ %% {stop, Reason, Reply, State} |
61
+ %% {stop, Reason, State}
62
+ %% Description: Handling call messages
63
+ %%--------------------------------------------------------------------
64
+ handle_call(_Request, _From, State) ->
65
+ Reply = ok,
66
+ {reply, Reply, State}.
67
+
68
+ %%--------------------------------------------------------------------
69
+ %% Function: handle_cast(Msg, State) -> {noreply, State} |
70
+ %% {noreply, State, Timeout} |
71
+ %% {stop, Reason, State}
72
+ %% Description: Handling cast messages
73
+ %%--------------------------------------------------------------------
74
+ handle_cast(_Msg, State) ->
75
+ {noreply, State}.
76
+
77
+ %%--------------------------------------------------------------------
78
+ %% Function: handle_info(Info, State) -> {noreply, State} |
79
+ %% {noreply, State, Timeout} |
80
+ %% {stop, Reason, State}
81
+ %% Description: Handling all non call/cast messages
82
+ %%--------------------------------------------------------------------
83
+ handle_info(_Info, State) ->
84
+ io:format("Info message received from: ~p~n", [_Info]),
85
+ {noreply, State}.
86
+
87
+ %%--------------------------------------------------------------------
88
+ %% Function: terminate(Reason, State) -> void()
89
+ %% Description: This function is called by a gen_server when it is about to
90
+ %% terminate. It should be the opposite of Module:init/1 and do any necessary
91
+ %% cleaning up. When it returns, the gen_server terminates with Reason.
92
+ %% The return value is ignored.
93
+ %%--------------------------------------------------------------------
94
+ terminate(_Reason, _State) ->
95
+ utils:stop_timer(),
96
+ ok.
97
+
98
+ %%--------------------------------------------------------------------
99
+ %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
100
+ %% Description: Convert process state when code is changed
101
+ %%--------------------------------------------------------------------
102
+ code_change(_OldVsn, State, _Extra) ->
103
+ {ok, State}.
104
+
105
+ %%--------------------------------------------------------------------
106
+ %%% Internal functions
107
+ %%--------------------------------------------------------------------
108
+
109
+ % Get the load for the type sent...
110
+ get_load_for_type(Type) ->
111
+ String = string:concat(". /etc/profile && server-get-load -m ",Type),
112
+ {os:cmd(String)}.
113
+
114
+ % Rerun the configuration
115
+ run_reconfig() -> {os:cmd(". /etc/profile && server-rerun")}.
116
+
117
+ % Allows us to fire off any command (allowed by poolparty on the check)
118
+ fire_cmd(Cmd) ->
119
+ String = ". /etc/profile && server-fire-cmd \""++Cmd++"\"",
120
+ {os:cmd(String)}.
121
+
122
+ % Stop the pm_node entirely
123
+ stop() ->
124
+ gen_server:cast(?MODULE, stop).
@@ -0,0 +1,40 @@
1
+ % This supervisor is responsible for monitoring the
2
+ % client service
3
+
4
+ -module (pm_node_supervisor).
5
+ -behaviour(supervisor).
6
+
7
+ -export([start/0, start_in_shell_for_testing/0, start_link/1, init/1]).
8
+
9
+ -ifdef(EUNIT).
10
+ -include_lib("eunit/include/eunit.hrl").
11
+ -endif.
12
+
13
+ start() ->
14
+ spawn(fun() ->
15
+ supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = [])
16
+ end).
17
+
18
+ start_in_shell_for_testing() ->
19
+ {ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []),
20
+ unlink(Pid).
21
+
22
+ start_link(Args) ->
23
+ supervisor:start_link({local, ?MODULE}, ?MODULE, Args).
24
+
25
+ init([]) ->
26
+ RestartStrategy = one_for_one,
27
+ MaxRestarts = 3, % 1000
28
+ MaxTimeBetRestarts = 30, % 3600
29
+
30
+ SupFlags = {RestartStrategy, MaxRestarts, MaxTimeBetRestarts},
31
+
32
+ LoadServers = [
33
+ {pm_node1,
34
+ {pm_node, start_link, []},
35
+ permanent, 5000, worker,
36
+ [pm_node]
37
+ }
38
+ ],
39
+
40
+ {ok, {SupFlags, LoadServers}}.
@@ -0,0 +1,73 @@
1
+ -module (pm_packager).
2
+ -compile(export_all).
3
+ -behaviour(application).
4
+
5
+ %% Application callbacks
6
+ -export([start/2, stop/1]).
7
+
8
+ start() ->
9
+ start("", "").
10
+ %%====================================================================
11
+ %% Application callbacks
12
+ %%====================================================================
13
+ %%--------------------------------------------------------------------
14
+ %% Function: start(Type, StartArgs) -> {ok, Pid} |
15
+ %% {ok, Pid, State} |
16
+ %% {error, Reason}
17
+ %% Description: This function is called whenever an application
18
+ %% is started using application:start/1,2, and should start the processes
19
+ %% of the application. If the application is structured according to the
20
+ %% OTP design principles as a supervision tree, this means starting the
21
+ %% top supervisor of the tree.
22
+ %%--------------------------------------------------------------------
23
+ start(_Type, _) ->
24
+ recompile_scripts("0.1").
25
+
26
+ %%--------------------------------------------------------------------
27
+ %% Function: stop(State) -> void()
28
+ %% Description: This function is called whenever an application
29
+ %% has stopped. It is intended to be the opposite of Module:start/2 and
30
+ %% should do any necessary cleaning up. The return value is ignored.
31
+ %%--------------------------------------------------------------------
32
+ stop(_State) ->
33
+ ok.
34
+
35
+ %%====================================================================
36
+ %% Internal functions
37
+ %%====================================================================
38
+
39
+ gen_rel(Name, Vers) ->
40
+ RelName = lists:append(["pm_",Name,"_rel-",Vers]),
41
+ F = lists:append(["{release, {\"",Name,"\",\"",Vers,"\"}, ",
42
+ "{erts,\"",erlang:system_info(version),"\"},"
43
+ "[{kernel,\"",get_vsn(kernel),"\"},",
44
+ "{stdlib,\"",get_vsn(stdlib),"\"},",
45
+ "{inets,\"",get_vsn(inets),"\"},",
46
+ "{crypto,\"",get_vsn(crypto),"\"},",
47
+ "{sasl,\"",get_vsn(sasl),"\"},",
48
+ "{",Name,",\"",Vers,"\"}]}."]),
49
+ file:write_file( lists:append(["ebin/", RelName, ".rel"]),F).
50
+
51
+ % Recompiles the boot scripts
52
+ recompile_scripts(Vers) ->
53
+ gen_rel("master", Vers),
54
+ gen_rel("node", Vers),
55
+ systools:make_script("pm_node_rel-"++Vers, [local,{path,["ebin"]}]),
56
+ systools:make_script("pm_master_rel-"++Vers, [local,{path,["ebin"]}]).
57
+
58
+ package_scripts(Vers) ->
59
+ systools:make_tar("ebin/pm_node_rel-"++Vers),
60
+ systools:make_tar("ebin/pm_master_rel-"++Vers).
61
+
62
+ get_vsn(Module) ->
63
+ AppFile = code:lib_dir(Module)++"/ebin/"++atom_to_list(Module)++".app",
64
+ {ok,[{application,_App,Attrs}]} = file:consult(AppFile),
65
+ {value,{vsn,Vsn}} = lists:keysearch(vsn,1,Attrs),
66
+ Vsn.
67
+
68
+ install_messenger(Vers) ->
69
+ Root = code:root_dir(),
70
+ io:format("~p root: "++Root, [Vers]),
71
+ ok.
72
+
73
+ % Tests
@@ -0,0 +1,38 @@
1
+ -module (utils).
2
+ -compile(export_all).
3
+
4
+ -ifdef(EUNIT).
5
+ -include_lib("eunit/include/eunit.hrl").
6
+ -endif.
7
+
8
+ % Turn a list from
9
+ % [{"0.66"}, {"0.32"}, []] -> [0.66, 0.32]
10
+ convert_responses_to_int_list(L) ->
11
+ Sum = lists:foldr( fun(Int, Sum) -> Int + Sum end, 0, [erlang:list_to_float(F) || {F} <- L] ),
12
+ average_for_list(Sum, L).
13
+
14
+ % Start a timer to fire off Fun after Time number of milliseconds
15
+ start_timer(Time, Fun) ->
16
+ register(?MODULE, spawn(fun() -> tick_timer(Time, Fun) end)).
17
+
18
+ stop_timer() -> ?MODULE ! stop.
19
+
20
+ tick_timer(Time, Fun) ->
21
+ receive
22
+ stop ->
23
+ void
24
+ after Time ->
25
+ Fun(),
26
+ tick_timer(Time, Fun)
27
+ end.
28
+
29
+
30
+ % Private
31
+ % Get the average of the list
32
+ average_for_list(Num, L) ->
33
+ case length(L) of
34
+ 0 ->
35
+ 0;
36
+ _ ->
37
+ Num / length(L)
38
+ end.
@@ -21,8 +21,15 @@ module PoolParty
21
21
 
22
22
  # Tempalte variables
23
23
  variable(:name => "name_haproxy", :value => "#{@parent.name}")
24
- variable(:name => "nodenames_haproxy", :value => list_of_node_names)
25
- variable(:name => "node_ips_haproxy", :value => list_of_node_ips)
24
+
25
+ if @parent.provisioning?
26
+ variable(:name => "nodenames_haproxy", :value => "#{list_of_running_instances.map{|a| "#{a.send :name}" }.join("\t")}")
27
+ variable(:name => "node_ips_haproxy", :value => "#{list_of_running_instances.map{|a| "#{a.send :ip}" }.join("\t")}")
28
+ else
29
+ variable(:name => "nodenames_haproxy", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'name')")
30
+ variable(:name => "node_ips_haproxy", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'ip')")
31
+ end
32
+
26
33
  variable(:name => "ports_haproxy", :value => ([(self.respond_to?(:port) ? port : Base.port)].flatten))
27
34
  variable(:name => "forwarding_port", :value => (respond_to?(:forwarding_port) ? forwarding_port : Base.forwarding_port))
28
35
  variable(:name => "proxy_mode", :value => (respond_to?(:proxy_mode) ? proxy_mode : Base.proxy_mode))
@@ -4,38 +4,50 @@ module PoolParty
4
4
 
5
5
  def enable
6
6
  execute_if("$hostname", "master") do
7
- has_package(:name => "heartbeat-2", :ensure => "installed")
8
- has_service(:name => "heartbeat", :hasstatus => true) do
9
- ensures "running"
10
- end
7
+ has_package(:name => "heartbeat-2", :ensure => "installed") do
8
+ # These can also be passed in via hash
9
+ has_remotefile(:name => "/etc/ha.d/ha.cf") do
10
+ mode 444
11
+ notify 'Service["heartbeat"]'
12
+ template File.join(File.dirname(__FILE__), "..", "templates/ha.cf")
13
+ end
14
+
15
+ has_remotefile(:name => "/etc/ha.d/authkeys") do
16
+ mode 400
17
+ notify 'Service["heartbeat"]'
18
+ template File.join(File.dirname(__FILE__), "..", "templates/authkeys")
19
+ end
20
+
21
+ has_remotefile(:name => "/etc/ha.d/cib.xml") do
22
+ mode 444
23
+ notify 'Exec["heartbeat-update-cib"]'
24
+ template File.join(File.dirname(__FILE__), "..", "templates/cib.xml")
25
+ end
26
+
27
+ has_service(:name => "heartbeat", :hasstatus => true)
28
+ end
11
29
 
12
30
  has_exec(:name => "heartbeat-update-cib", :command => "/usr/sbin/cibadmin -R -x /etc/ha.d/cib.xml", :refreshonly => true)
13
-
14
- # variables for the templates
15
- has_variable({:name => "ha_nodenames", :value => list_of_node_names})
16
- has_variable({:name => "ha_node_ips", :value => list_of_node_ips})
17
- has_variable({:name => "ha_port", :value => (self.respond_to?(:port) ? port : Base.port)})
18
-
19
- # These can also be passed in via hash
20
- has_remotefile(:name => "/etc/ha.d/ha.cf") do
21
- mode 444
22
- requires 'Package["heartbeat-2"]'
23
- notify 'Service["heartbeat"]'
24
- template File.join(File.dirname(__FILE__), "..", "templates/ha.cf")
25
- end
26
-
27
- has_remotefile(:name => "/etc/ha.d/authkeys") do
28
- mode 400
29
- requires 'Package["heartbeat-2"]'
30
- notify 'Service["heartbeat"]'
31
- template File.join(File.dirname(__FILE__), "..", "templates/authkeys")
31
+
32
+ if @parent.provisioning?
33
+ variable(:name => "ha_nodenames", :value => "#{list_of_running_instances.map{|a| "#{a.send :name}" }.join("\t")}")
34
+ variable(:name => "ha_node_ips", :value => "#{list_of_running_instances.map{|a| "#{a.send :ip}" }.join("\t")}")
35
+ else
36
+ # variables for the templates
37
+ variable(:name => "ha_nodenames", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'name')")
38
+ variable(:name => "ha_node_ips", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'ip')")
32
39
  end
40
+
41
+ has_variable({:name => "ha_timeout", :value => (self.respond_to?(:timeout) ? timeout : "5s")})
42
+ has_variable({:name => "ha_port", :value => (self.respond_to?(:port) ? port : Base.port)})
43
+
44
+ end
33
45
 
34
- has_remotefile(:name => "/etc/ha.d/cib.xml") do
35
- mode 444
36
- requires 'Package["heartbeat-2"]'
37
- notify 'Exec["heartbeat-update-cib"]'
38
- template File.join(File.dirname(__FILE__), "..", "templates/cib.xml")
46
+ execute_if("$hostname", "master") do
47
+ if list_of_node_names.size > 1
48
+ has_exec(:name => "update pem for heartbeat", :refreshonly => true) do
49
+ command "scp /etc/puppet/ssl/ca/ca_crl.pem #{user || Base.user}@#{list_of_node_ips[1]}:/etc/puppet/ssl/ca"
50
+ end
39
51
  end
40
52
  end
41
53
 
@@ -4,29 +4,52 @@ module PoolParty
4
4
 
5
5
  def enable
6
6
  has_package(:name => "erlang")
7
- # These should be installed automagically by poolparty, but just in case
8
- with_options(:requires => 'Package["update-rubygems"]') do
9
- has_gempackage(:name => "open4")
10
- has_gempackage(:name => "parsetree")
11
- has_gempackage(:name => "rubyinline")
12
- has_gempackage(:name => "activesupport")
7
+ has_package(:name => "erlang-dev")
8
+ has_package(:name => "erlang-src")
9
+
10
+ has_package(:name => "rubygems") do
11
+ # These should be installed automagically by poolparty, but just in case
12
+ # TODO: Fix the requires method with a helper
13
13
  has_gempackage(:name => "logging")
14
- has_gempackage(:name => "hoe")
15
- has_gempackage(:name => "xml-simple")
16
- has_gempackage(:name => "ruby2ruby")
17
-
18
- has_gempackage(:name => "grempe-amazon-ec2", :source => "http://gems.github.com", :requires => 'Package["xml-simple"]')
19
- has_gempackage(:name => "auser-poolparty", :source => "http://gems.github.com", :requires => 'Package["activesupport", "logging", "hoe", "open4"]')
20
- end
14
+ has_gempackage(:name => "xml-simple") do
15
+ has_gempackage(:name => "grempe-amazon-ec2", :source => "http://gems.github.com")
16
+ end
17
+ has_gempackage(:name => "rake")
18
+
19
+ has_gempackage(:name => "hoe") do
20
+ has_gempackage(:name => "open4")
21
+
22
+ has_gempackage(:name => "ParseTree", :version => "2.2.0") do
23
+ has_gempackage(:name => "ruby2ruby")
24
+ has_gempackage(:name => "activesupport") do
25
+ has_gempackage(:name => "auser-poolparty", :source => "http://gems.github.com") do
26
+ has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger")
27
+ has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node", :requires => 'Exec["build_messenger"]')
28
+ end
29
+ end
30
+ has_gempackage(:name => "RubyInline")
31
+ end
32
+ end
33
+
34
+ end
35
+
21
36
  # Build hostsfile
22
37
  # TODO: COME BACK AND CLEAN THIS UP
23
38
  (self.respond_to?(:list_of_running_instances) ? self : parent).list_of_running_instances.each do |ri|
24
39
  has_host({:name => "#{ri.name}", :ip => ri.ip })
25
40
  end
26
41
 
27
- cron({:command => "cloud-maintain"}) do
28
- minute "*/5"
29
- user "puppet"
42
+ # Custom run puppet to minimize footprint
43
+ # TODO: Update the offsetted times
44
+ has_cron(:name => "puppetd runner", :user => Base.user, :minute => [0,15,30,45]) do
45
+ command((self.respond_to?(:master) ? self : parent).master.puppet_runner_command)
46
+ end
47
+
48
+ # These are all requirements on the master
49
+ execute_if("$hostname", "master") do
50
+ has_cron({:command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3"})
51
+ # TODO: Update this so it only runs when needed
52
+ has_exec(:name => ". /etc/profile && server-start-master")
30
53
  end
31
54
  # has_host(:name => "puppet", :ip => (self.respond_to?(:master) ? self : parent).master.ip)
32
55
  end
@@ -10,10 +10,9 @@ module PoolParty
10
10
  has_package(:name => "libreadline-ruby1.8")
11
11
  has_package(:name => "libruby1.8")
12
12
  has_package(:name => "ruby1.8-dev")
13
- has_package(:name => "ruby1.8")
14
- has_package(:name => "rubygems")
13
+ has_package(:name => "ruby1.8")
15
14
 
16
- has_line_in_file("export PATH=$PATH:/var/lib/gems/1.8/bin/", "/etc/profile")
15
+ has_line_in_file("export PATH=$PATH:/var/lib/gems/1.8/bin:/sbin", "/etc/profile")
17
16
 
18
17
  # exec(:name => "update-rubygems") do
19
18
  # command "gem update --system"
@@ -0,0 +1 @@
1
+ echo 'hello world' > test.del.txt
@@ -15,10 +15,13 @@ class Array
15
15
  def nice_runnable(quiet=true)
16
16
  self.flatten.reject{|e| (e.nil? || e.empty?) }.join(" \n ").chomp.nice_runnable(quiet)
17
17
  end
18
- def to_string(prev="")
19
- map {|a| a.to_string(prev)}.join("\n")
18
+ def to_string(pre="")
19
+ map {|a| a.to_string(pre)}.join("\n")
20
20
  end
21
21
  def get_named(str="")
22
22
  map {|a| a.name == str ? a : nil }.reject {|a| a.nil? }
23
23
  end
24
+ def to_option_string(ns=[])
25
+ "[ #{map {|e| e.to_option_string }.join(", ")} ]"
26
+ end
24
27
  end
@@ -12,14 +12,28 @@ class Hash
12
12
  o.keys.each {|k| self.delete(k) }
13
13
  o
14
14
  end
15
+ def append(other_hash)
16
+ returning Hash.new do |h|
17
+ h.merge!(self)
18
+ other_hash.each do |k,v|
19
+ h[k] = has_key?(k) ? [self[k], v].flatten : v
20
+ end
21
+ end
22
+ end
23
+ def append!(other_hash)
24
+ other_hash.each do |k,v|
25
+ self[k] = has_key?(k) ? [self[k], v].flatten : v
26
+ end
27
+ self
28
+ end
15
29
  def safe_merge(other_hash)
16
30
  merge(other_hash.delete_if {|k,v| has_key?(k) })
17
31
  end
18
32
  def safe_merge!(other_hash)
19
33
  merge!(other_hash.delete_if {|k,v| has_key?(k) && !v.nil? })
20
34
  end
21
- def flush_out(prev="", post="")
22
- map {|k,v| "#{prev}#{k} => #{v.to_option_string}#{post}"}
35
+ def flush_out(pre="", post="")
36
+ map {|k,v| "#{pre}#{k} => #{v.to_option_string}#{post}"}
23
37
  end
24
38
  def to_os
25
39
  m={}
@@ -25,15 +25,22 @@ class String
25
25
  self.split("::")[-1].downcase rescue self
26
26
  end
27
27
  def sanitize
28
- self.gsub(/[\.]*/, '')
28
+ self.gsub(/[\.\/]*/, '')
29
29
  end
30
30
  def nice_runnable(quite=true)
31
31
  self.split(/ && /).join("\n")
32
32
  end
33
+ # This is the method we use to turn the options into a string to build the main
34
+ # manifests
33
35
  def to_option_string(ns=[])
34
36
  a_template = (self =~ /template/) == 0
35
37
  a_service = self =~ /^[A-Z][a-zA-Z]*\[[a-zA-Z0-9\-\.\"\'_\$\{\}\/]*\]/
36
- (a_service || a_template) ? "#{self}" : "'#{self}'"
38
+ a_function = self =~/(.)*\((.)*\)(.)*/
39
+ if is_a?(PoolParty::Resources::Resource)
40
+ self.to_s
41
+ else
42
+ (a_service || a_template || a_function) ? self : "'#{self}'"
43
+ end
37
44
  end
38
45
  # Refactor this guy to get the class if the class is defined, and not always create a new one
39
46
  # although, it doesn't really matter as ruby will just reopen the class
@@ -1,6 +1,6 @@
1
1
  class Symbol
2
- def to_string(prev="")
3
- "#{prev}#{self.to_s}"
2
+ def to_string(pre="")
3
+ "#{pre}#{self.to_s}"
4
4
  end
5
5
  def sanitize
6
6
  self.to_s.sanitize
@@ -0,0 +1,12 @@
1
+ module PoolParty
2
+ module DependencyResolutions
3
+ module Base
4
+
5
+ def to_s
6
+ end
7
+ def to_string
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ module PoolParty
2
+ module DependencyResolutions
3
+ module Puppet
4
+
5
+ def pretty_print_resources(pre=" ")
6
+ returning Array.new do |out|
7
+ resources.each do |name, res|
8
+ out << "#{pre}#{name}"
9
+ out << "#{pre*2}#{res.map {|a| a.name}}"
10
+ res.each do |r|
11
+ out << "#{pre*2}#{r.pretty_print_resources(pre*2)}"
12
+ end
13
+ end
14
+ end.join("\n")
15
+ end
16
+
17
+ # Generic to_s
18
+ # Most Resources won't need to extend this
19
+ def to_string(pre="")
20
+ opts = get_modified_options
21
+ returning Array.new do |output|
22
+ unless cancelled?
23
+ output << @prestring || ""
24
+
25
+ if resources && !resources.empty?
26
+ @cp = classpackage_with_self(self)
27
+ output << @cp.to_string
28
+ output << "include #{@cp.name.sanitize}"
29
+ end
30
+
31
+ unless virtual_resource?
32
+ output << "#{pre}#{class_type_name.downcase} {"
33
+ output << "#{pre}\"#{self.key}\":"
34
+ output << opts.flush_out("#{pre*2}").join(",\n")
35
+ output << "#{pre}}"
36
+ end
37
+
38
+ output << @poststring || ""
39
+ end
40
+ end.join("\n")
41
+ end
42
+
43
+ def to_s
44
+ "#{class_type_name.capitalize}['#{key}']"
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ class UnacceptableCommand < Exception
2
+ def initialize(msg="Unacceptable command")
3
+ @message = "Disallowed or unacceptable command error: #{msg}"
4
+ end
5
+ end
@@ -7,8 +7,9 @@ module PoolParty
7
7
 
8
8
  # Load a file that contains a pool into memory
9
9
  def load_pool(filename)
10
- unless filename && ::File.file?(filename)
11
- puts "Could not load pool"
10
+ filename = filename.chomp
11
+ unless filename && ::File.readable?(filename)
12
+ puts "Could not load pool: #{filename}"
12
13
  exit
13
14
  else
14
15
  PoolParty::Script.inflate(open(filename).read, File.dirname(filename))
@@ -7,10 +7,10 @@ module PoolParty
7
7
  print v.pretty_print
8
8
  end
9
9
  else
10
- prev = "\t"
10
+ pre = "\t"
11
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")
12
+ puts cl.pretty_name(pre*2, cl)
13
+ puts cl.pretty_options(pre*2, cl) #cl.pretty_print("#{pre}\t")
14
14
  end
15
15
  end
16
16