auser-poolparty 0.2.16 → 0.2.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. data/Manifest.txt +72 -7
  2. data/PostInstall.txt +1 -1
  3. data/Rakefile +11 -0
  4. data/bin/cloud-provision +6 -10
  5. data/bin/server-build-messenger +20 -0
  6. data/bin/server-fire-cmd +0 -2
  7. data/bin/server-list-responding +24 -0
  8. data/bin/server-start-master +4 -9
  9. data/bin/server-start-node +7 -6
  10. data/lib/erlang/messenger/Emakefile +1 -0
  11. data/lib/erlang/messenger/Rakefile +29 -20
  12. data/lib/erlang/messenger/ebin/master_app.beam +0 -0
  13. data/lib/erlang/messenger/ebin/node_app.beam +0 -0
  14. data/lib/erlang/messenger/ebin/packager.app +19 -0
  15. data/lib/erlang/messenger/ebin/pm_client.beam +0 -0
  16. data/lib/erlang/messenger/ebin/pm_cluster.beam +0 -0
  17. data/lib/erlang/messenger/ebin/pm_event_handler.beam +0 -0
  18. data/lib/erlang/messenger/ebin/pm_master.beam +0 -0
  19. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -7
  20. data/lib/erlang/messenger/ebin/pm_master_supervisor.beam +0 -0
  21. data/lib/erlang/messenger/ebin/pm_node.beam +0 -0
  22. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -7
  23. data/lib/erlang/messenger/ebin/pm_node_supervisor.beam +0 -0
  24. data/lib/erlang/messenger/ebin/pm_packager.beam +0 -0
  25. data/lib/erlang/messenger/ebin/utils.beam +0 -0
  26. data/lib/erlang/messenger/lib/eunit/AUTHORS +2 -0
  27. data/lib/erlang/messenger/lib/eunit/CHANGELOG +14 -0
  28. data/lib/erlang/messenger/lib/eunit/COPYING +504 -0
  29. data/lib/erlang/messenger/lib/eunit/Makefile +28 -0
  30. data/lib/erlang/messenger/lib/eunit/NOTES +276 -0
  31. data/lib/erlang/messenger/lib/eunit/README +3 -0
  32. data/lib/erlang/messenger/lib/eunit/doc/edoc-info +3 -0
  33. data/lib/erlang/messenger/lib/eunit/doc/erlang.png +0 -0
  34. data/lib/erlang/messenger/lib/eunit/doc/eunit.html +172 -0
  35. data/lib/erlang/messenger/lib/eunit/doc/index.html +17 -0
  36. data/lib/erlang/messenger/lib/eunit/doc/modules-frame.html +12 -0
  37. data/lib/erlang/messenger/lib/eunit/doc/overview-summary.html +984 -0
  38. data/lib/erlang/messenger/lib/eunit/doc/overview.edoc +980 -0
  39. data/lib/erlang/messenger/lib/eunit/doc/packages-frame.html +11 -0
  40. data/lib/erlang/messenger/lib/eunit/doc/stylesheet.css +55 -0
  41. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  42. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  43. data/lib/erlang/messenger/lib/eunit/ebin/eunit.app +21 -0
  44. data/lib/erlang/messenger/lib/eunit/ebin/eunit.appup +1 -0
  45. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  46. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  47. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  48. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  49. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  50. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  51. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  52. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  53. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  54. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  55. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  56. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  57. data/lib/erlang/messenger/lib/eunit/examples/eunit_examples.erl +339 -0
  58. data/lib/erlang/messenger/lib/eunit/examples/fib.erl +19 -0
  59. data/lib/erlang/messenger/lib/eunit/examples/tests.txt +1 -0
  60. data/lib/erlang/messenger/lib/eunit/include/eunit.hrl +313 -0
  61. data/lib/erlang/messenger/lib/eunit/src/Makefile +46 -0
  62. data/lib/erlang/messenger/lib/eunit/src/autoload.erl +388 -0
  63. data/lib/erlang/messenger/lib/eunit/src/code_monitor.erl +243 -0
  64. data/lib/erlang/messenger/lib/eunit/src/eunit.app.src +21 -0
  65. data/lib/erlang/messenger/lib/eunit/src/eunit.appup.src +1 -0
  66. data/lib/erlang/messenger/lib/eunit/src/eunit.erl +196 -0
  67. data/lib/erlang/messenger/lib/eunit/src/eunit_autoexport.erl +102 -0
  68. data/lib/erlang/messenger/lib/eunit/src/eunit_data.erl +798 -0
  69. data/lib/erlang/messenger/lib/eunit/src/eunit_internal.hrl +48 -0
  70. data/lib/erlang/messenger/lib/eunit/src/eunit_lib.erl +682 -0
  71. data/lib/erlang/messenger/lib/eunit/src/eunit_proc.erl +552 -0
  72. data/lib/erlang/messenger/lib/eunit/src/eunit_serial.erl +157 -0
  73. data/lib/erlang/messenger/lib/eunit/src/eunit_server.erl +340 -0
  74. data/lib/erlang/messenger/lib/eunit/src/eunit_striptests.erl +64 -0
  75. data/lib/erlang/messenger/lib/eunit/src/eunit_test.erl +334 -0
  76. data/lib/erlang/messenger/lib/eunit/src/eunit_tests.erl +45 -0
  77. data/lib/erlang/messenger/lib/eunit/src/eunit_tty.erl +272 -0
  78. data/lib/erlang/messenger/lib/eunit/src/file_monitor.erl +409 -0
  79. data/lib/erlang/messenger/lib/eunit/sys.config +9 -0
  80. data/lib/erlang/messenger/lib/eunit/vsn.mk +1 -0
  81. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  82. data/lib/erlang/messenger/pm_master_rel-0.1.script +75 -2
  83. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  84. data/lib/erlang/messenger/pm_node_rel-0.1.script +75 -2
  85. data/lib/erlang/messenger/src/pm_client.erl +8 -3
  86. data/lib/erlang/messenger/src/pm_cluster.erl +32 -9
  87. data/lib/erlang/messenger/src/pm_master.erl +10 -11
  88. data/lib/erlang/messenger/src/pm_node.erl +2 -3
  89. data/lib/erlang/messenger/src/pm_packager.erl +73 -0
  90. data/lib/erlang/messenger/src/utils.erl +3 -10
  91. data/lib/poolparty/base_packages/heartbeat.rb +9 -9
  92. data/lib/poolparty/base_packages/poolparty.rb +16 -10
  93. data/lib/poolparty/config/allowed_commands.yml +1 -0
  94. data/lib/poolparty/core/object.rb +8 -0
  95. data/lib/poolparty/exceptions/UnacceptableCommand.rb +5 -0
  96. data/lib/poolparty/helpers/messenger.rb +29 -0
  97. data/lib/poolparty/helpers/provisioner_base.rb +7 -7
  98. data/lib/poolparty/helpers/provisioners/master.rb +3 -7
  99. data/lib/poolparty/helpers/provisioners/slave.rb +1 -0
  100. data/lib/poolparty/modules/cloud_resourcer.rb +7 -5
  101. data/lib/poolparty/modules/configurable.rb +1 -1
  102. data/lib/poolparty/modules/method_missing_sugar.rb +6 -1
  103. data/lib/poolparty/modules/pretty_printer.rb +1 -0
  104. data/lib/poolparty/modules/resourcing_dsl.rb +2 -1
  105. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +1 -1
  106. data/lib/poolparty/net/remoter.rb +3 -1
  107. data/lib/poolparty/plugins/git.rb +3 -3
  108. data/lib/poolparty/pool/base.rb +7 -2
  109. data/lib/poolparty/pool/cloud.rb +3 -3
  110. data/lib/poolparty/pool/resource.rb +38 -24
  111. data/lib/poolparty/pool/resources/class_package.rb +2 -2
  112. data/lib/poolparty/pool/resources/conditional.rb +8 -4
  113. data/lib/poolparty/pool/resources/{gem.rb → gem_package.rb} +0 -0
  114. data/lib/poolparty/pool/resources/package.rb +8 -1
  115. data/lib/poolparty/version.rb +1 -1
  116. data/lib/poolparty.rb +1 -1
  117. data/poolparty.gemspec +476 -61
  118. data/spec/poolparty/core/object_spec.rb +20 -0
  119. data/spec/poolparty/helpers/messenger_spec.rb +14 -0
  120. data/spec/poolparty/helpers/provisioners/master_spec.rb +2 -2
  121. data/spec/poolparty/net/remoter_spec.rb +1 -1
  122. data/spec/poolparty/plugins/git_spec.rb +26 -19
  123. data/spec/poolparty/pool/base_spec.rb +20 -2
  124. data/spec/poolparty/pool/cloud_spec.rb +256 -249
  125. data/spec/poolparty/pool/custom_resource_spec.rb +6 -1
  126. data/spec/poolparty/pool/plugin_spec.rb +71 -65
  127. data/spec/poolparty/pool/resource_spec.rb +314 -237
  128. data/spec/poolparty/pool/resources/class_package_spec.rb +71 -66
  129. data/spec/poolparty/pool/resources/conditional_spec.rb +30 -26
  130. data/spec/poolparty/pool/resources/gem_spec.rb +18 -14
  131. data/spec/poolparty/pool/resources/variable_spec.rb +1 -1
  132. data/spec/poolparty/pool/script_spec.rb +46 -37
  133. data/spec/poolparty/spec_helper.rb +4 -0
  134. data/tasks/cloud.rake +0 -54
  135. data/tasks/development.rake +11 -14
  136. data/tasks/ec2.rake +10 -17
  137. data/tasks/instance.rake +0 -61
  138. data/website/index.html +1 -1
  139. metadata +83 -10
