poolparty 0.2.6 → 0.2.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. data/Manifest.txt +123 -4
  2. data/PostInstall.txt +2 -1
  3. data/bin/cloud +16 -7
  4. data/bin/cloud-provision +9 -5
  5. data/bin/cloud-run +19 -0
  6. data/bin/cloud-ssh +2 -7
  7. data/bin/cloud-start +2 -1
  8. data/bin/pool +3 -3
  9. data/bin/server-build-messenger +20 -0
  10. data/bin/server-fire-cmd +14 -0
  11. data/bin/server-get-load +29 -0
  12. data/bin/server-list-active +25 -0
  13. data/bin/server-list-responding +24 -0
  14. data/bin/server-rerun +24 -0
  15. data/bin/server-start-master +27 -0
  16. data/bin/server-start-node +33 -0
  17. data/config/requirements.rb +1 -1
  18. data/erl_crash.dump +8409 -0
  19. data/lib/erlang/messenger/Emakefile +1 -0
  20. data/lib/erlang/messenger/Makefile +15 -0
  21. data/lib/erlang/messenger/README +5 -0
  22. data/lib/erlang/messenger/Rakefile +60 -0
  23. data/lib/erlang/messenger/control +11 -0
  24. data/lib/erlang/messenger/ebin/master.app +19 -0
  25. data/lib/erlang/messenger/ebin/master_app.beam +0 -0
  26. data/lib/erlang/messenger/ebin/node.app +19 -0
  27. data/lib/erlang/messenger/ebin/node_app.beam +0 -0
  28. data/lib/erlang/messenger/ebin/packager.app +19 -0
  29. data/lib/erlang/messenger/ebin/pm_client.beam +0 -0
  30. data/lib/erlang/messenger/ebin/pm_cluster.beam +0 -0
  31. data/lib/erlang/messenger/ebin/pm_event_handler.beam +0 -0
  32. data/lib/erlang/messenger/ebin/pm_master.beam +0 -0
  33. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -0
  34. data/lib/erlang/messenger/ebin/pm_master_supervisor.beam +0 -0
  35. data/lib/erlang/messenger/ebin/pm_node.beam +0 -0
  36. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -0
  37. data/lib/erlang/messenger/ebin/pm_node_supervisor.beam +0 -0
  38. data/lib/erlang/messenger/ebin/pm_packager.beam +0 -0
  39. data/lib/erlang/messenger/ebin/utils.beam +0 -0
  40. data/lib/erlang/messenger/lib/eunit/AUTHORS +2 -0
  41. data/lib/erlang/messenger/lib/eunit/CHANGELOG +14 -0
  42. data/lib/erlang/messenger/lib/eunit/COPYING +504 -0
  43. data/lib/erlang/messenger/lib/eunit/Makefile +28 -0
  44. data/lib/erlang/messenger/lib/eunit/NOTES +276 -0
  45. data/lib/erlang/messenger/lib/eunit/README +3 -0
  46. data/lib/erlang/messenger/lib/eunit/doc/edoc-info +3 -0
  47. data/lib/erlang/messenger/lib/eunit/doc/erlang.png +0 -0
  48. data/lib/erlang/messenger/lib/eunit/doc/eunit.html +172 -0
  49. data/lib/erlang/messenger/lib/eunit/doc/index.html +17 -0
  50. data/lib/erlang/messenger/lib/eunit/doc/modules-frame.html +12 -0
  51. data/lib/erlang/messenger/lib/eunit/doc/overview-summary.html +984 -0
  52. data/lib/erlang/messenger/lib/eunit/doc/overview.edoc +980 -0
  53. data/lib/erlang/messenger/lib/eunit/doc/packages-frame.html +11 -0
  54. data/lib/erlang/messenger/lib/eunit/doc/stylesheet.css +55 -0
  55. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  56. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  57. data/lib/erlang/messenger/lib/eunit/ebin/eunit.app +21 -0
  58. data/lib/erlang/messenger/lib/eunit/ebin/eunit.appup +1 -0
  59. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  60. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  61. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  62. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  63. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  64. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  65. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  66. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  67. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  68. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  69. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  70. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  71. data/lib/erlang/messenger/lib/eunit/examples/eunit_examples.erl +339 -0
  72. data/lib/erlang/messenger/lib/eunit/examples/fib.erl +19 -0
  73. data/lib/erlang/messenger/lib/eunit/examples/tests.txt +1 -0
  74. data/lib/erlang/messenger/lib/eunit/include/eunit.hrl +313 -0
  75. data/lib/erlang/messenger/lib/eunit/src/Makefile +46 -0
  76. data/lib/erlang/messenger/lib/eunit/src/autoload.erl +388 -0
  77. data/lib/erlang/messenger/lib/eunit/src/code_monitor.erl +243 -0
  78. data/lib/erlang/messenger/lib/eunit/src/eunit.app.src +21 -0
  79. data/lib/erlang/messenger/lib/eunit/src/eunit.appup.src +1 -0
  80. data/lib/erlang/messenger/lib/eunit/src/eunit.erl +196 -0
  81. data/lib/erlang/messenger/lib/eunit/src/eunit_autoexport.erl +102 -0
  82. data/lib/erlang/messenger/lib/eunit/src/eunit_data.erl +798 -0
  83. data/lib/erlang/messenger/lib/eunit/src/eunit_internal.hrl +48 -0
  84. data/lib/erlang/messenger/lib/eunit/src/eunit_lib.erl +682 -0
  85. data/lib/erlang/messenger/lib/eunit/src/eunit_proc.erl +552 -0
  86. data/lib/erlang/messenger/lib/eunit/src/eunit_serial.erl +157 -0
  87. data/lib/erlang/messenger/lib/eunit/src/eunit_server.erl +340 -0
  88. data/lib/erlang/messenger/lib/eunit/src/eunit_striptests.erl +64 -0
  89. data/lib/erlang/messenger/lib/eunit/src/eunit_test.erl +334 -0
  90. data/lib/erlang/messenger/lib/eunit/src/eunit_tests.erl +45 -0
  91. data/lib/erlang/messenger/lib/eunit/src/eunit_tty.erl +272 -0
  92. data/lib/erlang/messenger/lib/eunit/src/file_monitor.erl +409 -0
  93. data/lib/erlang/messenger/lib/eunit/sys.config +9 -0
  94. data/lib/erlang/messenger/lib/eunit/vsn.mk +1 -0
  95. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  96. data/lib/erlang/messenger/pm_master_rel-0.1.script +242 -0
  97. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  98. data/lib/erlang/messenger/pm_node_rel-0.1.script +242 -0
  99. data/lib/erlang/messenger/src/master_app.erl +39 -0
  100. data/lib/erlang/messenger/src/node_app.erl +39 -0
  101. data/lib/erlang/messenger/src/pm_client.erl +19 -0
  102. data/lib/erlang/messenger/src/pm_cluster.erl +57 -0
  103. data/lib/erlang/messenger/src/pm_event_handler.erl +21 -0
  104. data/lib/erlang/messenger/src/pm_master.erl +118 -0
  105. data/lib/erlang/messenger/src/pm_master_supervisor.erl +40 -0
  106. data/lib/erlang/messenger/src/pm_node.erl +124 -0
  107. data/lib/erlang/messenger/src/pm_node_supervisor.erl +40 -0
  108. data/lib/erlang/messenger/src/pm_packager.erl +73 -0
  109. data/lib/erlang/messenger/src/utils.erl +38 -0
  110. data/lib/poolparty/base_packages/haproxy.rb +9 -2
  111. data/lib/poolparty/base_packages/heartbeat.rb +40 -28
  112. data/lib/poolparty/base_packages/poolparty.rb +39 -16
  113. data/lib/poolparty/base_packages/ruby.rb +2 -3
  114. data/lib/poolparty/config/allowed_commands.yml +1 -0
  115. data/lib/poolparty/core/array.rb +5 -2
  116. data/lib/poolparty/core/hash.rb +16 -2
  117. data/lib/poolparty/core/string.rb +9 -2
  118. data/lib/poolparty/core/symbol.rb +2 -2
  119. data/lib/poolparty/dependency_resolutions/base.rb +12 -0
  120. data/lib/poolparty/dependency_resolutions/puppet.rb +49 -0
  121. data/lib/poolparty/exceptions/UnacceptableCommand.rb +5 -0
  122. data/lib/poolparty/helpers/console.rb +3 -2
  123. data/lib/poolparty/helpers/display.rb +3 -3
  124. data/lib/poolparty/helpers/messenger.rb +29 -0
  125. data/lib/poolparty/helpers/optioner.rb +6 -2
  126. data/lib/poolparty/helpers/provisioner_base.rb +18 -11
  127. data/lib/poolparty/helpers/provisioners/master.rb +24 -22
  128. data/lib/poolparty/helpers/provisioners/slave.rb +8 -4
  129. data/lib/poolparty/modules/definable_resource.rb +1 -0
  130. data/lib/poolparty/modules/file_writer.rb +11 -10
  131. data/lib/poolparty/modules/method_missing_sugar.rb +1 -1
  132. data/lib/poolparty/modules/pretty_printer.rb +11 -11
  133. data/lib/poolparty/modules/resourcing_dsl.rb +61 -0
  134. data/lib/poolparty/monitors/base_monitor.rb +17 -3
  135. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +15 -0
  136. data/lib/poolparty/monitors/monitors/memory_monitor.rb +23 -0
  137. data/lib/poolparty/net/remote_instance.rb +6 -1
  138. data/lib/poolparty/net/remoter.rb +23 -5
  139. data/lib/poolparty/net/remoter_base.rb +5 -1
  140. data/lib/poolparty/plugins/git.rb +22 -24
  141. data/lib/poolparty/pool/base.rb +22 -6
  142. data/lib/poolparty/pool/cloud.rb +28 -4
  143. data/lib/poolparty/pool/custom_resource.rb +6 -6
  144. data/lib/poolparty/pool/loggable.rb +3 -0
  145. data/lib/poolparty/pool/pool.rb +1 -1
  146. data/lib/poolparty/pool/resource.rb +58 -94
  147. data/lib/poolparty/pool/resources/class_package.rb +6 -6
  148. data/lib/poolparty/pool/resources/conditional.rb +5 -1
  149. data/lib/poolparty/pool/resources/exec.rb +6 -2
  150. data/lib/poolparty/pool/resources/gem.rb +22 -8
  151. data/lib/poolparty/pool/resources/remote_file.rb +5 -1
  152. data/lib/poolparty/pool/resources/symlink.rb +25 -0
  153. data/lib/poolparty/pool/resources/variable.rb +8 -7
  154. data/lib/poolparty/pool/tmp/.ppkeys +3 -0
  155. data/lib/poolparty/pool/tmp/happydayz +1 -0
  156. data/lib/poolparty/pool/tmp/install_master.sh +33 -0
  157. data/lib/poolparty/pool/tmp/pool.spec +11 -0
  158. data/lib/poolparty/pool/tmp/poolparty.pp +600 -0
  159. data/lib/poolparty/pool/tmp/tc-instances.list +1 -0
  160. data/lib/poolparty/templates/cib.xml +54 -0
  161. data/lib/poolparty/templates/ha.cf +12 -3
  162. data/lib/poolparty/templates/haproxy.conf +3 -3
  163. data/lib/poolparty/templates/haresources +3 -0
  164. data/lib/poolparty/templates/poolparty.monitor +14 -0
  165. data/lib/poolparty/templates/puppet.conf +3 -4
  166. data/lib/poolparty/version.rb +1 -1
  167. data/lib/poolparty.rb +9 -6
  168. data/poolparty.gemspec +7 -6
  169. data/setup.rb +3 -3
  170. data/spec/poolparty/bin/console_spec.rb +1 -1
  171. data/spec/poolparty/core/array_spec.rb +5 -0
  172. data/spec/poolparty/core/hash_spec.rb +19 -1
  173. data/spec/poolparty/core/string_spec.rb +13 -0
  174. data/spec/poolparty/dependency_resolutions/base_spec.rb +11 -0
  175. data/spec/poolparty/helpers/messenger_spec.rb +14 -0
  176. data/spec/poolparty/helpers/optioner_spec.rb +2 -1
  177. data/spec/poolparty/helpers/provisioner_base_spec.rb +1 -1
  178. data/spec/poolparty/helpers/provisioners/master_spec.rb +2 -2
  179. data/spec/poolparty/helpers/provisioners/slave_spec.rb +3 -3
  180. data/spec/poolparty/modules/file_writer_spec.rb +9 -0
  181. data/spec/poolparty/monitors/base_monitor_spec.rb +19 -0
  182. data/spec/poolparty/monitors/monitors/cpu_monitor_spec.rb +17 -0
  183. data/spec/poolparty/net/remote_instance_spec.rb +6 -1
  184. data/spec/poolparty/net/remote_spec.rb +51 -42
  185. data/spec/poolparty/net/remoter_spec.rb +2 -1
  186. data/spec/poolparty/plugins/git_spec.rb +2 -2
  187. data/spec/poolparty/pool/base_spec.rb +20 -2
  188. data/spec/poolparty/pool/cloud_spec.rb +30 -1
  189. data/spec/poolparty/pool/custom_resource_spec.rb +2 -2
  190. data/spec/poolparty/pool/plugin_spec.rb +4 -4
  191. data/spec/poolparty/pool/pool_spec.rb +1 -1
  192. data/spec/poolparty/pool/resource_spec.rb +66 -0
  193. data/spec/poolparty/pool/resources/gem_spec.rb +29 -3
  194. data/spec/poolparty/pool/resources/symlink_spec.rb +22 -0
  195. data/spec/poolparty/pool/resources/variable_spec.rb +4 -0
  196. data/spec/poolparty/spec_helper.rb +5 -0
  197. data/tasks/cloud.rake +0 -54
  198. data/tasks/development.rake +0 -12
  199. data/tasks/ec2.rake +1 -16
  200. data/tasks/instance.rake +0 -61
  201. data/test_manifest.pp +286 -166
  202. data/website/index.html +5 -5
  203. data/website/index.txt +3 -3
  204. metadata +137 -8
  205. data/bin/pool-start-monitor +0 -1
  206. data/lib/erlang/eb_server.erl +0 -27
  207. data/lib/poolparty/plugins/gem_package.rb +0 -17
  208. data/spec/poolparty/modules/tmp/willy/nilly.rb +0 -1
@@ -3,38 +3,36 @@ module PoolParty
3
3
 
4
4
  virtual_resource(:git) do
5
5
 
6
- def loaded(opts={})
7
- install_git
6
+ def loaded(opts={}, parent=self)
8
7
  has_git_repos
9
8
  end
10
-
11
- def install_git
12
- has_package(:name => "git-core")
13
- end
14
-
9
+
15
10
  def has_git_repos
16
- with_options(:requires => 'Package["git-core"]') do
17
- has_directory(:name => "#{path}")
18
-
19
- exec({:name => "git-#{name}"}) do
20
- command @parent.user ? "git clone #{@parent.user}@#{@parent.source} #{@parent.path}" : "git clone #{@parent.source} #{@parent.path}"
21
- cwd "#{::File.dirname(@parent.path) if @parent.path}"
22
- creates ["#{@parent.path}", "#{@parent.path}/.git"]
23
- end
24
-
25
- exec(:name => "git-update-#{name}", :cwd => "#{path}") do
11
+ exec({:name => "git-#{name}"}) do
12
+ command parent.user ? "git clone #{parent.user}@#{parent.source} #{parent.path}" : "git clone #{parent.source} #{parent.to ? parent.to : ""}"
13
+ cwd "#{parent.cwd if parent.cwd}"
14
+ creates "#{::File.join( (parent.cwd ? parent.cwd : cwd), ::File.basename(parent.source, ::File.extname(parent.source)) )}/.git"
15
+
16
+ exec(:name => "update-#{name}") do
17
+ cwd ::File.dirname(parent.creates)
26
18
  command "git pull"
