auser-poolparty 0.1.2 → 0.2.2
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.
- data/History.txt +22 -0
- data/License.txt +20 -0
- data/README.txt +52 -0
- data/Rakefile +4 -109
- data/bin/cloud +31 -0
- data/bin/cloud-add-keypair +23 -0
- data/bin/cloud-configure +35 -0
- data/bin/cloud-contract +27 -0
- data/bin/cloud-expand +27 -0
- data/bin/cloud-list +32 -0
- data/bin/cloud-maintain +36 -0
- data/bin/cloud-provision +30 -0
- data/bin/cloud-reconfigure +24 -0
- data/bin/cloud-ssh +18 -0
- data/bin/cloud-start +29 -0
- data/bin/pool +23 -75
- data/bin/pool-console +12 -0
- data/bin/pool-describe +9 -0
- data/bin/pool-list +28 -0
- data/bin/pool-provision +34 -0
- data/bin/pool-spec +17 -0
- data/bin/pool-start +32 -0
- data/examples/basic.rb +20 -0
- data/examples/plugin_without_plugin_directory.rb +13 -0
- data/examples/poolparty.rb +12 -0
- data/examples/with_apache_plugin.rb +22 -0
- data/generators/poolspec/USAGE +5 -0
- data/generators/poolspec/poolspec_generator.rb +65 -0
- data/generators/poolspec/templates/pool_spec_template.erb +9 -0
- data/lib/erlang/eb_server.erl +27 -0
- data/lib/poolparty.rb +40 -116
- data/lib/poolparty/base_packages/haproxy.rb +41 -0
- data/lib/poolparty/base_packages/heartbeat.rb +43 -0
- data/lib/poolparty/base_packages/poolparty.rb +18 -0
- data/lib/poolparty/base_packages/ruby.rb +27 -0
- data/lib/poolparty/core/array.rb +24 -0
- data/lib/{core → poolparty/core}/exception.rb +0 -0
- data/lib/{core → poolparty/core}/float.rb +0 -0
- data/lib/poolparty/core/hash.rb +29 -0
- data/lib/poolparty/core/kernel.rb +34 -0
- data/lib/{core → poolparty/core}/module.rb +18 -0
- data/lib/poolparty/core/my_open_struct.rb +18 -0
- data/lib/poolparty/core/object.rb +54 -0
- data/lib/poolparty/core/proc.rb +2 -0
- data/lib/poolparty/core/string.rb +72 -0
- data/lib/poolparty/core/symbol.rb +8 -0
- data/lib/{core → poolparty/core}/time.rb +15 -0
- data/lib/poolparty/exceptions/RemoteException.rb +12 -0
- data/lib/poolparty/exceptions/ResourceException.rb +7 -0
- data/lib/poolparty/exceptions/RuntimeException.rb +7 -0
- data/lib/poolparty/exceptions/SpecException.rb +7 -0
- data/lib/poolparty/exceptions/TemplateNotFound.rb +7 -0
- data/lib/poolparty/helpers/binary.rb +30 -0
- data/lib/poolparty/helpers/console.rb +30 -0
- data/lib/poolparty/helpers/display.rb +25 -0
- data/lib/poolparty/helpers/optioner.rb +61 -0
- data/lib/poolparty/helpers/provisioner_base.rb +226 -0
- data/lib/poolparty/helpers/provisioners/master.rb +120 -0
- data/lib/poolparty/helpers/provisioners/slave.rb +52 -0
- data/lib/poolparty/modules/cloud_resourcer.rb +72 -0
- data/lib/poolparty/modules/configurable.rb +34 -0
- data/lib/poolparty/modules/definable_resource.rb +59 -0
- data/lib/poolparty/modules/file_writer.rb +55 -0
- data/lib/poolparty/modules/method_missing_sugar.rb +17 -0
- data/lib/poolparty/modules/output.rb +13 -0
- data/lib/poolparty/modules/pretty_printer.rb +38 -0
- data/lib/{core/string.rb → poolparty/modules/s3_string.rb} +5 -29
- data/lib/{modules → poolparty/modules}/safe_instance.rb +0 -0
- data/lib/poolparty/monitors/base_monitor.rb +16 -0
- data/lib/poolparty/net/remote.rb +35 -0
- data/lib/poolparty/net/remote_bases/ec2.rb +145 -0
- data/lib/poolparty/net/remote_instance.rb +68 -0
- data/lib/poolparty/net/remoter.rb +209 -0
- data/lib/poolparty/net/remoter_base.rb +117 -0
- data/lib/poolparty/plugins/gem_package.rb +39 -0
- data/lib/poolparty/plugins/line.rb +76 -0
- data/lib/poolparty/plugins/svn.rb +48 -0
- data/lib/poolparty/pool/base.rb +74 -0
- data/lib/poolparty/pool/cloud.rb +132 -0
- data/lib/poolparty/pool/custom_resource.rb +61 -0
- data/lib/poolparty/pool/loggable.rb +29 -0
- data/lib/poolparty/pool/plugin.rb +42 -0
- data/lib/poolparty/pool/plugin_model.rb +48 -0
- data/lib/poolparty/pool/pool.rb +55 -0
- data/lib/poolparty/pool/resource.rb +235 -0
- data/lib/poolparty/pool/resources/class_package.rb +60 -0
- data/lib/poolparty/pool/resources/cron.rb +14 -0
- data/lib/poolparty/pool/resources/directory.rb +23 -0
- data/lib/poolparty/pool/resources/exec.rb +26 -0
- data/lib/poolparty/pool/resources/file.rb +23 -0
- data/lib/poolparty/pool/resources/gem.rb +14 -0
- data/lib/poolparty/pool/resources/host.rb +14 -0
- data/lib/poolparty/pool/resources/package.rb +14 -0
- data/lib/poolparty/pool/resources/remote_file.rb +20 -0
- data/lib/poolparty/pool/resources/service.rb +21 -0
- data/lib/poolparty/pool/resources/sshkey.rb +19 -0
- data/lib/poolparty/pool/resources/variable.rb +27 -0
- data/lib/poolparty/pool/script.rb +21 -0
- data/{config/heartbeat_authkeys.conf → lib/poolparty/templates/authkeys} +0 -0
- data/lib/poolparty/templates/cib.xml +1 -0
- data/lib/poolparty/templates/fileserver.conf +4 -0
- data/{config/heartbeat.conf → lib/poolparty/templates/ha.cf} +3 -1
- data/{config → lib/poolparty/templates}/haproxy.conf +13 -6
- data/lib/poolparty/templates/namespaceauth.conf +19 -0
- data/lib/poolparty/templates/puppet.conf +13 -0
- data/lib/poolparty/version.rb +9 -0
- data/lib/poolpartycl.rb +3 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/{lib/poolparty/tasks → tasks}/cloud.rake +1 -1
- data/tasks/deployment.rake +34 -0
- data/tasks/development.rake +78 -0
- data/{lib/poolparty/tasks → tasks}/ec2.rake +1 -1
- data/tasks/environment.rake +7 -0
- data/{lib/poolparty/tasks → tasks}/instance.rake +0 -0
- data/{lib/poolparty/tasks → tasks}/server.rake +0 -0
- data/tasks/spec.rake +17 -0
- data/tasks/website.rake +17 -0
- metadata +154 -249
- data/CHANGELOG +0 -23
- data/LICENSE +0 -22
- data/README +0 -139
- data/assets/clouds.png +0 -0
- data/bin/instance +0 -68
- data/bin/poolnotify +0 -34
- data/config/cloud_master_takeover +0 -17
- data/config/create_proxy_ami.sh +0 -582
- data/config/installers/ubuntu_install.sh +0 -77
- data/config/monit.conf +0 -9
- data/config/monit/haproxy.monit.conf +0 -8
- data/config/monit/nginx.monit.conf +0 -0
- data/config/nginx.conf +0 -24
- data/config/reconfigure_instances_script.sh +0 -37
- data/config/sample-config.yml +0 -23
- data/config/scp_instances_script.sh +0 -12
- data/lib/core/array.rb +0 -16
- data/lib/core/hash.rb +0 -11
- data/lib/core/kernel.rb +0 -12
- data/lib/core/object.rb +0 -21
- data/lib/core/proc.rb +0 -15
- data/lib/helpers/plugin_spec_helper.rb +0 -58
- data/lib/modules/callback.rb +0 -133
- data/lib/modules/ec2_wrapper.rb +0 -108
- data/lib/modules/file_writer.rb +0 -38
- data/lib/modules/sprinkle_overrides.rb +0 -27
- data/lib/modules/vlad_override.rb +0 -83
- data/lib/poolparty/application.rb +0 -199
- data/lib/poolparty/init.rb +0 -6
- data/lib/poolparty/master.rb +0 -492
- data/lib/poolparty/monitors.rb +0 -11
- data/lib/poolparty/monitors/cpu.rb +0 -23
- data/lib/poolparty/monitors/memory.rb +0 -33
- data/lib/poolparty/monitors/web.rb +0 -29
- data/lib/poolparty/optioner.rb +0 -20
- data/lib/poolparty/plugin.rb +0 -78
- data/lib/poolparty/provider.rb +0 -104
- data/lib/poolparty/provider/essential.rb +0 -6
- data/lib/poolparty/provider/git.rb +0 -8
- data/lib/poolparty/provider/haproxy.rb +0 -9
- data/lib/poolparty/provider/heartbeat.rb +0 -6
- data/lib/poolparty/provider/rsync.rb +0 -8
- data/lib/poolparty/provider/ruby.rb +0 -65
- data/lib/poolparty/provider/s3fuse.rb +0 -22
- data/lib/poolparty/remote_instance.rb +0 -250
- data/lib/poolparty/remoter.rb +0 -171
- data/lib/poolparty/remoting.rb +0 -137
- data/lib/poolparty/scheduler.rb +0 -93
- data/lib/poolparty/tasks.rb +0 -47
- data/lib/poolparty/tasks/development.rake +0 -78
- data/lib/poolparty/tasks/plugins.rake +0 -30
- data/lib/poolparty/thread_pool.rb +0 -94
- data/lib/s3/s3_object_store_folders.rb +0 -44
- data/poolparty.gemspec +0 -71
- data/spec/files/describe_response +0 -37
- data/spec/files/multi_describe_response +0 -69
- data/spec/files/remote_desc_response +0 -37
- data/spec/helpers/ec2_mock.rb +0 -57
- data/spec/lib/core/core_spec.rb +0 -26
- data/spec/lib/core/kernel_spec.rb +0 -24
- data/spec/lib/core/string_spec.rb +0 -28
- data/spec/lib/modules/callback_spec.rb +0 -213
- data/spec/lib/modules/file_writer_spec.rb +0 -74
- data/spec/lib/poolparty/application_spec.rb +0 -135
- data/spec/lib/poolparty/ec2_wrapper_spec.rb +0 -110
- data/spec/lib/poolparty/master_spec.rb +0 -479
- data/spec/lib/poolparty/optioner_spec.rb +0 -34
- data/spec/lib/poolparty/plugin_spec.rb +0 -115
- data/spec/lib/poolparty/poolparty_spec.rb +0 -60
- data/spec/lib/poolparty/provider_spec.rb +0 -74
- data/spec/lib/poolparty/remote_instance_spec.rb +0 -178
- data/spec/lib/poolparty/remoter_spec.rb +0 -72
- data/spec/lib/poolparty/remoting_spec.rb +0 -148
- data/spec/lib/poolparty/scheduler_spec.rb +0 -70
- data/spec/monitors/cpu_monitor_spec.rb +0 -39
- data/spec/monitors/memory_spec.rb +0 -51
- data/spec/monitors/misc_monitor_spec.rb +0 -51
- data/spec/monitors/web_spec.rb +0 -40
- data/spec/spec_helper.rb +0 -53
data/lib/modules/ec2_wrapper.rb
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
module PoolParty
|
|
2
|
-
extend self
|
|
3
|
-
|
|
4
|
-
module Ec2Wrapper
|
|
5
|
-
|
|
6
|
-
module ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module InstanceMethods
|
|
10
|
-
# Run a new instance, with the user_data and the ami described in the config
|
|
11
|
-
def launch_new_instance!
|
|
12
|
-
instance = ec2.run_instances(
|
|
13
|
-
:image_id => Application.ami,
|
|
14
|
-
:user_data => "#{Application.launching_user_data}",
|
|
15
|
-
:minCount => 1,
|
|
16
|
-
:maxCount => 1,
|
|
17
|
-
:key_name => "#{Application.keypair}",
|
|
18
|
-
:availability_zone => nil,
|
|
19
|
-
:size => "#{Application.size}")
|
|
20
|
-
begin
|
|
21
|
-
item = instance#.instancesSet.item
|
|
22
|
-
EC2ResponseObject.get_hash_from_response(item)
|
|
23
|
-
rescue Exception => e
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
# Shutdown the instance by instance_id
|
|
27
|
-
def terminate_instance!(instance_id)
|
|
28
|
-
ec2.terminate_instances(:instance_id => instance_id)
|
|
29
|
-
end
|
|
30
|
-
def associate_address_with(ip, instance_id)
|
|
31
|
-
ec2.associate_address(:instance_id => instance_id, :public_ip => ip)
|
|
32
|
-
end
|
|
33
|
-
# Instance description
|
|
34
|
-
def describe_instance(id)
|
|
35
|
-
EC2ResponseObject.get_hash_from_response(ec2.describe_instances(:instance_id => id))
|
|
36
|
-
end
|
|
37
|
-
# Get instance by id
|
|
38
|
-
def get_instance_by_id(id)
|
|
39
|
-
get_instances_description.select {|a| a.instance_id == id}[0] rescue nil
|
|
40
|
-
end
|
|
41
|
-
# Get the s3 description for the response in a hash format
|
|
42
|
-
def get_instances_description
|
|
43
|
-
@cached_descriptions ||= EC2ResponseObject.get_descriptions(ec2.describe_instances)
|
|
44
|
-
end
|
|
45
|
-
# EC2 connections
|
|
46
|
-
def ec2
|
|
47
|
-
@ec2 ||= EC2::Base.new(:access_key_id => Application.access_key, :secret_access_key => Application.secret_access_key)
|
|
48
|
-
end
|
|
49
|
-
def reset!
|
|
50
|
-
@cached_descriptions = nil
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def self.included(receiver)
|
|
55
|
-
receiver.extend ClassMethods
|
|
56
|
-
receiver.send :include, InstanceMethods
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
# Provides a simple class to wrap around the amazon responses
|
|
60
|
-
class EC2ResponseObject
|
|
61
|
-
def self.get_descriptions(resp)
|
|
62
|
-
rs = get_response_from(resp)
|
|
63
|
-
|
|
64
|
-
# puts rs.methods.sort - rs.ancestors.methods
|
|
65
|
-
out = begin
|
|
66
|
-
if rs.respond_to?(:instancesSet)
|
|
67
|
-
[EC2ResponseObject.get_hash_from_response(rs.instancesSet.item)]
|
|
68
|
-
else
|
|
69
|
-
rs.collect {|r|
|
|
70
|
-
if r.instancesSet.item.class == Array
|
|
71
|
-
r.instancesSet.item.map {|t| EC2ResponseObject.get_hash_from_response(t)}
|
|
72
|
-
else
|
|
73
|
-
[EC2ResponseObject.get_hash_from_response(r.instancesSet.item)]
|
|
74
|
-
end
|
|
75
|
-
}.flatten.reject {|a| a.nil? }
|
|
76
|
-
end
|
|
77
|
-
rescue Exception => e
|
|
78
|
-
# Really weird bug with amazon's ec2 gem
|
|
79
|
-
rs.collect {|r| EC2ResponseObject.get_hash_from_response(r)}.reject {|a| a.nil? } rescue []
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
out
|
|
83
|
-
end
|
|
84
|
-
def self.get_response_from(resp)
|
|
85
|
-
begin
|
|
86
|
-
rs = resp.reservationSet.item unless resp.reservationSet.nil?
|
|
87
|
-
rs ||= resp.DescribeInstancesResponse.reservationSet.item
|
|
88
|
-
rs ||= rs.respond_to?(:instancesSet) ? rs.instancesSet : rs
|
|
89
|
-
rs.reject! {|a| a.nil? || a.empty? }
|
|
90
|
-
rescue Exception => e
|
|
91
|
-
end
|
|
92
|
-
rs
|
|
93
|
-
end
|
|
94
|
-
def self.get_hash_from_response(resp)
|
|
95
|
-
begin
|
|
96
|
-
{
|
|
97
|
-
:instance_id => resp.instanceId,
|
|
98
|
-
:ip => resp.dnsName,
|
|
99
|
-
:status => resp.instanceState.name,
|
|
100
|
-
:launching_time => resp.launchTime,
|
|
101
|
-
:keypair => resp.keyName
|
|
102
|
-
}
|
|
103
|
-
rescue Exception => e
|
|
104
|
-
nil
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
data/lib/modules/file_writer.rb
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module PoolParty
|
|
2
|
-
module FileWriter
|
|
3
|
-
def write_to_file_for(f="haproxy", node=nil, str="", &block)
|
|
4
|
-
make_base_directory
|
|
5
|
-
File.open("#{base_tmp_dir}/#{node ? "#{node.name}-" : ""}#{f}", "w+") do |file|
|
|
6
|
-
file << str
|
|
7
|
-
file << block.call if block_given?
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
# Write a temp file with the content str
|
|
11
|
-
def write_to_temp_file(str="")
|
|
12
|
-
tempfile = Tempfile.new("#{base_tmp_dir}/poolparty-#{rand(1000)}-#{rand(1000)}")
|
|
13
|
-
tempfile.print(str)
|
|
14
|
-
tempfile.flush
|
|
15
|
-
tempfile
|
|
16
|
-
end
|
|
17
|
-
def with_temp_file(str="", &block)
|
|
18
|
-
Tempfile.open "#{base_tmp_dir}/poolparty-#{rand(10000)}" do |fp|
|
|
19
|
-
fp.puts str
|
|
20
|
-
fp.flush
|
|
21
|
-
block.call(fp)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def base_tmp_dir
|
|
26
|
-
File.join(user_dir, "tmp")
|
|
27
|
-
end
|
|
28
|
-
def remote_base_tmp_dir
|
|
29
|
-
"~/tmp"
|
|
30
|
-
end
|
|
31
|
-
def make_base_directory
|
|
32
|
-
`mkdir -p #{base_tmp_dir}` unless File.directory?(base_tmp_dir)
|
|
33
|
-
end
|
|
34
|
-
def clear_base_directory
|
|
35
|
-
`rm -rf #{base_tmp_dir}/*` if File.directory?(base_tmp_dir)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
Sprinkle::Installers::Source.extend Module.new do
|
|
2
|
-
def custom_dir(dir)
|
|
3
|
-
@custom_dir = dir
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def base_dir
|
|
7
|
-
if @custom_dir
|
|
8
|
-
return @custom_dir
|
|
9
|
-
elsif @source.split('/').last =~ /(.*)\.(tar\.gz|tgz|tar\.bz2|tb2)/
|
|
10
|
-
return $1
|
|
11
|
-
end
|
|
12
|
-
raise "Unknown base path for source archive: #{@source}, please update code knowledge"
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
Sprinkle::Installers::Gem.extend Module.new do
|
|
16
|
-
def platform(platform=nil)
|
|
17
|
-
@platform ||= platform
|
|
18
|
-
end
|
|
19
|
-
protected
|
|
20
|
-
def install_sequence
|
|
21
|
-
cmd = "gem install -y #{gem}"
|
|
22
|
-
cmd << " --version '#{version}'" if version
|
|
23
|
-
cmd << " --source #{source}" if source
|
|
24
|
-
cmd << " --platform #{platform}" if platform
|
|
25
|
-
cmd
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# require "vlad"
|
|
2
|
-
# class Rake::RemoteTask < Rake::Task
|
|
3
|
-
# def run command
|
|
4
|
-
# cmd = [ssh_cmd, ssh_flags, target_host].compact
|
|
5
|
-
# result = []
|
|
6
|
-
#
|
|
7
|
-
# commander = cmd.join(" ") << " \"#{command}\""
|
|
8
|
-
# warn commander if $TRACE
|
|
9
|
-
#
|
|
10
|
-
# pid, inn, out, err = popen4(commander)
|
|
11
|
-
#
|
|
12
|
-
# inn.sync = true
|
|
13
|
-
# streams = [out, err]
|
|
14
|
-
# out_stream = {
|
|
15
|
-
# out => $stdout,
|
|
16
|
-
# err => $stderr,
|
|
17
|
-
# }
|
|
18
|
-
#
|
|
19
|
-
# # Handle process termination ourselves
|
|
20
|
-
# status = nil
|
|
21
|
-
# Thread.start do
|
|
22
|
-
# status = Process.waitpid2(pid).last
|
|
23
|
-
# end
|
|
24
|
-
#
|
|
25
|
-
# until streams.empty? do
|
|
26
|
-
# # don't busy loop
|
|
27
|
-
# selected, = select streams, nil, nil, 0.1
|
|
28
|
-
#
|
|
29
|
-
# next if selected.nil? or selected.empty?
|
|
30
|
-
#
|
|
31
|
-
# selected.each do |stream|
|
|
32
|
-
# if stream.eof? then
|
|
33
|
-
# streams.delete stream if status # we've quit, so no more writing
|
|
34
|
-
# next
|
|
35
|
-
# end
|
|
36
|
-
#
|
|
37
|
-
# data = stream.readpartial(1024)
|
|
38
|
-
# out_stream[stream].write data
|
|
39
|
-
#
|
|
40
|
-
# if stream == err and data =~ /^Password:/ then
|
|
41
|
-
# inn.puts sudo_password
|
|
42
|
-
# data << "\n"
|
|
43
|
-
# $stderr.write "\n"
|
|
44
|
-
# end
|
|
45
|
-
#
|
|
46
|
-
# result << data
|
|
47
|
-
# end
|
|
48
|
-
# end
|
|
49
|
-
#
|
|
50
|
-
# PoolParty.message "execution failed with status #{status.exitstatus}: #{cmd.join ' '}" unless status.success?
|
|
51
|
-
#
|
|
52
|
-
# result.join
|
|
53
|
-
# end
|
|
54
|
-
#
|
|
55
|
-
# def rsync local, remote
|
|
56
|
-
# cmd = [rsync_cmd, rsync_flags, local, "#{@target_host}:#{remote}"].flatten.compact
|
|
57
|
-
#
|
|
58
|
-
# success = system(*cmd.join(" "))
|
|
59
|
-
#
|
|
60
|
-
# unless success then
|
|
61
|
-
# raise Vlad::CommandFailedError, "execution failed: #{cmd.join ' '}"
|
|
62
|
-
# end
|
|
63
|
-
# end
|
|
64
|
-
# def set name, val = nil, &b
|
|
65
|
-
# rt.set name, val, &b
|
|
66
|
-
# end
|
|
67
|
-
# def rt
|
|
68
|
-
# @rt ||= Rake::RemoteTask
|
|
69
|
-
# end
|
|
70
|
-
#
|
|
71
|
-
# def target_hosts
|
|
72
|
-
# if hosts = ENV["HOSTS"] then
|
|
73
|
-
# hosts.strip.gsub(/\s+/, '').split(",")
|
|
74
|
-
# elsif options[:single]
|
|
75
|
-
# @roles = {}; @roles[:app] = {}
|
|
76
|
-
# @roles[:app][options[:single]] = options[:single]
|
|
77
|
-
# roles = Rake::RemoteTask.hosts_for(@roles)
|
|
78
|
-
# else
|
|
79
|
-
# roles = options[:roles]
|
|
80
|
-
# roles ? Rake::RemoteTask.hosts_for(roles) : Rake::RemoteTask.all_hosts
|
|
81
|
-
# end
|
|
82
|
-
# end
|
|
83
|
-
# end
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
=begin rdoc
|
|
2
|
-
Application
|
|
3
|
-
This handles user interaction
|
|
4
|
-
=end
|
|
5
|
-
module PoolParty
|
|
6
|
-
class Application
|
|
7
|
-
class << self
|
|
8
|
-
attr_accessor :verbose, :options
|
|
9
|
-
|
|
10
|
-
# The application options
|
|
11
|
-
def options(opts={})
|
|
12
|
-
@options ||= make_options(opts)
|
|
13
|
-
end
|
|
14
|
-
# Make the options with the config_file overrides included
|
|
15
|
-
# Default config file assumed to be at config/config.yml
|
|
16
|
-
def make_options(opts={})
|
|
17
|
-
loading_options = opts.delete(:optsparse) || {}
|
|
18
|
-
loading_options.merge!( opts || {})
|
|
19
|
-
|
|
20
|
-
load_options!(loading_options) # Load command-line options
|
|
21
|
-
config_file_location = (default_options[:config_file] || opts[:config_file])
|
|
22
|
-
|
|
23
|
-
# If the config_file options are specified and not empty
|
|
24
|
-
unless config_file_location.nil? || config_file_location.empty?
|
|
25
|
-
require "yaml"
|
|
26
|
-
# Try loading the file if it exists
|
|
27
|
-
filedata = File.open("#{config_file_location}").read if File.file?("#{config_file_location}")
|
|
28
|
-
default_options.merge!( YAML.load(filedata) ) if filedata rescue ""
|
|
29
|
-
end
|
|
30
|
-
# We want the command-line to overwrite the config file
|
|
31
|
-
default_options.merge!(local_user_data) unless local_user_data.nil?
|
|
32
|
-
OpenStruct.new(default_options)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Load options via commandline
|
|
36
|
-
def load_options!(opts={})
|
|
37
|
-
require 'optparse'
|
|
38
|
-
OptionParser.new do |op|
|
|
39
|
-
op.banner = opts[:banner] if opts[:banner]
|
|
40
|
-
op.on('-A key', '--access-key key', "Ec2 access key (ENV['AWS_ACCESS_KEY'])") { |key| default_options[:access_key] = key }
|
|
41
|
-
op.on('-S key', '--secret-access-key key', "Ec2 secret access key (ENV['AWS_SECRET_ACCESS'])") { |key| default_options[:secret_access_key] = key }
|
|
42
|
-
op.on('-I ami', '--image-id id', "AMI instance (default: 'ami-40bc5829')") {|id| default_options[:ami] = id }
|
|
43
|
-
op.on('-k keypair', '--keypair name', "Keypair name (ENV['KEYPAIR_NAME'])") { |key| default_options[:keypair] = key }
|
|
44
|
-
op.on('-b bucket', '--bucket bucket', "Application bucket") { |bucket| default_options[:shared_bucket] = bucket }
|
|
45
|
-
# //THIS IS WHERE YOU LEFT OFF
|
|
46
|
-
op.on('-D working directory', '--dir dir', "Working directory") { |d| default_options[:working_directory] = d }
|
|
47
|
-
|
|
48
|
-
op.on('--ec2-dir dir', "Directory with ec2 data (default: '~/.ec2')") {|id| default_options[:ec2_dir] = id }
|
|
49
|
-
op.on('-r names', '--services names', "Monitored services (default: '')") {|id| default_options[:services] = id }
|
|
50
|
-
op.on('-c file', '--config-file file', "Config file (default: '')") {|file| default_options[:config_file] = file }
|
|
51
|
-
op.on('-l plugin_dir', '--plugin-dir dir', "Plugin directory (default: '')") {|file| default_options[:plugin_dir] = file }
|
|
52
|
-
op.on('-p port', '--host_port port', "Run on specific host_port (default: 7788)") { |host_port| default_options[:host_port] = host_port }
|
|
53
|
-
op.on('-m monitors', '--monitors names', "Monitor instances using (default: 'web,memory,cpu')") {|s| default_options[:monitor_load_on] = s }
|
|
54
|
-
op.on('-o port', '--client_port port', "Run on specific client_port (default: 7788)") { |client_port| default_options[:client_port] = client_port }
|
|
55
|
-
op.on('-O os', '--os os', "Configure for os (default: ubuntu)") { |os| default_options[:os] = os }
|
|
56
|
-
op.on('-e env', '--environment env', "Run on the specific environment (default: development)") { |env| default_options[:environment] = env }
|
|
57
|
-
op.on('-a address', '--public-ip address', "Associate this public address with the master node") {|s| default_options[:public_ip] = s}
|
|
58
|
-
op.on('-s size', '--size size', "Run specific sized instance") {|s| default_options[:size] = s}
|
|
59
|
-
op.on('-a name', '--name name', "Application name") {|n| default_options[:app_name] = n}
|
|
60
|
-
op.on('-u username', '--username name', "Login with the user (default: root)") {|s| default_options[:user] = s}
|
|
61
|
-
op.on('-d user-data','--user-data data', "Extra data to send each of the instances (default: "")") { |data| default_options[:user_data] = data.to_str }
|
|
62
|
-
op.on('-i', '--install-on-boot', 'Install the PoolParty and custom software on boot (default: false)') {|b| default_options[:install_on_load] = true}
|
|
63
|
-
op.on('-t seconds', '--polling-time', "Time between polling in seconds (default 50)") {|t| default_options[:polling_time] = t }
|
|
64
|
-
op.on('-v', '--[no-]verbose', 'Run verbosely (default: false)') {|v| default_options[:verbose] = true}
|
|
65
|
-
op.on('-n number', '--minimum-instances', "The minimum number of instances to run at all times (default 1)") {|i| default_options[:minimum_instances] = i.to_i}
|
|
66
|
-
op.on('-x number', '--maximum-instances', "The maximum number of instances to run (default 3)") {|x| default_options[:maximum_instances] = x.to_i}
|
|
67
|
-
|
|
68
|
-
op.on_tail("-V", "Show version") do
|
|
69
|
-
puts Application.version
|
|
70
|
-
exit
|
|
71
|
-
end
|
|
72
|
-
op.on_tail("-h", "-?", "Show this message") do
|
|
73
|
-
puts op
|
|
74
|
-
exit
|
|
75
|
-
end
|
|
76
|
-
end.parse!(opts[:argv] ? opts.delete(:argv) : ARGV.dup)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Basic default options
|
|
80
|
-
# All can be overridden by the command line
|
|
81
|
-
# or in a config.yml file
|
|
82
|
-
def default_options
|
|
83
|
-
@default_options ||= {
|
|
84
|
-
:app_name => "application_name",
|
|
85
|
-
:host_port => 80,
|
|
86
|
-
:client_port => 8001,
|
|
87
|
-
:environment => 'development',
|
|
88
|
-
:verbose => false,
|
|
89
|
-
:logging => true,
|
|
90
|
-
:size => "m1.small",
|
|
91
|
-
:polling_time => "30.seconds",
|
|
92
|
-
:user_data => "",
|
|
93
|
-
:heavy_load => 0.80,
|
|
94
|
-
:light_load => 0.15,
|
|
95
|
-
:minimum_instances => 2,
|
|
96
|
-
:maximum_instances => 4,
|
|
97
|
-
:public_ip => "",
|
|
98
|
-
:access_key => ENV["AWS_ACCESS_KEY"],
|
|
99
|
-
:secret_access_key => ENV["AWS_SECRET_ACCESS"],
|
|
100
|
-
:config_file => if ENV["CONFIG_FILE"] && !ENV["CONFIG_FILE"].empty?
|
|
101
|
-
ENV["CONFIG_FILE"]
|
|
102
|
-
elsif File.file?("config/config.yml")
|
|
103
|
-
"config/config.yml"
|
|
104
|
-
else
|
|
105
|
-
nil
|
|
106
|
-
end,
|
|
107
|
-
:username => "root",
|
|
108
|
-
:ec2_dir => (ENV["EC2_HOME"].nil? || ENV["EC2_HOME"].empty?) ? "~/.ec2" : ENV["EC2_HOME"],
|
|
109
|
-
:keypair => (ENV["KEYPAIR_NAME"].nil? || ENV["KEYPAIR_NAME"].empty?) ? File.basename(`pwd`).strip : ENV["KEYPAIR_NAME"],
|
|
110
|
-
:ami => 'ami-44bd592d',
|
|
111
|
-
:shared_bucket => "",
|
|
112
|
-
:expand_when => "web < 1.5\n memory > 0.85",
|
|
113
|
-
:contract_when => "cpu < 0.20\n memory < 0.10",
|
|
114
|
-
:os => "ubuntu",
|
|
115
|
-
:plugin_dir => "plugins",
|
|
116
|
-
:install_on_load => false,
|
|
117
|
-
:working_directory => Dir.pwd
|
|
118
|
-
}
|
|
119
|
-
end
|
|
120
|
-
# Services monitored by Heartbeat
|
|
121
|
-
def master_managed_services
|
|
122
|
-
"cloud_master_takeover"
|
|
123
|
-
end
|
|
124
|
-
alias_method :managed_services, :master_managed_services
|
|
125
|
-
def launching_user_data
|
|
126
|
-
hash_to_launch_with.to_yaml
|
|
127
|
-
end
|
|
128
|
-
def hash_to_launch_with
|
|
129
|
-
@hash ||= { :polling_time => polling_time,
|
|
130
|
-
:access_key => access_key,
|
|
131
|
-
:secret_access_key => secret_access_key,
|
|
132
|
-
:user_data => user_data,
|
|
133
|
-
:keypair => keypair,
|
|
134
|
-
:keypair_path => "/mnt"
|
|
135
|
-
}
|
|
136
|
-
end
|
|
137
|
-
def local_user_data
|
|
138
|
-
@local_user_data ||= begin
|
|
139
|
-
@@timer.timeout(2.seconds) do
|
|
140
|
-
YAML.load(open("http://169.254.169.254/latest/user-data").read)
|
|
141
|
-
end
|
|
142
|
-
rescue Exception => e
|
|
143
|
-
{}
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
# For testing purposes
|
|
147
|
-
def reset!
|
|
148
|
-
@options = nil
|
|
149
|
-
@local_user_data = nil
|
|
150
|
-
end
|
|
151
|
-
# Keypair path
|
|
152
|
-
# Idiom:
|
|
153
|
-
# /Users/username/.ec2/[name]
|
|
154
|
-
def keypair_path
|
|
155
|
-
options.keypair_path ? options.keypair_path : "#{ec2_dir}/#{keypair_name}"
|
|
156
|
-
end
|
|
157
|
-
def keypair_name
|
|
158
|
-
"id_rsa-#{keypair}"
|
|
159
|
-
end
|
|
160
|
-
# Are we in development or test mode
|
|
161
|
-
%w(development production test).each do |env|
|
|
162
|
-
eval <<-EOE
|
|
163
|
-
def #{env}?
|
|
164
|
-
environment == '#{env}'
|
|
165
|
-
end
|
|
166
|
-
EOE
|
|
167
|
-
end
|
|
168
|
-
def environment=(env)
|
|
169
|
-
environment = env
|
|
170
|
-
end
|
|
171
|
-
def maintain_pid_path
|
|
172
|
-
"/var/run/pool_maintain.pid"
|
|
173
|
-
end
|
|
174
|
-
%w(scp_instances_script reconfigure_instances_script).each do |file|
|
|
175
|
-
define_method "sh_#{file}" do
|
|
176
|
-
File.join(File.dirname(__FILE__), "../..", "config", "#{file}.sh")
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
# Standard configuration files
|
|
180
|
-
%w(haproxy monit heartbeat heartbeat_authkeys).each do |file|
|
|
181
|
-
define_method "#{file}_config_file" do
|
|
182
|
-
File.join(File.dirname(__FILE__), "../..", "config", "#{file}.conf")
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
def version
|
|
186
|
-
PoolParty::Version.string
|
|
187
|
-
end
|
|
188
|
-
def install_on_load?(bool=false)
|
|
189
|
-
options.install_on_load == true || bool
|
|
190
|
-
end
|
|
191
|
-
# Call the options from the Application
|
|
192
|
-
def method_missing(m,*args)
|
|
193
|
-
options.methods.include?("#{m}") ? options.send(m,args) : super
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
end
|