@@ -1,22 +1,33 @@
1
- -module(cluster).
1
+ -module(pm_cluster).
2
2
 
3
3
  -ifdef(EUNIT).
4
4
  -include_lib("eunit/include/eunit.hrl").
5
5
  -endif.
6
6
 
7
- -export([slaves/1]).
8
- %% Argument:
9
- %% Hosts: List of hostname (string)
7
+ -export ([slaves/1, slaves/0]).
8
+ -export ([get_live_nodes/0,refresh_live_nodes/0]).
9
+ -export ([send_call/2, master/0]).
10
+
11
+ send_call(Type, Args) ->
12
+ Nodes = get_live_nodes(),
13
+ rpc:multicall(Nodes, pm_node, Type, [Args]).
14
+
15
+ master() ->
16
+ {erlang:node()}.
17
+
10
18
  slaves([]) ->
11
19
  ok;
12
20
 
13
21
  slaves([Host|Hosts]) ->
14
22
  Args = erl_system_args(),
15
- NodeName = "cluster",
23
+ NodeName = "pp_cluster",
16
24
  {ok, Node} = slave:start_link(Host, NodeName, Args),
17
25
  io:format("Erlang node started = [~p]~n", [Node]),
18
26
  slaves(Hosts).
19
27
 
28
+ slaves() ->
29
+ get_live_nodes().
30
+
20
31
  erl_system_args()->
21
32
  Shared = case init:get_argument(shared) of
22
33
  error -> " ";
@@ -27,8 +38,20 @@ erl_system_args()->
27
38
  atom_to_list(erlang:get_cookie()),
28
39
  Shared, " +Mea r10b "
29
40
  ]).
30
- %% Do not forget to start erlang with a command like:
31
- %% erl -rsh ssh -sname clustmaster
32
41
 
33
- basic_test_() ->
34
- ?_assert(true).
42
+ refresh_live_nodes() ->
43
+ String = ". /etc/profile && server-list-active -c name",
44
+ Nodes = string:tokens(os:cmd(String), "\n\t"),
45
+ io:format("nodes: ~p~n", [Nodes]),
46
+ lists:map(
47
+ fun(No) ->
48
+ io:format("pinging ~p~n", [list_to_atom(lists:append("pp_cluster@",No))]),
49
+ net_adm:ping(list_to_atom(lists:append("@pp_cluster", No)))
50
+ end,
51
+ Nodes),
52
+ ok.
53
+ % Get the live nodes
54
+ get_live_nodes() ->
55
+ nodes().
56
+ %% Do not forget to start erlang with a command like:
57
+ %% erl -rsh ssh -sname clustmaster
@@ -18,7 +18,8 @@
18
18
  -define(SERVER, ?MODULE).