27
- requires "Exec['git-#{@parent.name}']"
28
- end
29
-
30
- if symlink
31
- has_file(:name => "#{symlink}") do
32
- ensures @parent.path
33
- end
34
19
  end
20
+
35
21
  end
36
22
  end
37
23
 
24
+ # Since git is not a native type, we have to say which core resource
25
+ # it is using to be able to require it
26
+ def class_type_name
27
+ "exec"
28
+ end
29
+
30
+ # Because we are requiring an exec, instead of a built-in package of the git, we have to overload
31
+ # the to_s method and prepend it with the same name as above
32
+ def key
33
+ "git-#{name}"
34
+ end
35
+
38
36
  end
39
37
 
40
38
  end
@@ -13,18 +13,17 @@ module PoolParty
13
13
  :environment => "production",
14
14
  :user => "root", # This should change here
15
15
  :base_keypair_path => "~/.ec2",
16
- :tmp_path => "tmp",
17
- :remote_storage_path => "/var/poolparty",
18
- :storage_directory => File.join(Dir.pwd, "tmp"),
16
+ :tmp_path => "/tmp/poolparty",
17
+ :remote_storage_path => "/var/poolparty",
19
18
  :fileserver_base => "puppet:///files",
20
19
  :base_config_directory => "/etc/poolparty",
