poolparty 0.2.6 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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