19
19
 
20
20
  % Client function definitions
21
- -export ([get_load/1, reconfigure_cloud/0, fire_cmd/1, get_live_nodes/0]).
21
+ -export ([get_load/1, reconfigure_cloud/0, fire_cmd/1]).
22
+ -export ([shutdown_cloud/0]).
22
23
 
23
24
  %%====================================================================
24
25
  %% API
@@ -28,7 +29,7 @@
28
29
  %% Description: Starts the server
29
30
  %%--------------------------------------------------------------------
30
31
  start_link() ->
31
- gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
32
+ gen_server:start_link({global, ?SERVER}, ?MODULE, [], []).
32
33
 
33
34
  %%====================================================================
34
35
  %% gen_server callbacks
@@ -98,22 +99,20 @@ code_change(_OldVsn, State, _Extra) ->
98
99
 
99
100
  % pm_master:get_load("0", "cpu").
100
101
  get_load(Type) ->
101
- Nodes = get_live_nodes(),
102
- {Loads, _} = rpc:multicall(Nodes, pm_node, get_load_for_type, [Type]),
102
+ {Loads, _} = pm_cluster:send_call(get_load_for_type, [Type]),
103
103
  {utils:convert_responses_to_int_list(Loads)}.
104
104
 
105
105
  % Send reconfigure tasks to every node
106
106
  reconfigure_cloud() ->
107
- Nodes = get_live_nodes(),
108
- {_, _} = rpc:multicall(Nodes, pm_node, run_reconfig, []),
107
+ pm_cluster:send_call(run_reconfig, []),
109
108
  {ok}.
110
109
 
111
110
  % Fire the given command on all nodes
112
111
  fire_cmd(Cmd) ->
113
- Nodes = get_live_nodes(),
114
- {_, _} = rpc:multicall(Nodes, pm_node, fire_cmd, [Cmd]),
112
+ pm_cluster:send_call(fire_cmd, [Cmd]),
115
113
  {ok}.
116
114
 
117
- % Get the live nodes
118
- get_live_nodes() ->
119
- nodes().
115
+ % Shutdown
116
+ shutdown_cloud() ->
117
+ pm_cluster:send_call(stop, []),
118
+ {ok}.
@@ -34,8 +34,8 @@
34
34
  %% Fires a ping every 10 seconds
35
35
  %%--------------------------------------------------------------------
36
36
  start_link() ->
37
- utils:start_timer(10000, fun() -> net_adm:ping(master@auser) end),
38
- gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
37
+ utils:start_timer(10000, fun() -> net_adm:ping(master) end),
38
+ gen_server:start_link({global, ?SERVER}, ?MODULE, [], []).
39
39
 
40
40
  %%====================================================================
41
41
  %% gen_server callbacks
@@ -117,7 +117,6 @@ run_reconfig() -> {os:cmd(". /etc/profile && server-rerun")}.
117
117
  % Allows us to fire off any command (allowed by poolparty on the check)
118
118
  fire_cmd(Cmd) ->
119
119
  String = ". /etc/profile && server-fire-cmd \""++Cmd++"\"",
120
- io:format("Sending command "++String),
121
120
  {os:cmd(String)}.
122
121
 
123
122
  % Stop the pm_node entirely
@@ -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(_, _) ->
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
@@ -13,9 +13,9 @@ convert_responses_to_int_list(L) ->
13
13
 
14
14
  % Start a timer to fire off Fun after Time number of milliseconds
15
15
  start_timer(Time, Fun) ->