21
- :template_directory => "tmp/templates",
20
+ :template_directory => "templates",
22
21
  :template_path => "/var/lib/puppet/templates",
22
+ :module_path => "/etc/puppet/modules/poolparty",
23
23
  :default_specfile_name => "pool.spec",
24
24
  :port => "80",
25
25
  :forwarding_port => "8080",
26
- :proxy_mode => "http",
27
- :pool_logger_location => File.join(Dir.pwd, "logs"),
26
+ :proxy_mode => "http",
28
27
  # EC2 Options
29
28
  :ami => "ami-1cd73375"
30
29
  })
@@ -69,6 +68,23 @@ module PoolParty
69
68
  "ppkeys"
70
69
  ]
71
70
  end
71
+
72
+ def storage_directory
73
+ [
74
+ "/var/poolparty"
75
+ ].select do |dir|
76
+ dir if ::File.directory?(dir) && ::File.readable?(dir)
77
+ end.first || ::File.join( "/tmp/poolparty")
78
+ end
79
+
80
+ def pool_logger_location
81
+ File.join(Dir.pwd, "logs")
82
+ end
83
+
84
+ # Array of allowed_commands that you can run on the remote nodes
85
+ def allowed_commands
86
+ @allowed_commands ||= open(::File.join( ::File.dirname(__FILE__), "..", "config", "allowed_commands.yml")).read.split(/\n/).map {|a| a.chomp }
87
+ end
72
88
 
