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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + "/resource"
|
|
2
|
+
|
|
3
|
+
module PoolParty
|
|
4
|
+
def available_custom_resources
|
|
5
|
+
$available_custom_resources ||= []
|
|
6
|
+
end
|
|
7
|
+
module DefinableFact
|
|
8
|
+
def define_fact(name, string="")
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Resources
|
|
14
|
+
|
|
15
|
+
def call_function(str, opts={}, &block)
|
|
16
|
+
returning PoolParty::Resources::CallFunction.new(str, opts, &block) do |o|
|
|
17
|
+
resource(:call_function) << o
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Resources for function call
|
|
22
|
+
class CallFunction < Resource
|
|
23
|
+
def initialize(str="", opts={}, &block)
|
|
24
|
+
@str = str
|
|
25
|
+
super(opts, &block)
|
|
26
|
+
end
|
|
27
|
+
def to_string(prev="")
|
|
28
|
+
returning Array.new do |arr|
|
|
29
|
+
arr << "#{prev}#{@str}"
|
|
30
|
+
end.join("\n")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class CustomResource < Resource
|
|
35
|
+
def initialize(name=:custom_method, opts={}, &block)
|
|
36
|
+
@name = name
|
|
37
|
+
super(opts, &block)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.inherited(subclass)
|
|
41
|
+
PoolParty::Resources.available_custom_resources << subclass
|
|
42
|
+
super(subclass)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def to_string(prev="")
|
|
46
|
+
returning Array.new do |output|
|
|
47
|
+
output << "#{prev} # Custom Functions\n"
|
|
48
|
+
output << self.class.custom_functions_to_string(prev)
|
|
49
|
+
end.join("\n")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Stub methods
|
|
54
|
+
# TODO: Find a better solution
|
|
55
|
+
def custom_function(*args, &block)
|
|
56
|
+
end
|
|
57
|
+
def self.custom_function(*args, &block)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class Loggable
|
|
2
|
+
def initialize
|
|
3
|
+
Logging.init :debug, :info, :warn, :error, :fatal
|
|
4
|
+
|
|
5
|
+
self.class.loggers << file_logger
|
|
6
|
+
file_logger.level = :warn
|
|
7
|
+
|
|
8
|
+
self.class.loggers << stdout_logger
|
|
9
|
+
stdout_logger.level = :info
|
|
10
|
+
end
|
|
11
|
+
def file_logger
|
|
12
|
+
@file_logger ||= Logging.logger( ::File.join(Base.pool_logger_location, "pool_log.log"), logging_opts )
|
|
13
|
+
end
|
|
14
|
+
def stdout_logger
|
|
15
|
+
@stdout_logger ||= Logging.logger(STDOUT, logging_opts.merge({:pattern => "%m\n"}))
|
|
16
|
+
end
|
|
17
|
+
def logging_opts
|
|
18
|
+
{:pattern => "[%d] %-l : %m\n",
|
|
19
|
+
:date_pattern => "%Y-%m-%d %H:%M:%S.%s"}
|
|
20
|
+
end
|
|
21
|
+
%w(info warn debug notice).each do |meth|
|
|
22
|
+
define_method(meth.to_sym) do |*args|
|
|
23
|
+
self.class.loggers.each {|l| l.send meth.to_sym, args}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
def self.loggers
|
|
27
|
+
@loggers ||= []
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module PoolParty
|
|
2
|
+
|
|
3
|
+
module Plugin
|
|
4
|
+
|
|
5
|
+
class Plugin
|
|
6
|
+
include Configurable
|
|
7
|
+
include CloudResourcer
|
|
8
|
+
include Resources
|
|
9
|
+
extend Resources
|
|
10
|
+
|
|
11
|
+
attr_accessor :parent
|
|
12
|
+
class_inheritable_accessor :name
|
|
13
|
+
|
|
14
|
+
default_options({})
|
|
15
|
+
|
|
16
|
+
def initialize(parent=self, opts={}, &block)
|
|
17
|
+
set_parent(parent)
|
|
18
|
+
block ? instance_eval(&block) : enable
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Overwrite this method
|
|
22
|
+
def enable
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def method_missing(m, *args, &block)
|
|
26
|
+
if block_given?
|
|
27
|
+
(args[0].class == self.class) ? args[0].instance_eval(&block) : super
|
|
28
|
+
elsif parent && parent.respond_to?(m)
|
|
29
|
+
parent.send m, *args, &block
|
|
30
|
+
else
|
|
31
|
+
get_from_options(m, *args)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def get_from_options(m, *args)
|
|
36
|
+
args.empty? ? options[m] : options[m] = args[0]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "resource")
|
|
2
|
+
|
|
3
|
+
module PoolParty
|
|
4
|
+
module PluginModel
|
|
5
|
+
|
|
6
|
+
def plugin(name=:plugin, cloud=nil, &block)
|
|
7
|
+
plugins.has_key?(name) ? plugins[name] : (plugins[name] = PluginModel.new(name, cloud, &block))
|
|
8
|
+
end
|
|
9
|
+
alias_method :register_plugin, :plugin
|
|
10
|
+
|
|
11
|
+
def plugins
|
|
12
|
+
$plugins ||= {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class PluginModel
|
|
16
|
+
attr_accessor :name, :klass
|
|
17
|
+
attr_reader :parent
|
|
18
|
+
include MethodMissingSugar
|
|
19
|
+
include Configurable
|
|
20
|
+
include PrettyPrinter
|
|
21
|
+
|
|
22
|
+
def initialize(name,cld,&block)
|
|
23
|
+
@name = name
|
|
24
|
+
@parent = cld
|
|
25
|
+
class_string_name = "#{name}"
|
|
26
|
+
|
|
27
|
+
# Create the class to evaluate the plugin on the implemented call
|
|
28
|
+
klass = class_string_name.class_constant(PoolParty::Plugin::Plugin)
|
|
29
|
+
klass.extend PoolParty::Resources
|
|
30
|
+
klass.send :include, PoolParty::Resources
|
|
31
|
+
|
|
32
|
+
# Create the block inside the instantiated plugin
|
|
33
|
+
klass.module_eval &block if block
|
|
34
|
+
|
|
35
|
+
# Store the name of the class for pretty printing later
|
|
36
|
+
klass.name = name
|
|
37
|
+
# Add the plugin definition to the cloud as an instance method
|
|
38
|
+
Cloud::Cloud.module_eval <<-EOE
|
|
39
|
+
def #{name}(parent=self, &block)
|
|
40
|
+
@#{class_string_name.downcase} ||= #{class_string_name.class_constant}.new(parent, &block)
|
|
41
|
+
end
|
|
42
|
+
EOE
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module PoolParty
|
|
2
|
+
module Pool
|
|
3
|
+
|
|
4
|
+
def pool(name=:main, &block)
|
|
5
|
+
pools.has_key?(name) ? pools[name] : (pools[name] = Pool.new(name, &block))
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def pools
|
|
9
|
+
$pools ||= {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def with_pool(pool, opts={}, &block)
|
|
13
|
+
pool.options.merge!(opts)
|
|
14
|
+
pool.instance_eval &block if block
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def reset!
|
|
18
|
+
$pools = $clouds = $plugins = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Pool
|
|
22
|
+
attr_accessor :name
|
|
23
|
+
include PoolParty::Cloud
|
|
24
|
+
include MethodMissingSugar
|
|
25
|
+
# include PluginModel
|
|
26
|
+
include Configurable
|
|
27
|
+
include PrettyPrinter
|
|
28
|
+
include CloudResourcer
|
|
29
|
+
include Remote
|
|
30
|
+
|
|
31
|
+
default_options({
|
|
32
|
+
:access_key => Base.access_key,
|
|
33
|
+
:secret_access_key => Base.secret_access_key
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
def initialize(name,&block)
|
|
37
|
+
@name = name
|
|
38
|
+
instance_eval &block if block
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def plugin_directory(*args)
|
|
42
|
+
args.each {|arg| Dir["#{arg}/*.rb"].each {|f| load f }}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# This is where the entire process starts
|
|
46
|
+
def inflate
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Helpers
|
|
51
|
+
def remove_pool(name)
|
|
52
|
+
pools.delete(name) if pools.has_key?(name)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
The Container
|
|
3
|
+
|
|
4
|
+
Container holds the various features for the final compilations
|
|
5
|
+
for each pool.
|
|
6
|
+
|
|
7
|
+
Most of the Resources will not need to create their own
|
|
8
|
+
=end
|
|
9
|
+
module PoolParty
|
|
10
|
+
module Resources
|
|
11
|
+
|
|
12
|
+
def resources
|
|
13
|
+
@resources ||= {}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def resource(type=:file)
|
|
17
|
+
resources[type] ||= []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def add_resource(type, opts={}, &block)
|
|
21
|
+
returning "PoolParty::Resources::#{type.to_s.camelize}".classify.constantize.new(opts, &block) do |o|
|
|
22
|
+
resource(type) << o
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get_resource(type, name)
|
|
27
|
+
resource(type).select {|resource| resource.name == name }.first
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#:nodoc:
|
|
31
|
+
def reset_resources!
|
|
32
|
+
@resources = nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def resources_string(prev="")
|
|
36
|
+
returning Array.new do |output|
|
|
37
|
+
output << resources_string_from_resources(resources)
|
|
38
|
+
end.join("\n")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def custom_file(path, str)
|
|
42
|
+
write_to_file_in_storage_directory(path, str)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class Resource
|
|
46
|
+
include CloudResourcer
|
|
47
|
+
include Configurable
|
|
48
|
+
|
|
49
|
+
extend PoolParty::Resources
|
|
50
|
+
include PoolParty::Resources
|
|
51
|
+
|
|
52
|
+
def self.inherited(subclass)
|
|
53
|
+
subclass = subclass.to_s.split("::")[-1] if subclass.to_s.index("::")
|
|
54
|
+
lowercase_class_name = subclass.to_s.downcase
|
|
55
|
+
|
|
56
|
+
# Add add resource method to the Resources module
|
|
57
|
+
unless PoolParty::Resources.respond_to?(lowercase_class_name.to_sym)
|
|
58
|
+
method =<<-EOE
|
|
59
|
+
def #{lowercase_class_name}(opts={}, &blk)
|
|
60
|
+
add_resource(:#{lowercase_class_name}, opts, &blk)
|
|
61
|
+
end
|
|
62
|
+
EOE
|
|
63
|
+
PoolParty::Resources.module_eval method
|
|
64
|
+
PoolParty::Resources.add_has_and_does_not_have_methods_for(lowercase_class_name.to_sym)
|
|
65
|
+
|
|
66
|
+
available_resources << subclass
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.available_resources
|
|
71
|
+
@available_resources ||= []
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def self.available_resource_methods
|
|
75
|
+
available_resources.map {|a| a.my_methods }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# This is set in order of descending precedence
|
|
79
|
+
# The options are overwritten from the bottom up
|
|
80
|
+
# and the resource will use those as the values
|
|
81
|
+
# Then it takes the value of the block and sets whatever is sent there as
|
|
82
|
+
# the options
|
|
83
|
+
# Finally, it uses the parent's options as the lowest priority
|
|
84
|
+
def initialize(opts={}, parent=self, &block)
|
|
85
|
+
# Take the options of the parents
|
|
86
|
+
set_parent(parent) if parent
|
|
87
|
+
set_vars_from_options(opts) unless opts.empty?
|
|
88
|
+
self.instance_eval &block if block
|
|
89
|
+
loaded
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Stub, so you can create virtual resources
|
|
93
|
+
def loaded
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# DSL Overriders
|
|
97
|
+
# Overrides for syntax
|
|
98
|
+
# Allows us to send require to require a resource
|
|
99
|
+
def requires(str="")
|
|
100
|
+
options.merge!(:require => str)
|
|
101
|
+
end
|
|
102
|
+
def ensures(str="running")
|
|
103
|
+
str == "absent" ? is_absent : is_present
|
|
104
|
+
end
|
|
105
|
+
# Allows us to send an ensure to ensure the presence of a resource
|
|
106
|
+
def is_present(*args)
|
|
107
|
+
options.merge!(:ensure => present)
|
|
108
|
+
end
|
|
109
|
+
# Ensures that what we are sending is absent
|
|
110
|
+
def is_absent(*args)
|
|
111
|
+
options.merge!(:ensure => absent)
|
|
112
|
+
end
|
|
113
|
+
# Alias for unless
|
|
114
|
+
def ifnot(str="")
|
|
115
|
+
options.merge!(:unless => str)
|
|
116
|
+
end
|
|
117
|
+
def present
|
|
118
|
+
"present"
|
|
119
|
+
end
|
|
120
|
+
def absent
|
|
121
|
+
"absent"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Give us a template to work with on the resource
|
|
125
|
+
# Make sure this template is moved to the tmp directory as well
|
|
126
|
+
def template(file, opts={})
|
|
127
|
+
raise TemplateNotFound.new("no template given") unless file
|
|
128
|
+
raise TemplateNotFound.new("template cannot be found #{file}") unless ::File.file?(file)
|
|
129
|
+
unless opts[:just_copy]
|
|
130
|
+
options.merge!({:content => "template(\"#{::File.basename(file)}\")"})
|
|
131
|
+
options.delete(:source) if options.has_key?(:source)
|
|
132
|
+
copy_template_to_storage_directory(file)
|
|
133
|
+
else
|
|
134
|
+
copy_file_to_storage_directory(file)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
# This way we can subclass resources without worry
|
|
138
|
+
def class_type_name
|
|
139
|
+
self.class.to_s.top_level_class
|
|
140
|
+
end
|
|
141
|
+
def self.custom_function(str)
|
|
142
|
+
custom_functions << str
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def self.custom_function(str)
|
|
146
|
+
custom_functions << str
|
|
147
|
+
end
|
|
148
|
+
def self.custom_functions
|
|
149
|
+
@custom_functions ||= []
|
|
150
|
+
end
|
|
151
|
+
def custom_function(str)
|
|
152
|
+
self.class.custom_functions << str
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def self.custom_functions_to_string(prev="")
|
|
156
|
+
returning Array.new do |output|
|
|
157
|
+
PoolParty::Resources.available_custom_resources.each do |resource|
|
|
158
|
+
resource.custom_functions.each do |func|
|
|
159
|
+
output << "#{prev*2}#{func}"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end.join("\n")
|
|
163
|
+
end
|
|
164
|
+
# Some things in puppet aren't allowed, so let's override them here
|
|
165
|
+
def disallowed_options
|
|
166
|
+
[]
|
|
167
|
+
end
|
|
168
|
+
def key
|
|
169
|
+
name
|
|
170
|
+
end
|
|
171
|
+
def virtual_resource?
|
|
172
|
+
false
|
|
173
|
+
end
|
|
174
|
+
# We want to gather the options, but if the option sent is nil
|
|
175
|
+
# then we want to override the option value by sending the key as
|
|
176
|
+
# a method so that we can override this if necessary.
|
|
177
|
+
# Only runs on objects that have options defined, otherwise
|
|
178
|
+
# it returns an empty hash
|
|
179
|
+
def get_modified_options
|
|
180
|
+
if options
|
|
181
|
+
opts = options.inject({}) do |sum,h|
|
|
182
|
+
sum.merge!({h[0].to_sym => ((h[1].nil?) ? self.send(h[0].to_sym) : h[1]) })
|
|
183
|
+
end
|
|
184
|
+
else
|
|
185
|
+
opts = {}
|
|
186
|
+
end
|
|
187
|
+
opts.reject {|k,v| disallowed_options.include?(k) }
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Generic to_s
|
|
191
|
+
# Most Resources won't need to extend this
|
|
192
|
+
def to_string(prev="")
|
|
193
|
+
opts = get_modified_options
|
|
194
|
+
returning Array.new do |output|
|
|
195
|
+
|
|
196
|
+
if resources && !resources.empty?
|
|
197
|
+
@cp = classpackage_with_self(self)
|
|
198
|
+
output << @cp.to_string
|
|
199
|
+
output << "include #{@cp.name.sanitize}"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
unless virtual_resource?
|
|
203
|
+
output << "#{prev}#{class_type_name} {"
|
|
204
|
+
output << "#{prev}\"#{self.key}\":"
|
|
205
|
+
output << opts.flush_out("#{prev*2}").join(",\n")
|
|
206
|
+
output << "#{prev}}"
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end.join("\n")
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Adds two methods to the module
|
|
214
|
+
# Adds the method type:
|
|
215
|
+
# has_
|
|
216
|
+
# and
|
|
217
|
+
# does_not_have_
|
|
218
|
+
# for the type passed
|
|
219
|
+
# for instance
|
|
220
|
+
# add_has_and_does_not_have_methods_for(:file)
|
|
221
|
+
# gives you the methods has_file and does_not_have_file
|
|
222
|
+
# TODO: Refactor nicely to include other types that don't accept ensure
|
|
223
|
+
def self.add_has_and_does_not_have_methods_for(type=:file)
|
|
224
|
+
module_eval <<-EOE
|
|
225
|
+
def has_#{type}(opts={}, &block)
|
|
226
|
+
#{type}(#{type == :exec ? "opts" : "{:is_present => ''}.merge(opts)"}, &block)
|
|
227
|
+
end
|
|
228
|
+
def does_not_have_#{type}(opts={}, &block)
|
|
229
|
+
#{type}(#{type == :exec ? "opts" : "{:is_absent => ''}.merge(opts)"}, &block)
|
|
230
|
+
end
|
|
231
|
+
EOE
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
end
|
|
235
|
+
end
|