16
- register(clock, spawn(fun() -> tick_timer(Time, Fun) end)).
16
+ register(?MODULE, spawn(fun() -> tick_timer(Time, Fun) end)).
17
17
 
18
- stop_timer() -> clock ! stop.
18
+ stop_timer() -> ?MODULE ! stop.
19
19
 
20
20
  tick_timer(Time, Fun) ->
21
21
  receive
@@ -35,11 +35,4 @@ average_for_list(Num, L) ->
35
35
  0;
36
36
  _ ->
37
37
  Num / length(L)
38
- end.
39
-
40
- % Recompiles the boot scripts
41
- recompile_scripts(Vers) ->
42
- systools:make_script("pm_node_rel-"++Vers, [local]),
43
- systools:make_script("pm_master_rel-"++Vers, [local]).
44
-
45
- % Tests
38
+ end.
@@ -6,28 +6,28 @@ module PoolParty
6
6
  execute_if("$hostname", "master") do
7
7
  has_package(:name => "heartbeat-2", :ensure => "installed") do
8
8
  # These can also be passed in via hash
9
+ has_service(:name => "heartbeat", :hasstatus => true)
10
+
9
11
  has_remotefile(:name => "/etc/ha.d/ha.cf") do
10
12
  mode 444
11
- notify 'Service["heartbeat"]'
13
+ notify service(:name => "heartbeat")
12
14
  template File.join(File.dirname(__FILE__), "..", "templates/ha.cf")
13
15
  end
16
+
17
+ has_exec(:name => "heartbeat-update-cib", :command => "/usr/sbin/cibadmin -R -x /etc/ha.d/cib.xml", :refreshonly => true)
14
18
 
15
19
  has_remotefile(:name => "/etc/ha.d/authkeys") do
16
20
  mode 400
17
- notify 'Service["heartbeat"]'
21
+ notify service(:name => "heartbeat")
18
22
  template File.join(File.dirname(__FILE__), "..", "templates/authkeys")
19
23
  end
20
24
 
21
25
  has_remotefile(:name => "/etc/ha.d/cib.xml") do
22
26
  mode 444
23
- notify 'Exec["heartbeat-update-cib"]'
27
+ notify exec(:name => "heartbeat-update-cib")
24
28
  template File.join(File.dirname(__FILE__), "..", "templates/cib.xml")
25
- end
26
-
27
- has_service(:name => "heartbeat", :hasstatus => true)
28
- end
29
-
30
- has_exec(:name => "heartbeat-update-cib", :command => "/usr/sbin/cibadmin -R -x /etc/ha.d/cib.xml", :refreshonly => true)
29
+ end
30
+ end
31
31
 
32
32
  if @parent.provisioning?
