auser-poolparty 0.2.66 → 0.2.67

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 (159) hide show
  1. data/Manifest.txt +83 -41
  2. data/PostInstall.txt +2 -2
  3. data/README.txt +1 -2
  4. data/Rakefile +14 -1
  5. data/bin/cloud-start +11 -10
  6. data/bin/{pool-spec → pool-generate} +0 -0
  7. data/bin/pool-init +3 -3
  8. data/bin/pool-start +8 -7
  9. data/bin/server-update-hosts +1 -1
  10. data/lib/erlang/messenger/ebin/pm_client_rel-0.1.rel +1 -1
  11. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -1
  12. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -1
  13. data/lib/erlang/messenger/include/defines.hrl +7 -3
  14. data/lib/erlang/messenger/lib/eunit/.svn/all-wcprops +53 -0
  15. data/lib/erlang/messenger/lib/eunit/.svn/entries +140 -0
  16. data/lib/erlang/messenger/lib/eunit/.svn/format +1 -0
  17. data/lib/erlang/messenger/lib/eunit/.svn/prop-base/NOTES.svn-base +5 -0
  18. data/lib/erlang/messenger/lib/eunit/.svn/text-base/AUTHORS.svn-base +2 -0
  19. data/lib/erlang/messenger/lib/eunit/.svn/text-base/CHANGELOG.svn-base +14 -0
  20. data/lib/erlang/messenger/lib/eunit/.svn/text-base/COPYING.svn-base +504 -0
  21. data/lib/erlang/messenger/lib/eunit/.svn/text-base/NOTES.svn-base +276 -0
  22. data/lib/erlang/messenger/lib/eunit/.svn/text-base/README.svn-base +3 -0
  23. data/lib/erlang/messenger/lib/eunit/.svn/text-base/sys.config.svn-base +9 -0
  24. data/lib/erlang/messenger/lib/eunit/.svn/text-base/vsn.mk.svn-base +1 -0
  25. data/lib/erlang/messenger/lib/eunit/doc/.svn/all-wcprops +59 -0
  26. data/lib/erlang/messenger/lib/eunit/doc/.svn/entries +142 -0
  27. data/lib/erlang/messenger/lib/eunit/doc/.svn/format +1 -0
  28. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/erlang.png.svn-base +5 -0
  29. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/eunit.html.svn-base +5 -0
  30. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/index.html.svn-base +5 -0
  31. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/modules-frame.html.svn-base +5 -0
  32. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/overview-summary.html.svn-base +5 -0
  33. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/packages-frame.html.svn-base +5 -0
  34. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/edoc-info.svn-base +3 -0
  35. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/erlang.png.svn-base +0 -0
  36. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/eunit.html.svn-base +172 -0
  37. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/index.html.svn-base +17 -0
  38. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/modules-frame.html.svn-base +12 -0
  39. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview-summary.html.svn-base +984 -0
  40. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview.edoc.svn-base +980 -0
  41. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/packages-frame.html.svn-base +11 -0
  42. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/stylesheet.css.svn-base +55 -0
  43. data/lib/erlang/messenger/lib/eunit/ebin/.svn/all-wcprops +5 -0
  44. data/lib/erlang/messenger/lib/eunit/ebin/.svn/dir-prop-base +8 -0
  45. data/lib/erlang/messenger/lib/eunit/ebin/.svn/entries +28 -0
  46. data/lib/erlang/messenger/lib/eunit/ebin/.svn/format +1 -0
  47. data/lib/erlang/messenger/lib/eunit/examples/.svn/all-wcprops +23 -0
  48. data/lib/erlang/messenger/lib/eunit/examples/.svn/entries +66 -0
  49. data/lib/erlang/messenger/lib/eunit/examples/.svn/format +1 -0
  50. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/eunit_examples.erl.svn-base +5 -0
  51. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/fib.erl.svn-base +5 -0
  52. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/eunit_examples.erl.svn-base +339 -0
  53. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/fib.erl.svn-base +19 -0
  54. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/tests.txt.svn-base +1 -0
  55. data/lib/erlang/messenger/lib/eunit/include/.svn/all-wcprops +11 -0
  56. data/lib/erlang/messenger/lib/eunit/include/.svn/entries +41 -0
  57. data/lib/erlang/messenger/lib/eunit/include/.svn/format +1 -0
  58. data/lib/erlang/messenger/lib/eunit/include/.svn/prop-base/eunit.hrl.svn-base +5 -0
  59. data/lib/erlang/messenger/lib/eunit/include/.svn/text-base/eunit.hrl.svn-base +313 -0
  60. data/lib/erlang/messenger/lib/eunit/src/.svn/all-wcprops +113 -0
  61. data/lib/erlang/messenger/lib/eunit/src/.svn/entries +259 -0
  62. data/lib/erlang/messenger/lib/eunit/src/.svn/format +1 -0
  63. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/autoload.erl.svn-base +5 -0
  64. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/code_monitor.erl.svn-base +5 -0
  65. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit.erl.svn-base +5 -0
  66. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_autoexport.erl.svn-base +5 -0
  67. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_data.erl.svn-base +5 -0
  68. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_internal.hrl.svn-base +5 -0
  69. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_lib.erl.svn-base +5 -0
  70. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_proc.erl.svn-base +5 -0
  71. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_serial.erl.svn-base +5 -0
  72. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_server.erl.svn-base +5 -0
  73. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_striptests.erl.svn-base +5 -0
  74. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_test.erl.svn-base +5 -0
  75. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tests.erl.svn-base +5 -0
  76. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tty.erl.svn-base +5 -0
  77. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/file_monitor.erl.svn-base +5 -0
  78. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/autoload.erl.svn-base +388 -0
  79. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/code_monitor.erl.svn-base +243 -0
  80. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.app.src.svn-base +21 -0
  81. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.appup.src.svn-base +1 -0
  82. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.erl.svn-base +196 -0
  83. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_autoexport.erl.svn-base +102 -0
  84. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_data.erl.svn-base +798 -0
  85. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_internal.hrl.svn-base +48 -0
  86. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_lib.erl.svn-base +682 -0
  87. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_proc.erl.svn-base +552 -0
  88. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_serial.erl.svn-base +157 -0
  89. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_server.erl.svn-base +340 -0
  90. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_striptests.erl.svn-base +64 -0
  91. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_test.erl.svn-base +334 -0
  92. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tests.erl.svn-base +45 -0
  93. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tty.erl.svn-base +272 -0
  94. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/file_monitor.erl.svn-base +409 -0
  95. data/lib/erlang/messenger/pm_client_rel-0.1.boot +0 -0
  96. data/lib/erlang/messenger/pm_client_rel-0.1.script +77 -85
  97. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  98. data/lib/erlang/messenger/pm_master_rel-0.1.script +78 -85
  99. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  100. data/lib/erlang/messenger/pm_node_rel-0.1.script +77 -86
  101. data/lib/erlang/messenger/src/pm_node.erl +46 -9
  102. data/lib/erlang/messenger/src/utils.erl +7 -1
  103. data/lib/poolparty.rb +17 -23
  104. data/lib/poolparty/base_packages/poolparty.rb +1 -1
  105. data/lib/poolparty/core/string.rb +11 -2
  106. data/lib/poolparty/helpers/binary.rb +31 -0
  107. data/lib/poolparty/helpers/console.rb +25 -16
  108. data/lib/poolparty/helpers/nice_printer.rb +36 -0
  109. data/lib/poolparty/helpers/optioner.rb +8 -0
  110. data/lib/poolparty/helpers/provisioner_base.rb +7 -5
  111. data/lib/poolparty/helpers/provisioners/master.rb +1 -1
  112. data/lib/poolparty/helpers/provisioners/slave.rb +2 -1
  113. data/lib/poolparty/modules/cloud_resourcer.rb +1 -1
  114. data/lib/poolparty/modules/file_writer.rb +12 -1
  115. data/lib/poolparty/modules/resourcing_dsl.rb +2 -1
  116. data/lib/poolparty/monitors/base_monitor.rb +3 -0
  117. data/lib/poolparty/net/remoter.rb +13 -11
  118. data/lib/poolparty/pool/base.rb +25 -13
  119. data/lib/poolparty/pool/cloud.rb +32 -10
  120. data/lib/poolparty/pool/custom_resource.rb +16 -7
  121. data/lib/poolparty/pool/plugin_model.rb +2 -2
  122. data/lib/poolparty/pool/pool.rb +2 -2
  123. data/lib/poolparty/pool/resource.rb +25 -7
  124. data/lib/poolparty/pool/resources/class_package.rb +3 -2
  125. data/lib/poolparty/pool/resources/exec.rb +1 -1
  126. data/lib/poolparty/pool/resources/variable.rb +4 -0
  127. data/lib/poolparty/version.rb +1 -1
  128. data/poolparty.gemspec +13 -11
  129. data/spec/poolparty/core/hash_spec.rb +1 -1
  130. data/spec/poolparty/core/time_spec.rb +1 -1
  131. data/spec/poolparty/net/remote_spec.rb +1 -1
  132. data/spec/poolparty/pool/base_spec.rb +25 -20
  133. data/spec/poolparty/pool/cloud_spec.rb +50 -3
  134. data/spec/poolparty/pool/plugin_spec.rb +1 -0
  135. data/spec/poolparty/pool/resource_spec.rb +4 -3
  136. data/spec/poolparty/spec_helper.rb +3 -4
  137. data/tasks/deployment.rake +15 -3
  138. data/website/index.html +2 -2
  139. metadata +88 -46
  140. data/lib/erlang/messenger/Makefile +0 -15
  141. data/lib/erlang/messenger/lib/eunit/Makefile +0 -28
  142. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  143. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  144. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  145. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  146. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  147. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  148. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  149. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  150. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  151. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  152. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  153. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  154. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  155. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  156. data/lib/erlang/messenger/lib/eunit/src/Makefile +0 -46
  157. data/lib/poolparty/config/allowed_commands.yml +0 -1
  158. data/lib/poolparty/plugins/git.rb +0 -45
  159. data/spec/poolparty/plugins/git_spec.rb +0 -40
@@ -18,13 +18,14 @@
18
18
  terminate/2, code_change/3]).
19
19
 
20
20
  -record(state, {
21
- monitors = {} % Tuple of monitors
21
+ monitors = {}, % Tuple of monitors
22
+ stored_loads = ?DICT:new() % Dictionary of latest loads
22
23
  }).
23
24
  -define(SERVER, ?MODULE).
24
25
 
25
26
  % Client function definitions
26
27
  -export ([stop/0]).
27
- -export ([get_load_for_type/1, run_cmd/1, fire_cmd/1]).
28
+ -export ([get_current_load_for_type/1, run_cmd/1, fire_cmd/1]).
28
29
  -export ([run_reconfig/0, local_update/1, still_here/0, print_monitors/0]).
29
30
  -export ([server_location/0]).
30
31
  %%====================================================================
@@ -36,10 +37,40 @@
36
37
 
37
38
 
38
39
  % Get the load for the type sent...
39
- get_load_for_type(Type) ->
40
+ get_current_load_for_type(Type) ->
40
41
  String = string:concat(". /etc/profile && server-get-load -m ",Type),
41
- {os:cmd(String)}.
42
-
42
+ LatestLoad = os:cmd(String),
43
+ Load = gen_server:call(server_location(), {update_load, Type, LatestLoad}),
44
+ {Load}.
45
+
46
+ get_load_listing(Type, State) ->
47
+ % Find or create the stored node
48
+ case ?DICT:is_key(Type, State#state.stored_loads) of
49
+ true ->
50
+ LoadStore = ?DICT:fetch(Type, State#state.stored_loads),
51
+ {LoadStore, State};
52
+ false ->
53
+ LoadStore = [],
54
+ NewState = State#state{stored_loads = ?DICT:store(Type, LoadStore, State#state.stored_loads)},
55
+ {LoadStore, NewState}
56
+ end.
57
+
58
+ get_average_load_listing(Type, State) ->
59
+ {LoadListing, _} = get_load_listing(Type, State),
60
+ utils:average_of_list(LoadListing).
61
+ % Get the stored load for the type
62
+ % Only store the latest NUM_LOADS_TO_STORE in the stored_loads array
63
+ store_load_for_type(Type, Load, State) ->
64
+ {LoadStore, LoadListingState} = get_load_listing(Type, State),
65
+ LoadList = lists:reverse(LoadStore),
66
+ case length(LoadList) >= ?NUM_LOADS_TO_STORE of
67
+ true -> [_|T] = LoadList;
68
+ false -> T = LoadList
69
+ end,
70
+ NewStoredLoad = lists:append([Load], lists:reverse(T)),
71
+ NewState = State#state{stored_loads = ?DICT:store(Type, NewStoredLoad, LoadListingState#state.stored_loads)},
72
+ {Type, NewState}.
73
+
43
74
  % Rerun the configuration
44
75
  run_reconfig() -> gen_server:cast(server_location(), {run_reconfig}).
45
76
  print_monitors() -> gen_server:call(server_location(), {print_monitors}).
@@ -56,9 +87,9 @@ stop() -> gen_server:cast(server_location(), stop).
56
87
  % Run every UPDATE_TIME seconds
57
88
  local_update(Types) ->
58
89
  ?TRACE("Updating", [?MASTER_LOCATION]),
59
- net_adm:ping(?MASTER_LOCATION),
60
- Load = [{Ty, element(1, get_load_for_type(Ty))} || Ty <- Types],
61
- gen_server:cast(?MASTER_SERVER, {update_node_load, node(), Load}).
90
+ net_adm:ping(?MASTER_LOCATION), % check in with the master
91
+ Load = [{Ty, element(1, get_current_load_for_type(Ty))} || Ty <- Types],
92
+ gen_server:cast(?MASTER_SERVER, {update_node_load, node(), Load}).
62
93
 
63
94
  %%--------------------------------------------------------------------
64
95
  %% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
@@ -88,7 +119,8 @@ init(Args) ->
88
119
  process_flag(trap_exit, true),
89
120
  utils:start_timer(?UPDATE_TIME, fun() -> pm_node:local_update(Args) end),
90
121
  {ok, #state{
91
- monitors=Args
122
+ monitors=Args,
123
+ stored_loads = ?DICT:new()
92
124
  }}.
93
125
 
94
126
  %%--------------------------------------------------------------------
@@ -103,6 +135,11 @@ init(Args) ->
103
135
  handle_call({run_command, Cmd}, _From, State) ->
104
136
  Reply = os:cmd(". /etc/profile && server-fire-cmd \""++Cmd++"\""),
105
137
  {reply, Reply, State};
138
+ handle_call({update_load, Type, Load}, _From, State) ->
139
+ {Type, NewState} = store_load_for_type(Type, Load, State),
140
+ Reply = get_average_load_listing(Type, NewState),
141
+ ?TRACE("Updated load", [Reply]),
142
+ {reply, Reply, NewState};
106
143
  handle_call({still_there}, _From, State) ->
107
144
  Reply = still_here,
108
145
  {reply, Reply, State};
@@ -35,7 +35,13 @@ tick_timer(Time, Fun) ->
35
35
  end.
36
36
 
37
37
  average_of_list(L) ->
38
- Sum = lists:foldr( fun(Int, Sum) -> erlang:list_to_float(Int) + Sum end, 0, [F || F <- L] ),
38
+ Sum = lists:foldr( fun(Int, Sum) ->
39
+ case erlang:is_float(Int) of
40
+ true -> Integer = Int;
41
+ false -> Integer = erlang:list_to_float(Int)
42
+ end,
43
+ Integer + Sum
44
+ end, 0, [F || F <- L] ),
39
45
  average_for_list(Sum, L).
40
46
 
41
47
  % Get the average of the list
data/lib/poolparty.rb CHANGED
@@ -10,31 +10,25 @@ require 'rubygems'
10
10
  end
11
11
  end
12
12
 
13
+ require "#{File.dirname(__FILE__)}/poolparty/helpers/nice_printer"
14
+
13
15
  unless @required_software.empty?
14
- @num_lines = 45
15
- @centered_lines = @num_lines - 4
16
- def wrap_cline(line)
17
- "* #{line.center(@centered_lines)} *"
18
- end
19
- def wrap_lline(line)
20
- "* #{line.ljust(@centered_lines)} *"
21
- end
22
- def header
23
- "*"*@num_lines
24
- end
25
- empty_line = "* #{" ".ljust(@centered_lines)} *"
16
+ @np = NicePrinter.new(45)
17
+
26
18
  # error_initializing_message.txt
27
- puts header
28
- puts wrap_cline("Error")
29
- puts wrap_lline("Missing required software")
30
- puts @required_software.map {|a| wrap_lline(" #{a}") }
31
- puts wrap_lline("Please install the required software")
32
- puts wrap_lline("and try again")
33
- puts empty_line
34
- puts wrap_lline("Try installing #{@required_software.size == 1 ? "it" : "them"} with")
35
- puts @required_software.map {|a| wrap_lline(" gem install #{a}") }
36
- puts empty_line
37
- puts "*"*@num_lines
19
+ @np.header
20
+ @np.center("Error")
21
+ @np.left("Missing required software")
22
+ @required_software.map {|a| @np << " #{a}" }
23
+ @np << "Please install the required software"
24
+ @np << "and try again"
25
+ @np.empty
26
+ @np << "Try installing #{@required_software.size == 1 ? "it" : "them"} with"
27
+ @required_software.map {|a| @np << " gem install #{a}" }
28
+ @np.empty
29
+ @np.footer
30
+
31
+ @np.print
38
32
  exit(0)
39
33
  end
40
34
 
@@ -91,7 +91,7 @@ module PoolParty
91
91
  has_exec(:name => "start master messenger", :command => ". /etc/profile && server-start-master") #, :ifnot => "/bin/ps aux | /bin/grep -q pm_master"
92
92
  has_exec(:name => "start client server", :command => ". /etc/profile && server-start-client") #, :ifnot => "/bin/ps aux | /bin/grep -q client_server"
93
93
 
94
- has_cron({:name => "maintain script", :command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3", :requires => [get_gempackage("poolparty"), get_cron("puppetd runner"), get_cron("Load handler"), get_service("haproxy")]})
94
+ has_cron({:name => "maintain script", :command => ". /etc/profile && cloud-maintain -n #{cloud.name}", :minute => "*/3", :requires => [get_gempackage("poolparty"), get_cron("puppetd runner"), get_cron("Load handler"), get_service("haproxy")]})
95
95
 
96
96
  has_remotefile(:name => "/usr/bin/puppetcleaner") do
97
97
  mode 744
@@ -27,6 +27,15 @@ class String
27
27
  def sanitize
28
28
  self.gsub(/[ \.\/\-]*/, '')
29
29
  end
30
+ def keyerize
31
+ signed_short = 0x7FFFFFFF
32
+ len = self.sanitize.length
33
+ hash = 0
34
+ len.times{ |i|
35
+ hash = self[i] + ( hash << 6 ) + ( hash << 16 ) - hash
36
+ }
37
+ hash & signed_short
38
+ end
30
39
  def dir_safe
31
40
  self.downcase.gsub(/[ ]/, '_')
32
41
  end
@@ -65,8 +74,8 @@ class String
65
74
  klass
66
75
  end
67
76
 
68
- def module_constant(&block)
69
- symc = "#{self}_Module".classify
77
+ def module_constant(append="", &block)
78
+ symc = "#{self}_Module#{append}".classify
70
79
  mod = Object.const_defined?(symc) ? Object.const_get(symc.to_sym) : Module.new(&block)
71
80
  Object.const_set(symc, mod) unless Object.const_defined?(symc)
72
81
  symc.to_s.constantize
@@ -1,5 +1,22 @@
1
1
  require "ftools"
2
2
  module PoolParty
3
+
4
+ # Load a file that contains a pool into memory
5
+ def load_pool(filename)
6
+
7
+ unless filename && ::File.readable?(filename)
8
+ puts "Please specify your cloud with -s, move it to ./pool.spec or in your POOL_SPEC environment variable"
9
+ exit(1)
10
+ else
11
+ $pool_specfile = filename
12
+ PoolParty::Script.inflate(open(filename).read, filename)
13
+ end
14
+ end
15
+
16
+ def pool_specfile
17
+ $pool_specfile
18
+ end
19
+
3
20
  module Binary
4
21
 
5
22
  class << self
@@ -26,6 +43,20 @@ module PoolParty
26
43
  f unless ::File.readable?(f)
27
44
  end.first
28
45
  end
46
+ # Daemonize the process
47
+ def daemonize(&block)
48
+ vputs "Daemonizing..."
49
+ trap("CHLD") {Process.wait(-1, Process::WNOHANG)}
50
+ fork do
51
+ Signal.trap('HUP', 'IGNORE') # Don't die upon logout
52
+ File.open("/dev/null", "r+") do |devnull|
53
+ $stdout.reopen(devnull)
54
+ $stderr.reopen(devnull)
55
+ $stdin.reopen(devnull) unless @use_stdin
56
+ end
57
+ block.call if block
58
+ end
59
+ end
29
60
 
30
61
  end
31
62
 
@@ -5,23 +5,30 @@ module PoolParty
5
5
 
6
6
  include Display
7
7
 
8
- # Load a file that contains a pool into memory
9
- def load_pool(filename)
10
-
11
- unless filename && ::File.readable?(filename)
12
- puts "Please specify your cloud with -s, move it to ./pool.spec or in your POOL_SPEC environment variable"
13
- exit(1)
14
- else
15
- PoolParty::Script.inflate(open(filename).read, filename)
8
+ # Print help commands for the console
9
+ # level 0 - Basic help
10
+ # level 1 - Commands
11
+ def help(level=0)
12
+ @np = NicePrinter.new(60)
13
+ @np.header
14
+ @np.center "PoolParty console help"
15
+ @np.center "Basics"
16
+ @np << "Load your pool with load_pool(filename)"
17
+ @np << "Reference clouds with"
18
+ @np << "c = cloud :cloudname"
19
+ @np.empty
20
+ if level >= 1
21
+ @np.center "CloudSpeak"
22
+ @np << "All the commands set on your cloud can be called within the console"
23
+ @np << "list_of_running_instances - get list of running nodes"
24
+ @np << "list_of_pending_instances - get list of pending nodes"
25
+ @np << "available_monitors - get list of the available monitors on the cloud"
26
+ @np << " note: all monitors can be called as a method on the cloud"
27
+ @np << " i.e. CpuMonitor makes the method cpu available on the cloud"
28
+ @np.empty
16
29
  end
17
- end
18
-
19
- def extract_cloud_from_options(o)
20
- o.cloudname ? [cloud(o.cloudname.downcase.to_sym)] : clouds.collect {|n,cl| cl}
21
- end
22
-
23
- def extract_pool_from_options(o)
24
- o.poolname ? [pool(o.poolname.downcase.to_sym)] : pools.collect {|n,pl| pl}
30
+ @np.footer
31
+ @np.print
25
32
  end
26
33
 
27
34
  # Clear all the pools and reload the console
@@ -29,6 +36,8 @@ module PoolParty
29
36
  # as well
30
37
  def reload!
31
38
  reset!
39
+ require File.dirname(__FILE__) + "/../../../poolparty"
40
+ require File.dirname(__FILE__) + "/../../../poolpartycl"
32
41
  end
33
42
 
34
43
  end
@@ -0,0 +1,36 @@
1
+ class NicePrinter
2
+
3
+ attr_accessor :num_lines
4
+ attr_reader :centered_lines
5
+
6
+ def initialize(num_lines=60)
7
+ @num_lines = num_lines
8
+ @centered_lines = @num_lines - 4
9
+ end
10
+
11
+ def center(line)
12
+ lines << "* #{line.center(@centered_lines)} *"
13
+ end
14
+ def left(line)
15
+ lines << "* #{line.ljust(@centered_lines)} *"
16
+ end
17
+ def header
18
+ lines << "*"*@num_lines
19
+ end
20
+ def footer
21
+ header
22
+ end
23
+ def empty
24
+ lines << "* #{" ".ljust(@centered_lines)} *"
25
+ end
26
+ def print
27
+ puts lines.join("\n")
28
+ ""
29
+ end
30
+ def <<(line)
31
+ left(line)
32
+ end
33
+ def lines
34
+ @lines ||= []
35
+ end
36
+ end
@@ -92,4 +92,12 @@ module PoolParty
92
92
  end
93
93
 
94
94
  end
95
+
96
+ def extract_cloud_from_options(o)
97
+ o.cloudname ? [cloud(o.cloudname.downcase.to_sym)] : clouds.collect {|n,cl| cl}
98
+ end
99
+
100
+ def extract_pool_from_options(o)
101
+ o.poolname ? [pool(o.poolname.downcase.to_sym)] : pools.collect {|n,pl| pl}
102
+ end
95
103
  end
@@ -52,10 +52,11 @@ module PoolParty
52
52
 
53
53
  include Configurable
54
54
  include CloudResourcer
55
+ include FileWriter
55
56
 
56
- def initialize(instance,cloud=self, os=:ubuntu)
57
+ def initialize(instance,cld=self, os=:ubuntu)
57
58
  @instance = instance
58
- @cloud = cloud
59
+ @cloud = cld
59
60
 
60
61
  options(cloud.options) if cloud && cloud.respond_to?(:options)
61
62
  set_vars_from_options(instance.options) unless instance.nil? || !instance.options || !instance.options.empty?
@@ -88,7 +89,7 @@ module PoolParty
88
89
  def process_install!(testing=false)
89
90
  error unless valid?
90
91
  write_install_file
91
- setup_runner(@cloud)
92
+ setup_runner
92
93
 
93
94
  unless testing
94
95
  vputs "Logging on to #{@instance.ip} (#{@instance.name})"
@@ -128,7 +129,7 @@ module PoolParty
128
129
  def process_configure!(testing=false)
129
130
  error unless valid?
130
131
  write_configure_file
131
- setup_runner(@cloud)
132
+ setup_runner
132
133
 
133
134
  unless testing
134
135
  vputs "Logging on to #{@instance.ip}"
@@ -168,7 +169,7 @@ module PoolParty
168
169
  # Tasks that need to be performed everytime we do any
169
170
  # remote ssh'ing into any instance
170
171
  def setup_runner(force=false)
171
- @cloud.prepare_to_configuration
172
+ @cloud.prepare_for_configuration
172
173
  @cloud.build_and_store_new_config_file(force)
173
174
  end
174
175
  def valid?
@@ -283,6 +284,7 @@ module PoolParty
283
284
  def fix_rubygems
284
285
  <<-EOE
285
286
  #{installer_for("ruby rubygems")}
287
+ gem update --system # Force rubygems update
286
288
  echo '#{open(::File.join(template_directory, "gem")).read}' > /usr/bin/gem
287
289
  EOE
288
290
  end
@@ -192,7 +192,7 @@ cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolpa
192
192
  def restart_puppetd
193
193
  <<-EOS
194
194
  echo "Running puppet manifest"
195
- /bin/sh /usr/bin/puppetrunner
195
+ /usr/bin/puppetrunner
196
196
  EOS
197
197
  end
198
198
  def last_install_tasks
@@ -50,7 +50,8 @@ chmod +x /usr/bin/puppetrunner
50
50
 
51
51
  def last_install_tasks
52
52
  [
53
- "rm -rf /etc/puppet/ssl"
53
+ "rm -rf /etc/puppet/ssl",
54
+ "/usr/bin/puppetrerun"
54
55
  ]
55
56
  end
56
57
 
@@ -121,7 +121,7 @@ module PoolParty
121
121
  end
122
122
 
123
123
  def realize_plugins!
124
- plugin_store.each {|plugin| plugin.realize! }
124
+ plugin_store.each {|plugin| plugin.realize! if plugin }
125
125
  end
126
126
 
127
127
  def plugin_store
@@ -5,6 +5,11 @@ module PoolParty
5
5
  path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
6
6
  FileUtils.cp file, path unless file == path || ::File.exists?(path)
7
7
  end
8
+ def cleanup_storage_directory
9
+ Dir["#{Base.storage_directory}/**"].each do |f|
10
+ ::FileUtils.rm f if ::File.file?(f)
11
+ end
12
+ end
8
13
  def copy_template_to_storage_directory(file)
9
14
  make_template_directory
10
15
  path = ::File.join( Base.tmp_path, Base.template_directory, ::File.basename(file) )
@@ -17,6 +22,10 @@ module PoolParty
17
22
  end
18
23
  ::File.basename(path)
19
24
  end
25
+ def make_directory_in_storage_directory(dirname="newdir")
26
+ path = ::File.join( Base.storage_directory, dirname )
27
+ make_base_path path
28
+ end
20
29
  def write_to_file_in_storage_directory(file, str, preceded="", &block)
21
30
  path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
22
31
  write_to_file(path, str, &block)
@@ -70,7 +79,9 @@ module PoolParty
70
79
  path
71
80
  end
72
81
  def clear_base_directory
73
- FileUtils::rm_rf "#{Base.storage_directory}"
82
+ Dir["#{Base.storage_directory}/**"].each do |f|
83
+ ::FileUtils.rm f if ::File.file?(f)
84
+ end
74
85
  end
75
86
  end
76
87
  end