73
89
  end
74
90
  end
@@ -47,18 +47,21 @@ module PoolParty
47
47
  # this can be overridden in the spec, but ec2 is the default
48
48
  self.using :ec2
49
49
  end
50
-
50
+
51
51
  # Keypairs
52
52
  # If the parent (pool) doesn't have a keypair defined on it, then generate one based on the
53
53
  # pool_name and the cloud_name
54
54
  def keypair(*args)
55
55
  has_keypair? ? options[:keypair] : generate_keypair(*args)
56
56
  end
57
+ # Let's just make sure that the keypair exists on the options
57
58
  def has_keypair?
58
59
  options.has_key?(:keypair) && options[:keypair]
59
60
  end
61
+ # Generate a keypair based on the parent's name (if there is a parent)
62
+ # and the cloud's name
60
63
  def generate_keypair(*args)
61
- options[:keypair] = args.length > 0 ? args[0] : "#{@parent.respond_to?(:name) ? @parent.name : ""}_#{@name}"
64
+ options[:keypair] = args.length > 0 ? args[0] : "#{@parent && @parent.respond_to?(:name) ? @parent.name : ""}_#{@name}"
62
65
  end
63
66
 
64
67
  # Prepare to send the new configuration to the instances
@@ -104,13 +107,14 @@ module PoolParty
104
107
  copy_file_to_storage_directory(::File.join(::File.dirname(__FILE__), "..", "templates", f))
105
108
  end
106
109
  end
107
-
110
+
108
111
  # Configuration files
109
112
  def build_manifest
113
+ @build_manifest ||= build_from_existing_file
110
114
  unless @build_manifest
111
115
  reset_resources!
112
116
  add_poolparty_base_requirements
113
-
117
+
114
118
  @build_manifest = returning Array.new do |str|
115
119
 
116
120
  str << resources_string_from_resources(resources)
@@ -130,6 +134,14 @@ module PoolParty
130
134
  @build_manifest
131
135
  end
132
136
 
137
+ def build_from_existing_file
138
+ if ::FileTest.file?("/etc/puppet/manifests/classes/poolparty.pp")
139
+ open("/etc/puppet/manifests/classes/poolparty.pp").read
140
+ else
141
+ nil
142
+ end
143
+ end
144
+
133
145
  # To allow the remote instances to do their job,
134
146
  # they need a few options to run, these are the required options
135
147
  # to be saved on the remote "master" machine
@@ -149,6 +161,18 @@ module PoolParty
149
161
  ruby
150
162
  poolparty
151
163
  end
164
+
165
+ def provisioning?
166
+ @provisioning_in_progress == true
167
+ end
168
+
169
+ def provisioning_in_progress
170
+ @provisioning_in_progress = true
171
+ end
172
+
173
+ def provisioning_complete
174
+ @provisioning_in_progress = false
175
+ end
152
176
 
153
177
  # Add to the services pool for the manifest listing
154
178
  def add_service(serv)
@@ -22,11 +22,11 @@ module PoolParty
22
22
  class CallFunction < Resource
23
23
  def initialize(str="", opts={}, parent=self, &block)
24
24
  @str = str
25
- super(opts, parent, &block)
25
+ # super(opts, parent, &block)
26
26
  end
27
- def to_string(prev="")
27
+ def to_string(pre="")
28
28
  returning Array.new do |arr|
29
- arr << "#{prev}#{@str}"
29
+ arr << "#{pre}#{@str}"
30
30
  end.join("\n")
31
31
  end
32
32
  end
@@ -42,10 +42,10 @@ module PoolParty
42
42
  super(subclass)
43
43
  end
44
44
 
45
- def to_string(prev="")
45
+ def to_string(pre="")
46
46
  returning Array.new do |output|
47
- output << "#{prev} # Custom Functions\n"
48
- output << self.class.custom_functions_to_string(prev)
47
+ output << "#{pre} # Custom Functions\n"
48
+ output << self.class.custom_functions_to_string(pre)
49
49
  end.join("\n")
50
50
  end
51
51
  end
@@ -1,3 +1,6 @@
1
+ =begin rdoc
2
+ A logging class to allow us to log to locations
3
+ =end
1
4
  class Loggable
2
5
  def initialize
3
6
  Logging.init :debug, :info, :warn, :error, :fatal
@@ -39,7 +39,7 @@ module PoolParty
39
39
  end
40
40
 
41
41
  def plugin_directory(*args)
42
- args.each {|arg| Dir["#{arg}/*.rb"].each {|f| load f }}
42
+ args.each {|arg| Dir["#{arg}/*/*.rb"].each {|f| require f }}
43
43
  end
44
44
 
45
45
  # This is where the entire process starts
@@ -17,14 +17,19 @@ module PoolParty
17
17
  resources[type] ||= []