33
33
  variable(:name => "ha_nodenames", :value => "#{list_of_running_instances.map{|a| "#{a.send :name}" }.join("\t")}")
@@ -4,25 +4,29 @@ module PoolParty
4
4
 
5
5
  def enable
6
6
  has_package(:name => "erlang")
7
+ has_package(:name => "erlang-dev")
8
+ has_package(:name => "erlang-src")
7
9
 
8
10
  has_package(:name => "rubygems") do
9
11
  # These should be installed automagically by poolparty, but just in case
10
12
  # TODO: Fix the requires method with a helper
11
13
  has_gempackage(:name => "logging")
12
- has_gempackage(:name => "xml-simple") do
14
+ has_gempackage(:name => "xml-simple", :source => "/var/poolparty/xml-simple.gem") do
13
15
  has_gempackage(:name => "grempe-amazon-ec2", :source => "http://gems.github.com")
14
16
  end
15
17
 
16
- has_gempackage(:name => "hoe") do
17
- has_gempackage(:name => "open4")
18
-
19
- has_gempackage(:name => "ParseTree", :version => "2.2.0") do
20
- has_gempackage(:name => "ruby2ruby")
21
- has_gempackage(:name => "activesupport") do
22
- has_gempackage(:name => "auser-poolparty", :source => "http://gems.github.com")
18
+ has_gempackage(:name => "open4")
19
+
20
+ has_gempackage(:name => "ParseTree", :version => "2.2.0") do
21
+ has_gempackage(:name => "ruby2ruby")
22
+ has_gempackage(:name => "activesupport") do
23
+ has_gempackage(:name => "auser-poolparty", :source => "http://gems.github.com") do
24
+ has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger") do
25
+ has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node")
26
+ end
23
27
  end
24
- has_gempackage(:name => "RubyInline")
25
28
  end
29
+ has_gempackage(:name => "RubyInline")
26
30
  end
27
31
 
28
32
  end
@@ -41,7 +45,9 @@ module PoolParty
41
45
 
42
46
  # These are all requirements on the master
43
47
  execute_if("$hostname", "master") do
44
- has_cron({:command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3"})
48
+ has_cron({:name => "maintain script ", :command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3"})
49
+ # TODO: Update this so it only runs when needed
50
+ has_exec(:name => ". /etc/profile && server-start-master")
45
51
  end
46
52
  # has_host(:name => "puppet", :ip => (self.respond_to?(:master) ? self : parent).master.ip)
47
53
  end
@@ -0,0 +1 @@
1
+ echo 'hello world' > test.del.txt
@@ -26,6 +26,14 @@ class Object
26
26
  block.in_context(self).call
27
27
  self
28
28
  end
29
+ def send_if_method(v, *args)
30
+ if (v.nil? || v.to_s.empty? || v.is_a?(Array) || v.is_a?(Integer))
31
+ v
32
+ else
33
+ vs = v.to_s.to_sym
34
+ respond_to?(vs) ? self.send(vs, *args) : v
35
+ end
36
+ end
29
37
  def to_option_string
30
38
  case self.class
31
39
  when String
@@ -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
@@ -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 -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname #{hostname} -setcookie poolparty"
7
+
8
+ "erl #{command_line_opts} #{extra} 2>&1 &"
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
@@ -71,9 +71,9 @@ module PoolParty
71
71
  setup_runner(@cloud)
72
72
 
73
73
  unless testing
74
- puts "Logging on to #{@instance.ip}" if verbose
75
- @cloud.prepare_reconfiguration
74
+ puts "Logging on to #{@instance.ip}" if verbose
76
75
  @cloud.rsync_storage_files_to(@instance)
76
+ @cloud.prepare_reconfiguration
77
77
 
78
78
  cmd = "cd #{Base.remote_storage_path} && chmod +x install_#{name}.sh && /bin/sh install_#{name}.sh && rm install_#{name}.sh"
79
79
  hide_output do
@@ -92,7 +92,7 @@ module PoolParty
92
92
  def process_configure!(testing=false)
93
93
  error unless valid?
94
94
  write_configure_file
95
- setup_runner(@cloud)
95
+ setup_runner(@cloud)
96
96
 
97
97
  unless testing
98
98
  puts "Logging on to #{@instance.ip}" if verbose
@@ -229,10 +229,10 @@ module PoolParty
229
229
  case @os
230
230
  when :ubuntu
231
231
  "
232
- touch /etc/apt/sources.list
233
- echo 'deb http://mirrors.kernel.org/ubuntu hardy main universe' >> /etc/apt/sources.list
234
- aptitude update -y
235
- aptitude autoclean
232
+ touch /etc/apt/sources.list
233
+ echo 'deb http://mirrors.kernel.org/ubuntu hardy main universe' >> /etc/apt/sources.list
234
+ # aptitude update -y 2>&1
235
+ # aptitude autoclean 2>&1 &
236
236
  "
237
237
  else
238
238
  "# No system upgrade needed"
@@ -17,8 +17,6 @@ module PoolParty
17
17
 
18
18
  def install_tasks
19
19
  [
20
- install_haproxy,
21
- install_heartbeat,
22
20
  create_local_hosts_entry,
23
21
  setup_basic_structure,
24
22
  setup_configs,
@@ -40,18 +38,16 @@ module PoolParty
40
38
  # If the master is not in the hosts file, then add it to the hosts file
41
39
  def create_local_hosts_entry
42
40
  <<-EOS
43
- if [ -z \"$(grep -v '#' /etc/hosts | grep 'master')" ]; then echo '#{@master_ip} puppet master' >> /etc/hosts; fi
41
+ if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} puppet master' >> /etc/hosts; fi
44
42
  EOS
45
43
  end
46
44
 
47
45
  def setup_basic_structure
48
46
  <<-EOS
49
- puppetmasterd --mkusers
50
- mkdir -p #{Base.remote_storage_path}
51
- echo "import 'nodes/*.pp'" > /etc/puppet/manifests/site.pp
52
- echo "import 'classes/*.pp'" >> /etc/puppet/manifests/site.pp
53
47
  mkdir -p /etc/puppet/manifests/nodes
54
48
  mkdir -p /etc/puppet/manifests/classes
49
+ echo "import 'nodes/*.pp'" > /etc/puppet/manifests/site.pp
50
+ echo "import 'classes/*.pp'" >> /etc/puppet/manifests/site.pp
55
51
  cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
56
52
  EOS
57
53
  end
@@ -36,6 +36,7 @@ module PoolParty
36
36
  ps aux | grep "puppetmasterd" | awk '{print $2}' | xargs kill
37
37
  rm -rf /etc/puppet/ssl*
38
38
  puppetd --test 2>&1 &
39
+ rm -rf /etc/puppet/ssl*
39
40
  EOS
40
41
  end
41
42
 
@@ -67,11 +67,13 @@ module PoolParty
67
67
 
68
68
  # Set the parent on the resource
69
69
  def set_parent(pare, sink_options=true)
70
- @parent = pare
71
- # Add self as a service on the parent
72
- pare.add_service(self) if pare.respond_to?(:add_service)
73
- # Take the options of the parents
74
- configure(pare.options) if pare.respond_to?(:options) && sink_options
70
+ unless pare == self
71
+ @parent = pare
72
+ # Add self as a service on the parent
73
+ pare.add_service(self) if pare.respond_to?(:add_service)
74
+ # Take the options of the parents
75
+ configure(pare.options) if pare.respond_to?(:options) && sink_options
76
+ end
75
77
  end
76
78
 
77
79
  def number_of_resources
@@ -21,7 +21,7 @@ module PoolParty
21
21
  end
22
22
 
23
23
  def set_vars_from_options(opts={})
24
- opts.each {|k,v| self.send k.to_sym, v } unless opts.empty?
24
+ opts.each {|k,v| self.send k.to_sym, send_if_method(v) } unless opts.empty?
25
25
  end
26
26
  end
27
27
 
@@ -45,7 +45,12 @@ module PoolParty
45
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
- options[m] = (args.is_a?(Array) && args.size > 1) ? args : args[0]
48
+ options[m] =
49
+ if (args.is_a?(Array) && args.size > 1)
50
+ args
51
+ else
52
+ args[0]
53
+ end
49
54
  end
50
55
  end
51
56
 
@@ -2,6 +2,7 @@ module PoolParty
2
2
  module PrettyPrinter
3
3
 
4
4
  def pretty_print(pre="\t")
5
+ pre = "\t" unless pre.is_a?(String)
5
6
  returning Array.new do |out|
6
7
  out << pretty_name(pre, self)
7
8
  out << pretty_options(pre, self)
@@ -6,7 +6,8 @@ module PoolParty
6
6
  str ? options.merge!(:require => str) : options[:require]
7
7
  end
8
8
  def requires(str=nil)
9
- str ? options.append!(:require => str) : options[:require]
9
+ # str ? options.append!(:require => str) : options[:require]
10
+ str ? options.append!(:require => send_if_method(str)) : options[:require]
10
11
  end
11
12
  def ensures(str="running")
12
13
  if %w(absent running).map {|a| self.send a.to_sym}.include?(str)
@@ -5,7 +5,7 @@ module PoolParty
5
5
 
6
6
  def run
7
7
  str = %x[uptime]
8
- str.split(/\s+/)[-3].to_f rescue 0.0
8
+ str.split(/\s+/)[-2].to_f rescue 0.0
9
9
  end
10
10
 
11
11
  end
@@ -225,9 +225,11 @@ module PoolParty
225
225
 
226
226
  # Prepare reconfiguration on the master
227
227
  # TODO: Fix the killall
228
+ # TODO: Curious about the puppet/ssl problems...
229
+ # puppetd --test --no-daemonize 2>&1 &
228
230
  def prepare_reconfiguration
229
231
  unless @prepared
230
- cmd = "killall ruby && rm -rf /etc/puppet/ssl/*; puppetmasterd --verbose; puppetd --test --no-daemonize 2>&1 &"
232
+ cmd = "killall ruby 2>&1 && rm -rf /etc/puppet/ssl/*; puppetmasterd --verbose 2>&1"
231
233
  run_command_on(cmd, master)
232
234
  @prepared = true
233
235
  end
@@ -8,16 +8,16 @@ module PoolParty
8
8
  end
9
9
 
10
10
  def has_git_repos
11
- exec({:name => "git-#{name}"}) do
11
+ has_package(:name => "git-core")
12
+ exec({:name => "git-#{name}", :requires => package(:name => "git-core")}) do
12
13
  command parent.user ? "git clone #{parent.user}@#{parent.source} #{parent.path}" : "git clone #{parent.source} #{parent.to ? parent.to : ""}"
13
14
  cwd "#{parent.cwd if parent.cwd}"
14
15
  creates "#{::File.join( (parent.cwd ? parent.cwd : cwd), ::File.basename(parent.source, ::File.extname(parent.source)) )}/.git"
15
-
16
+
16
17
  exec(:name => "update-#{name}") do
17
18
  cwd ::File.dirname(parent.creates)
18
19
  command "git pull"
19
20
  end
20
-
21
21
  end
22
22
  end
23
23
 
@@ -13,7 +13,7 @@ module PoolParty
13
13
  :environment => "production",
14
14
  :user => "root", # This should change here
15
15
  :base_keypair_path => "~/.ec2",
16
- :tmp_path => "tmp",
16
+ :tmp_path => "/tmp/poolparty",
17
17
  :remote_storage_path => "/var/poolparty",
18
18
  :fileserver_base => "puppet:///files",
19
19
  :base_config_directory => "/etc/poolparty",
@@ -74,13 +74,18 @@ module PoolParty
74
74
  "/var/poolparty"
75
75
  ].select do |dir|
76
76
  dir if ::File.directory?(dir) && ::File.readable?(dir)
77
- end.first || ::File.join(Dir.pwd, "tmp")
77
+ end.first || ::File.join( "/tmp/poolparty")
78
78
  end
79
79
 
80
80
  def pool_logger_location
81
81
  File.join(Dir.pwd, "logs")
82
82
  end
83
83
 
84
+ # Array of allowed_commands that you can run on the remote nodes
85
+ def allowed_commands
86
+ @allowed_commands ||= open(::File.join( ::File.dirname(__FILE__), "..", "config", "allowed_commands.yml")).read.split(/\n/).map {|a| a.chomp }
87
+ end
88
+
84
89
  end
85
90
  end
86
91
  end
@@ -115,9 +115,7 @@ module PoolParty
115
115
  reset_resources!
116
116
  add_poolparty_base_requirements
117
117
 
118
- @build_manifest = returning Array.new do |str|
119
-
120
- str << resources_string_from_resources(resources)
118
+ @build_manifest = returning Array.new do |str|
121
119
 
122
120
  # Refactor this into the resources method
123
121
  # TODO
@@ -126,6 +124,8 @@ module PoolParty
126
124
  str << @cp.to_string
127
125
  str << @cp.include_string
128
126
  end
127
+
128
+ str << resources_string_from_resources(resources)
129
129
 
130
130
  str << "# Custom functions"
131
131
  str << Resources::CustomResource.custom_functions_to_string