auser-poolparty 0.2.38 → 0.2.39

Sign up to get free protection for your applications and to get access to all the features.
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