18
18
  end
19
19
 
20
- def add_resource(type, opts={}, parent=self, &block)
21
- returning "PoolParty::Resources::#{type.to_s.camelize}".classify.constantize.new(opts, parent, &block) do |o|
22
- resource(type) << o
20
+ def add_resource(type, opts={}, parent=self, &block)
21
+ resource = get_resource(type, opts[:name], parent)
22
+ if resource
23
+ resource
24
+ else
25
+ returning "PoolParty::Resources::#{type.to_s.camelize}".classify.constantize.new(opts, parent, &block) do |o|
26
+ resource(type) << o
27
+ end
23
28
  end
24
29
  end
25
30
 
26
- def get_resource(type, name)
27
- resource(type).select {|resource| resource.name == name }.first
31
+ def get_resource(type, key, parent=self)
32
+ resource(type).select {|resource| resource.key == key }.first
28
33
  end
29
34
 
30
35
  #:nodoc:
@@ -32,11 +37,11 @@ module PoolParty
32
37
  @resources = nil
33
38
  end
34
39
 
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
+ # def resources_string(pre="")
41
+ # returning Array.new do |output|
42
+ # output << resources_string_from_resources(resources)
43
+ # end.join("\n")
44
+ # end
40
45
 
41
46
  def custom_file(path, str)
42
47
  write_to_file_in_storage_directory(path, str)
@@ -56,11 +61,11 @@ module PoolParty
56
61
  lowercase_class_name = subclass.to_s.downcase
57
62
 
58
63
  # Add add resource method to the Resources module
59
- unless PoolParty::Resources.respond_to?(lowercase_class_name.to_sym)
64
+ unless PoolParty::Resources.respond_to?(lowercase_class_name.to_sym)
60
65
  method =<<-EOE
61
66
  def #{lowercase_class_name}(opts={}, parent=self, &blk)
62
67
  add_resource(:#{lowercase_class_name}, opts, parent, &blk)
63
- end
68
+ end
64
69
  EOE
65
70
  PoolParty::Resources.module_eval method
66
71
  PoolParty::Resources.add_has_and_does_not_have_methods_for(lowercase_class_name.to_sym)
@@ -85,64 +90,39 @@ module PoolParty
85
90
  # Finally, it uses the parent's options as the lowest priority
86
91
  def initialize(opts={}, parent=self, &block)
87
92
  # Take the options of the parents
88
- @parent = parent
93
+ set_resource_parent(parent)
89
94
  set_vars_from_options(opts) unless opts.empty?
90
95
  self.instance_eval &block if block
91
- loaded(opts)
96
+ loaded(opts, @parent)
97
+ end
98
+
99
+ def set_resource_parent(parent=nil)
100
+ if parent && parent != self
101
+ @parent = parent
102
+ requires parent.to_s if @parent.is_a?(PoolParty::Resources::Resource) && printable? && @parent.printable?
103
+ end
92
104
  end
93
105
 
106
+ # def requirement_tree
107
+ # p = @parent
108
+ # returning Array.new do |arr|
109
+ # arr << p.to_s
110
+ # while p && p != self && p.is_a?(PoolParty::Resources::Resource) && p.requires
111
+ # arr << p.requires
112
+ # p = p.parent
113
+ # end
114
+ # end.flatten.uniq
115
+ # end
116
+
94
117
  # Stub, so you can create virtual resources
95
- def loaded(opts={})
118
+ # This is called after the resource is initialized
119
+ # with the options given to it in the init-block
120
+ def loaded(opts={}, parent=self)
96
121
  end
97
122
 
98
123
  # DSL Overriders
99
- # Overrides for syntax
100
- # Allows us to send require to require a resource
101
- def require(str="")
102
- options[:require]
103
- end
104
- def requires(str="")
105
- options.merge!(:require => str)
106
- end
107
- def ensures(str="running")
108
- if %w(absent running).map {|a| self.send a.to_sym}.include?(str)
109
- str == "absent" ? is_absent : is_present
110
- else
111
- options.merge!(:ensure => str)
112
- end
113
- end
114
- # Allows us to send an ensure to ensure the presence of a resource
115
- def is_present(*args)
116
- options.merge!(:ensure => present)
117
- end
118
- # Ensures that what we are sending is absent
119
- def is_absent(*args)
120
- options.merge!(:ensure => absent)
121
- end
122
- # Alias for unless
123
- def ifnot(str="")
124
- options.merge!(:unless => str)
125
- end
126
- def present
127
- "present"
128
- end
129
- def absent
130
- "absent"
131
- end
124
+ include PoolParty::ResourcingDsl
132
125
 
133
- # Give us a template to work with on the resource
134
- # Make sure this template is moved to the tmp directory as well
135
- def template(file, opts={})
136
- raise TemplateNotFound.new("no template given") unless file
137
- raise TemplateNotFound.new("template cannot be found #{file}") unless ::File.file?(file)
138
- unless opts[:just_copy]
139
- options.merge!({:content => "template(\"#{::File.basename(file)}\")"})
140
- options.delete(:source) if options.has_key?(:source)
141
- copy_template_to_storage_directory(file)
142
- else
143
- copy_file_to_storage_directory(file)
144
- end
145
- end
146
126
  # This way we can subclass resources without worry
147
127
  def class_type_name
148
128
  self.class.to_s.top_level_class
@@ -161,11 +141,11 @@ module PoolParty
161
141
  self.class.custom_functions << str
162
142
  end
163
143
 
164
- def self.custom_functions_to_string(prev="")
144
+ def self.custom_functions_to_string(pre="")
165
145
  returning Array.new do |output|
166
146
  PoolParty::Resources.available_custom_resources.each do |resource|
167
147
  resource.custom_functions.each do |func|
168
- output << "#{prev*2}#{func}"
148
+ output << "#{pre*2}#{func}"
169
149
  end
170
150
  end
171
151
  end.join("\n")
@@ -180,47 +160,31 @@ module PoolParty
180
160
  def virtual_resource?
181
161
  false
182
162
  end
163
+ def printable?
164
+ true
165
+ end
183
166
  # We want to gather the options, but if the option sent is nil
184
167
  # then we want to override the option value by sending the key as
185
168
  # a method so that we can override this if necessary.
186
169
  # Only runs on objects that have options defined, otherwise
187
170
  # it returns an empty hash
188
171
  def get_modified_options
189
- if options
190
- opts = options.inject({}) do |sum,h|
191
- sum.merge!({h[0].to_sym => ((h[1].nil?) ? self.send(h[0].to_sym) : h[1]) })
172
+ unless @modified_options
173
+ if options
174
+ opts = options.inject({}) do |sum,h|
175
+ sum.merge!({h[0].to_sym => ((h[1].nil?) ? self.send(h[0].to_sym) : h[1]) })
176
+ end
177
+ else
178
+ opts = {}
192
179
  end
193
- else
194
- opts = {}
180
+ @modified_options = opts.reject {|k,v| disallowed_options.include?(k) }
195
181
  end
196
- opts.reject {|k,v| disallowed_options.include?(k) }
182
+ @modified_options
197
183
  end
198
184
 
199
- # Generic to_s
200
- # Most Resources won't need to extend this
201
- def to_string(prev="")
202
- opts = get_modified_options
203
- returning Array.new do |output|
204
-
205
- output << @prestring || ""
206
-
207
- if resources && !resources.empty?
208
- @cp = classpackage_with_self(self)
209
- output << @cp.to_string
210
- output << "include #{@cp.name.sanitize}"
211
- end
212
-
213
- unless virtual_resource?
214
- output << "#{prev}#{class_type_name} {"
215
- output << "#{prev}\"#{self.key}\":"
216
- output << opts.flush_out("#{prev*2}").join(",\n")
217
- output << "#{prev}}"
218
- end
219
-
220
- output << @poststring || ""
221
-
222
- end.join("\n")
223
- end
185
+ # For the time being, we'll make puppet the only available dependency resolution
186
+ # base, but in the future, we can rip this out and make it an option
187
+ include PoolParty::DependencyResolutions::Puppet
224
188
  end
225
189
 
226
190
  # Adds two methods to the module
@@ -27,14 +27,14 @@ module PoolParty
27
27
  def to_string
28
28
  returning String.new do |output|
29
29
  output << "# #{name.sanitize}"
30
- output << "\nclass #{name.sanitize} {\n"
30
+ output << "\nclass #{name.sanitize.downcase} {\n"
31
31
  output << resources_string_from_resources(resources)
32
32
  output << "\n}\n"
33
33
  end
34
34
  end
35
35
 
36
36
  def include_string
37
- "include #{name.sanitize}"
37
+ "include #{name.sanitize.downcase}"
38
38
  end
39
39
 
40
40
  def name(*args)
@@ -43,19 +43,19 @@ module PoolParty
43
43
 
44
44
  end
45
45
 
46
- def resources_string_from_resources(resources, prev="\t")
46
+ def resources_string_from_resources(resources, pre="\t")
47
47
  @variables = resources.extract! {|name,resource| name == :variable}
48
48
  returning Array.new do |str|
49
49
  unless @variables.empty?
50
50
  str << "\n# Variables \n"
51
51
  @variables.each do |name, variable|
52
- str << variable.to_string("#{prev}")
52
+ str << variable.to_string("#{pre}")
53
53
  end
54
54
  end
55
55
 
56
56
  resources.each do |type, resource|
57
- str << "\n#{prev*2}# #{type}\n"
58
- str << resource.to_string("#{prev*2}")
57
+ str << "\n#{pre*2}# #{type}\n"
58
+ str << resource.to_string("#{pre*2}")
59
59
  end
60
60
  end.join("\n")
61
61
  end
@@ -25,7 +25,11 @@ module PoolParty
25
25
  true
26
26
  end
27
27
 
28
- def to_string(prev="")
28
+ def printable?
29
+ false
30
+ end
31
+
32
+ def to_string(pre="")
29
33
  returning Array.new do |output|
30
34
  output << "# #{name.sanitize}"
31
35
  output << "case #{attribute} {"
@@ -7,9 +7,13 @@ module PoolParty
7
7
  :path => "/usr/bin:/bin:/usr/local/bin:$PATH"
8
8
  })
