auser-poolparty 0.2.38 → 0.2.39

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 (45) hide show
  1. data/Manifest.txt +30 -1
  2. data/bin/cloud-maintain +11 -3
  3. data/bin/messenger-get-load +2 -1
  4. data/lib/erlang/cloudpanel/Makefile +5 -0
  5. data/lib/erlang/cloudpanel/doc/cloudpanel.html +39 -0
  6. data/lib/erlang/cloudpanel/doc/cloudpanel_app.html +40 -0
  7. data/lib/erlang/cloudpanel/doc/cloudpanel_deps.html +89 -0
  8. data/lib/erlang/cloudpanel/doc/cloudpanel_sup.html +46 -0
  9. data/lib/erlang/cloudpanel/doc/cloudpanel_web.html +45 -0
  10. data/lib/erlang/cloudpanel/ebin/cloudpanel.app +14 -0
  11. data/lib/erlang/cloudpanel/priv/www/images/bg_content.gif +0 -0
  12. data/lib/erlang/cloudpanel/priv/www/index.html +34 -0
  13. data/lib/erlang/cloudpanel/priv/www/javascripts/jquery.js +32 -0
  14. data/lib/erlang/cloudpanel/priv/www/stylesheets/application.css +48 -0
  15. data/lib/erlang/cloudpanel/priv/www/stylesheets/classes.css +2 -0
  16. data/lib/erlang/cloudpanel/priv/www/stylesheets/colors.css +8 -0
  17. data/lib/erlang/cloudpanel/priv/www/stylesheets/nav.css +18 -0
  18. data/lib/erlang/cloudpanel/src/Makefile +9 -0
  19. data/lib/erlang/cloudpanel/src/cloudpanel.app +14 -0
  20. data/lib/erlang/cloudpanel/src/cloudpanel.erl +30 -0
  21. data/lib/erlang/cloudpanel/src/cloudpanel.hrl +1 -0
  22. data/lib/erlang/cloudpanel/src/cloudpanel_app.erl +22 -0
  23. data/lib/erlang/cloudpanel/src/cloudpanel_deps.erl +84 -0
  24. data/lib/erlang/cloudpanel/src/cloudpanel_sup.erl +54 -0
  25. data/lib/erlang/cloudpanel/src/cloudpanel_web.erl +45 -0
  26. data/lib/erlang/cloudpanel/start-dev.sh +3 -0
  27. data/lib/erlang/cloudpanel/start.sh +3 -0
  28. data/lib/erlang/cloudpanel/support/include.mk +46 -0
  29. data/lib/poolparty.rb +1 -1
  30. data/lib/poolparty/aska/aska.rb +9 -7
  31. data/lib/poolparty/base_packages/haproxy.rb +1 -1
  32. data/lib/poolparty/base_packages/poolparty.rb +2 -2
  33. data/lib/poolparty/helpers/provisioner_base.rb +10 -2
  34. data/lib/poolparty/monitors/base_monitor.rb +3 -3
  35. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +1 -1
  36. data/lib/poolparty/net/messenger.rb +1 -1
  37. data/lib/poolparty/net/remote_instance.rb +1 -1
  38. data/lib/poolparty/net/remoter.rb +8 -3
  39. data/lib/poolparty/pool/base.rb +9 -1
  40. data/lib/poolparty/templates/puppetcleaner +1 -0
  41. data/lib/poolparty/version.rb +1 -1
  42. data/poolparty.gemspec +32 -3
  43. data/spec/poolparty/monitors/base_monitor_spec.rb +8 -0
  44. data/website/index.html +1 -1
  45. metadata +32 -3
