auser-poolparty 0.2.16 → 0.2.20

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 (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