9
9
 
10
-
10
+ # Execs cannot have the following parameters
11
+ # We use version in the gempackage resource
12
+ # So we have to exclude it here. Alternatively, we could
13
+ # exclude it in the gempackage, but this is an example
14
+ # of how to exclude it as well
11
15
  def disallowed_options
12
- [:ensure, :name]
16
+ [:ensure, :name, :source, :version]
13
17
  end
14
18
 
15
19
  def key
@@ -1,14 +1,28 @@
1
1
  module PoolParty
2
2
  module Resources
3
-
4
- def gem(opts={}, parent=self, &block)
5
- add_resource(:package, opts.merge({
6
- :provider => "gem",
7
- :requires => "Package[rubygems]"
8
- }), parent, &block)
3
+
4
+ class Gempackage < Resource
5
+
6
+ # When we call gempackage, we want the exec to run on the directory we suggest
7
+ # we also only want it to run if there is NOT a local gem already installed with
8
+ # the package details (version and name)
9
+ def loaded(opts={}, parent=self)
10
+ has_exec(opts.merge({:name => name, :cwd => "/tmp", :path => "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/var/lib/gems/1.8/bin"}), parent) do
11
+ command "gem install -y --no-ri --no-rdoc #{"--version #{version}" if version} #{"--source #{source}" if source} #{name}"
12
+ ifnot "gem list --local #{name} | grep #{name} #{"| grep #{version}" if version}"
13
+ end
14
+ end
15
+ def virtual_resource?
16
+ true
17
+ end
18
+ def printable?
19
+ true
20
+ end
21
+ def class_type_name
22
+ "Exec"
23
+ end
24
+
9
25
  end
10
26
 
11
- add_has_and_does_not_have_methods_for(:gem)
12
-
13
27
  end
14
28
  end
@@ -1,7 +1,7 @@
1
1
  module PoolParty
2
2
  module Resources
3
3
 
4
- class Remotefile < File
4
+ class Remotefile < Resource
5
5
  # Not really my favorite of lines
6
6
  include PoolParty::Configurable
7
7
 
@@ -16,6 +16,10 @@ module PoolParty
16
16
  "file"
17
17
  end
18
18
 
19
+ def source(arg=nil)
20
+ arg ? options[:source] = arg : "#{Base.fileserver_base}/#{::File.basename(name)}"
21
+ end
22
+
19
23
  end
20
24
 
21
25
  end
@@ -0,0 +1,25 @@
1
+ module PoolParty
2
+ module Resources
3
+
4
+ class Symlink < Resource
5
+
6
+ def class_type_name
7
+ "file"
8
+ end
9
+
10
+ def disallowed_options
11
+ [:name, :source]
12
+ end
13
+
14
+ def present
15
+ source
16
+ end
17
+
18
+ def printable?
19
+ true
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -8,17 +8,18 @@ module PoolParty
8
8
  :value => ""
9
9
  })
10
10
 
11
- def to_string(prev="\t")
11
+ def to_string(pre="\t")
12
12
  "$#{name} = #{value_string}"
13
13
  end
14
14
 
15
15
  def value_string
16
- case value.class.to_s
17
- when "Array"
18
- "[ #{value.map{|a| "'#{a}'"}.join(", ")} ]"
19
- else
20
- "'#{value}'"
21
- end
16
+ value.to_option_string
17
+ # case value.class.to_s
18
+ # when "Array"
19
+ # "[ #{value.map{|a| "'#{a}'"}.join(", ")} ]"
20
+ # else
21
+ # "'#{value}'"
22
+ # end
22
23
  end
23
24
 
24
25
  end
@@ -0,0 +1,3 @@
1
+ ---
2
+ :secret_access_key: rKZu/271FGDUKYCJb384Q4VcuUExUU7s2ZeB6GgV
3
+ :access_key: 03KJGAWXR5TVXMGB1G02
@@ -0,0 +1 @@
1
+ write this text