@@ -0,0 +1,2 @@
1
+ .clear {
2
+ clear: both; }
@@ -0,0 +1,8 @@
1
+ .blue {
2
+ color: #0077CC; }
3
+
4
+ .dark {
5
+ color: #333333; }
6
+
7
+ .offwhite {
8
+ color: #EEEEEE; }
@@ -0,0 +1,18 @@
1
+ #nav {
2
+ padding-right: 0 10px;
3
+ margin: 0 10px 10px 0; }
4
+ #nav #navmenu ul {
5
+ display: inline;
6
+ list-style-type: none; }
7
+ #nav #navmenu ul li {
8
+ padding: 0;
9
+ margin: 0; }
10
+ #nav #navmenu ul a {
11
+ color: #FFF;
12
+ background: #036;
13
+ display: block;
14
+ padding: .3em 0;
15
+ text-decoration: none; }
16
+ #nav #navmenu ul a:hover {
17
+ background: #369;
18
+ color: #EEE; }
@@ -0,0 +1,9 @@
1
+ include ../support/include.mk
2
+
3
+ all: $(EBIN_FILES)
4
+
5
+ debug:
6
+ $(MAKE) DEBUG=-DDEBUG
7
+
8
+ clean:
9
+ rm -rf $(EBIN_FILES)
@@ -0,0 +1,14 @@
1
+ {application, cloudpanel,
2
+ [{description, "cloudpanel"},
3
+ {vsn, "0.01"},
4
+ {modules, [
5
+ cloudpanel,
6
+ cloudpanel_app,
7
+ cloudpanel_sup,
8
+ cloudpanel_web,
9
+ cloudpanel_deps
10
+ ]},
11
+ {registered, []},
12
+ {mod, {cloudpanel_app, []}},
13
+ {env, []},
14
+ {applications, [kernel, stdlib, crypto]}]}.
@@ -0,0 +1,30 @@
1
+ %% @author author <author@example.com>
2
+ %% @copyright YYYY author.
3
+
4
+ %% @doc TEMPLATE.
5
+
6
+ -module(cloudpanel).
7
+ -author('author <author@example.com>').
8
+ -export([start/0, stop/0]).
9
+
10
+ ensure_started(App) ->
11
+ case application:start(App) of
12
+ ok ->
13
+ ok;
14
+ {error, {already_started, App}} ->
15
+ ok
16
+ end.
17
+
18
+ %% @spec start() -> ok
19
+ %% @doc Start the cloudpanel server.
20
+ start() ->
21
+ cloudpanel_deps:ensure(),
22
+ ensure_started(crypto),
23
+ application:start(cloudpanel).
24
+
25
+ %% @spec stop() -> ok
26
+ %% @doc Stop the cloudpanel server.
27
+ stop() ->
28
+ Res = application:stop(cloudpanel),
29
+ application:stop(crypto),
30
+ Res.
@@ -0,0 +1,22 @@
1
+ %% @author author <author@example.com>
2
+ %% @copyright YYYY author.
3
+
4
+ %% @doc Callbacks for the cloudpanel application.
5
+
6
+ -module(cloudpanel_app).
7
+ -author('author <author@example.com>').
8
+
9
+ -behaviour(application).
10
+ -export([start/2,stop/1]).
11
+
12
+
13
+ %% @spec start(_Type, _StartArgs) -> ServerRet
14
+ %% @doc application start callback for cloudpanel.
15
+ start(_Type, _StartArgs) ->
16
+ cloudpanel_deps:ensure(),
17
+ cloudpanel_sup:start_link().
18
+
19
+ %% @spec stop(_State) -> ServerRet
20
+ %% @doc application stop callback for cloudpanel.
21
+ stop(_State) ->
22
+ ok.
@@ -0,0 +1,84 @@
1
+ %% @author author <author@example.com>
2
+ %% @copyright YYYY author.
3
+
4
+ %% @doc Ensure that the relatively-installed dependencies are on the code
5
+ %% loading path, and locate resources relative
6
+ %% to this application's path.
7
+
8
+ -module(cloudpanel_deps).
9
+ -author('author <author@example.com>').
10
+
11
+ -export([ensure/0, ensure/1]).
12
+ -export([get_base_dir/0, get_base_dir/1]).
13
+ -export([local_path/1, local_path/2]).
14
+ -export([deps_on_path/0, new_siblings/1]).
15
+
16
+ %% @spec deps_on_path() -> [ProjNameAndVers]
17
+ %% @doc List of project dependencies on the path.
18
+ deps_on_path() ->
19
+ F = fun (X, Acc) ->
20
+ ProjDir = filename:dirname(X),
21
+ case {filename:basename(X),
22
+ filename:basename(filename:dirname(ProjDir))} of
23
+ {"ebin", "deps"} ->
24
+ [filename:basename(ProjDir) | Acc];
25
+ _ ->
26
+ Acc
27
+ end
28
+ end,
29
+ ordsets:from_list(lists:foldl(F, [], code:get_path())).
30
+
31
+ %% @spec new_siblings(Module) -> [Dir]
32
+ %% @doc Find new siblings paths relative to Module that aren't already on the
33
+ %% code path.
34
+ new_siblings(Module) ->
35
+ Existing = deps_on_path(),
36
+ SiblingEbin = filelib:wildcard(local_path(["deps", "*", "ebin"], Module)),
37
+ Siblings = [filename:dirname(X) || X <- SiblingEbin,
38
+ ordsets:is_element(
39
+ filename:basename(filename:dirname(X)),
40
+ Existing) =:= false],
41
+ lists:filter(fun filelib:is_dir/1,
42
+ lists:append([[filename:join([X, "ebin"]),
43
+ filename:join([X, "include"])] ||
44
+ X <- Siblings])).
45
+
46
+
47
+ %% @spec ensure(Module) -> ok
48
+ %% @doc Ensure that all ebin and include paths for dependencies
49
+ %% of the application for Module are on the code path.
50
+ ensure(Module) ->
51
+ code:add_paths(new_siblings(Module)),
52
+ code:clash(),
53
+ ok.
54
+
55
+ %% @spec ensure() -> ok
56
+ %% @doc Ensure that the ebin and include paths for dependencies of
57
+ %% this application are on the code path. Equivalent to
58
+ %% ensure(?Module).
59
+ ensure() ->
60
+ ensure(?MODULE).
61
+
62
+ %% @spec get_base_dir(Module) -> string()
63
+ %% @doc Return the application directory for Module. It assumes Module is in
64
+ %% a standard OTP layout application in the ebin or src directory.
65
+ get_base_dir(Module) ->
66
+ {file, Here} = code:is_loaded(Module),
67
+ filename:dirname(filename:dirname(Here)).
68
+
69
+ %% @spec get_base_dir() -> string()
70
+ %% @doc Return the application directory for this application. Equivalent to
71
+ %% get_base_dir(?MODULE).
72
+ get_base_dir() ->
73
+ get_base_dir(?MODULE).
74
+
75
+ %% @spec local_path([string()], Module) -> string()
76
+ %% @doc Return an application-relative directory from Module's application.
77
+ local_path(Components, Module) ->
78
+ filename:join([get_base_dir(Module) | Components]).
79
+
80
+ %% @spec local_path(Components) -> string()
81
+ %% @doc Return an application-relative directory for this application.
82
+ %% Equivalent to local_path(Components, ?MODULE).
83
+ local_path(Components) ->
84
+ local_path(Components, ?MODULE).
@@ -0,0 +1,54 @@
1
+ %% @author author <author@example.com>
2
+ %% @copyright YYYY author.
3
+
4
+ %% @doc Supervisor for the cloudpanel application.
5
+
6
+ -module(cloudpanel_sup).
7
+ -author('author <author@example.com>').
8
+
9
+ -behaviour(supervisor).
10
+
11
+ %% External exports
12
+ -export([start_link/0, upgrade/0]).
13
+
14
+ %% supervisor callbacks
15
+ -export([init/1]).
16
+
17
+ %% @spec start_link() -> ServerRet
18
+ %% @doc API for starting the supervisor.
19
+ start_link() ->
20
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
21
+
22
+ %% @spec upgrade() -> ok
23
+ %% @doc Add processes if necessary.
24
+ upgrade() ->
25
+ {ok, {_, Specs}} = init([]),
26
+
27
+ Old = sets:from_list(
28
+ [Name || {Name, _, _, _} <- supervisor:which_children(?MODULE)]),
29
+ New = sets:from_list([Name || {Name, _, _, _, _, _} <- Specs]),
30
+ Kill = sets:subtract(Old, New),
31
+
32
+ sets:fold(fun (Id, ok) ->
33
+ supervisor:terminate_child(?MODULE, Id),
34
+ supervisor:delete_child(?MODULE, Id),
35
+ ok
36
+ end, ok, Kill),
37
+
38
+ [supervisor:start_child(?MODULE, Spec) || Spec <- Specs],
39
+ ok.
40
+
41
+ %% @spec init([]) -> SupervisorTree
42
+ %% @doc supervisor callback.
43
+ init([]) ->
44
+ Ip = case os:getenv("MOCHIWEB_IP") of false -> "0.0.0.0"; Any -> Any end,
45
+ WebConfig = [
46
+ {ip, Ip},
47
+ {port, 8000},
48
+ {docroot, cloudpanel_deps:local_path(["priv", "www"])}],
49
+ Web = {cloudpanel_web,
50
+ {cloudpanel_web, start, [WebConfig]},
51
+ permanent, 5000, worker, dynamic},
52
+
53
+ Processes = [Web],
54
+ {ok, {{one_for_one, 10, 10}, Processes}}.
@@ -0,0 +1,45 @@
1
+ %% @author Ari Lerner <ari.lerner@citrusbyte.com>
2
+ %% @copyright 2008 Ari Lerner.
3
+
4
+ %% @doc PoolParty panel
5
+
6
+ -module (cloudpanel_web).
7
+ -author('Ari Lerner <ari.lerner@citrusbyte.com>').
8
+
9
+ -export([start/1, stop/0, loop/2]).
10
+
11
+ -define(TIMEOUT, 20000).
12
+
13
+ %% External API
14
+
15
+ start(Options) ->
16
+ {DocRoot, Options1} = get_option(docroot, Options),
17
+ Loop = fun (Req) ->
18
+ ?MODULE:loop(Req, DocRoot)
19
+ end,
20
+ mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).
21
+
22
+ stop() ->
23
+ mochiweb_http:stop(?MODULE).
24
+
25
+ loop(Req, DocRoot) ->
26
+ "/" ++ Path = Req:get(path),
27
+ case Req:get(method) of
28
+ Method when Method =:= 'GET'; Method =:= 'HEAD' ->
29
+ case Path of
30
+ _ ->
31
+ Req:serve_file(Path, DocRoot)
32
+ end;
33
+ 'POST' ->
34
+ case Path of
35
+ _ ->
36
+ Req:not_found()
37
+ end;
38
+ _ ->
39
+ Req:respond({501, [], []})
40
+ end.
41
+
42
+ %% Internal API
43
+
44
+ get_option(Option, Options) ->
45
+ {proplists:get_value(Option, Options), proplists:delete(Option, Options)}.
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ cd `dirname $0`
3
+ exec erl -pa $PWD/ebin $PWD/deps/*/ebin -boot start_sasl -s reloader -s cloudpanel
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ cd `dirname $0`
3
+ exec erl -pa $PWD/ebin $PWD/deps/*/ebin -boot start_sasl -s cloudpanel
@@ -0,0 +1,46 @@
1
+ ## -*- makefile -*-
2
+
3
+ ######################################################################
4
+ ## Erlang
5
+
6
+ ERL := erl
7
+ ERLC := $(ERL)c
8
+
9
+ INCLUDE_DIRS := ../include $(wildcard ../deps/*/include)
10
+ EBIN_DIRS := $(wildcard ../deps/*/ebin)
11
+ ERLC_FLAGS := -W $(INCLUDE_DIRS:../%=-I ../%) $(EBIN_DIRS:%=-pa %)
12
+
13
+ ifndef no_debug_info
14
+ ERLC_FLAGS += +debug_info
15
+ endif
16
+
17
+ ifdef debug
18
+ ERLC_FLAGS += -Ddebug
19
+ endif
20
+
21
+ EBIN_DIR := ../ebin
22
+ DOC_DIR := ../doc
23
+ EMULATOR := beam
24
+
25
+ ERL_SOURCES := $(wildcard *.erl)
26
+ ERL_HEADERS := $(wildcard *.hrl) $(wildcard ../include/*.hrl)
27
+ ERL_OBJECTS := $(ERL_SOURCES:%.erl=$(EBIN_DIR)/%.$(EMULATOR))
28
+ ERL_DOCUMENTS := $(ERL_SOURCES:%.erl=$(DOC_DIR)/%.html)
29
+ ERL_OBJECTS_LOCAL := $(ERL_SOURCES:%.erl=./%.$(EMULATOR))
30
+ APP_FILES := $(wildcard *.app)
31
+ EBIN_FILES = $(ERL_OBJECTS) $(ERL_DOCUMENTS) $(APP_FILES:%.app=../ebin/%.app)
32
+ EBIN_FILES_NO_DOCS = $(ERL_OBJECTS) $(APP_FILES:%.app=../ebin/%.app)
33
+ MODULES = $(ERL_SOURCES:%.erl=%)
34
+
35
+ ../ebin/%.app: %.app
36
+ cp $< $@
37
+
38
+ $(EBIN_DIR)/%.$(EMULATOR): %.erl
39
+ $(ERLC) $(ERLC_FLAGS) -o $(EBIN_DIR) $<
40
+
41
+ ./%.$(EMULATOR): %.erl
42
+ $(ERLC) $(ERLC_FLAGS) -o . $<
43
+
44
+ $(DOC_DIR)/%.html: %.erl
45
+ $(ERL) -noshell -run edoc file $< -run init stop
46
+ mv *.html $(DOC_DIR)
@@ -16,7 +16,7 @@ ActiveSupport::Dependencies.load_paths << File.dirname(__FILE__)
16
16
  ## Load PoolParty
17
17
  require "#{File.dirname(__FILE__)}/poolparty/version"
18
18
 
19
- %w(core modules exceptions aska dependency_resolutions monitors net).each do |dir|
19
+ %w(core modules exceptions dependency_resolutions aska monitors net).each do |dir|
20
20
  Dir[File.dirname(__FILE__) + "/poolparty/#{dir}/**.rb"].each do |file|
21
21
  require file
22
22
  end
@@ -4,7 +4,7 @@
4
4
  =end
5
5
  module Aska
6
6
  module ClassMethods
7
- def rules(name=:rules, arr=[])
7
+ def rules(name=:rules, arr=[], create_vars=true)
8
8
  returning look_up_rules(name) do |rs|
9
9
  arr.each do |line|
10
10
  next unless line
@@ -12,7 +12,7 @@ module Aska
12
12
  v = line[/(.+)[=\\<>](.*)/, 2].gsub(/\s+/, '')
13
13
  m = line[/[=\\<>]/, 0].gsub(/\s+/, '')
14
14
 
15
- create_instance_variable(k)
15
+ create_instance_variable(k, create_vars)
16
16
  rs << {k => [m, v]}
17
17
  rs << {k => [">", "0"]} unless rs.reject {|a| a.to_s == "#{k}>0" }
18
18
  end
@@ -21,10 +21,12 @@ module Aska
21
21
  end
22
22
  end
23
23
  end
24
- def create_instance_variable(k)
24
+ def create_instance_variable(k, create_vars=true)
25
25
  aska_attr_accessors << k.to_sym unless aska_attr_accessors.include?(k.to_sym)
26
- attr_reader k.to_sym unless respond_to?("#{k}".to_sym)
27
- attr_writer k.to_sym unless respond_to?("#{k}=".to_sym)
26
+ if create_vars
27
+ attr_reader k.to_sym unless respond_to?("#{k}".to_sym)
28
+ attr_writer k.to_sym unless respond_to?("#{k}=".to_sym)
29
+ end
28
30
  end
29
31
  def look_up_rules(name)
30
32
  defined_rules[name.to_sym] ||= Rules.new
@@ -70,10 +72,10 @@ module Aska
70
72
  def rules_values
71
73
  returning Array.new do |arr|
72
74
  self.class.defined_rules.each do |name,rule_array|
73
- arr << name
75
+ arr << "#{name} : #{valid_rule?(rule_array)}"
74
76
  rule_array.each do |rule|
75
77
  rule.map do |k,v|
76
- arr << "#{k} -> #{__aska_aska_stuff(k)} (#{v[0]} #{v[1]})"
78
+ arr << " #{k} -> #{__aska_aska_stuff(k)} (#{v[0]} #{v[1]})"
77
79
  end
78
80
  end
79
81
  end
@@ -4,7 +4,7 @@ module PoolParty
4
4
 
5
5
  def enable
6
6
  execute_on_master do
7
- package({:name => "haproxy"})
7
+ has_package({:name => "haproxy"})
8
8
 
9
9
  # Restart sysklogd after we update the haproxy.log
10
10
  has_service(:name => "sysklogd") do
@@ -40,8 +40,8 @@ module PoolParty
40
40
 
41
41
  has_gempackage(:name => "poolparty-latest", :download_url => "http://github.com/auser/poolparty/tree/master%2Fpkg%2Fpoolparty-latest.gem?raw=true", :requires => [get_gempackage("ruby2ruby"), get_gempackage("RubyInline"), get_gempackage("ParseTree")])
42
42
 
43
- has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger", :requires => get_gempackage("poolparty-latest"), :ifnot => "ps aux | grep beam | grep node")
44
- has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node", :requires => get_exec("build_messenger"), :ifnot => "ps aux | grep beam | grep node")
43
+ has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger", :requires => get_gempackage("poolparty-latest"), :onlyif => "ps aux | grep beam | grep node")
44
+ has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node", :requires => get_exec("build_messenger"), :onlyif => "ps aux | grep beam | grep node")
45
45
 
46
46
  end
47
47
 
@@ -93,6 +93,8 @@ module PoolParty
93
93
 
94
94
  before_install(@instance)
95
95
 
96
+ process_clean_reconfigure_for!(@instance, testing)
97
+
96
98
  vputs "Logging in and running provisioning on #{@instance.name}"
97
99
  cmd = "cd #{Base.remote_storage_path} && chmod +x install_#{name}.sh && /bin/sh install_#{name}.sh; rm install_#{name}.sh"
98
100
  verbose ? @cloud.run_command_on(cmd, @instance) : hide_output {@cloud.run_command_on(cmd, @instance)}
@@ -136,8 +138,9 @@ module PoolParty
136
138
  vputs "Cleaning certs from master: #{instance.name}"
137
139
  # puppetca --clean #{instance.name}.compute-1.internal; puppetca --clean #{instance.name}.ec2.internal
138
140
  # find /etc/puppet/ssl -type f -exec rm {} \;
139
- command = instance.master? ? "if [ -f '/usr/bin/puppetcleaner' ]; then /usr/bin/env puppetcleaner; fi" : "rm -rf /etc/puppet/ssl"
140
- @cloud.run_command_on(command, instance) unless testing
141
+ @cloud.run_command_on("rm -rf /etc/puppet/ssl", instance) unless testing || instance.master?
142
+ # @cloud.run_command_on("if [ -f '/usr/bin/puppetcleaner' ]; then /usr/bin/env puppetcleaner; fi", @cloud.master) unless testing
143
+ @cloud.run_command_on("puppetca --clean #{instance.name}.compute-1.internal ; puppetca --clean #{instance.name}.ec2.internal", @cloud.master) unless testing
141
144
  end
142
145
  def process_reconfigure!(testing=false)
143
146
  @cloud.run_command_on(RemoteInstance.puppet_runner_command, @instance) unless testing
@@ -182,6 +185,7 @@ module PoolParty
182
185
  "#!/usr/bin/env sh",
183
186
  upgrade_system,
184
187
  fix_rubygems,
188
+ make_logger_directory,
185
189
  install_puppet,
186
190
  custom_install_tasks
187
191
  ] << install_tasks
@@ -293,6 +297,10 @@ fi
293
297
  "#{installer_for( puppet_packages )}"
294
298
  end
295
299
 
300
+ def make_logger_directory
301
+ "mkdir -p /var/logs/poolparty"
302
+ end
303
+
296
304
  def create_poolparty_manifest
297
305
  <<-EOS
298
306
  cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes