auser-poolparty 1.2.0 → 1.2.1

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 (54) hide show
  1. data/VERSION.yml +1 -1
  2. data/bin/cloud-verify +2 -0
  3. data/bin/install-poolparty +216 -0
  4. data/lib/poolparty/{aska/aska.rb → aska.rb} +0 -0
  5. data/lib/poolparty/core/string.rb +11 -0
  6. data/lib/poolparty/core/symbol.rb +10 -0
  7. data/lib/poolparty/dependency_resolver/chef_resolver.rb +16 -34
  8. data/lib/poolparty/dependency_resolver/dependency_resolver_cloud_extensions.rb +4 -4
  9. data/lib/poolparty/dependency_resolver/puppet_resolver.rb +15 -27
  10. data/lib/poolparty/lite.rb +1 -1
  11. data/lib/poolparty/modules/searchable_paths.rb +91 -0
  12. data/lib/poolparty/net/init.rb +0 -1
  13. data/lib/poolparty/net/remote_bases.rb +0 -1
  14. data/lib/poolparty/net/remoter_base.rb +5 -0
  15. data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +3 -1
  16. data/lib/poolparty/plugins/apache2/apache.rb +340 -0
  17. data/lib/poolparty/plugins/rails_deploy.rb +76 -0
  18. data/lib/poolparty/poolparty/default.rb +1 -0
  19. data/lib/poolparty/poolparty/plugin.rb +4 -1
  20. data/lib/poolparty/poolparty/poolparty_base_class.rb +2 -4
  21. data/lib/poolparty/poolparty/resource.rb +4 -0
  22. data/lib/poolparty/poolparty/service.rb +8 -0
  23. data/lib/poolparty/resources/file.rb +3 -3
  24. data/lib/poolparty/templates/apache2/apache2.conf +14 -0
  25. data/lib/poolparty/templates/apache2/base.conf.erb +168 -0
  26. data/lib/poolparty/templates/apache2/browser_fixes.conf.erb +26 -0
  27. data/lib/poolparty/templates/apache2/debian.conf.erb +675 -0
  28. data/lib/poolparty/templates/apache2/default-site.conf.erb +41 -0
  29. data/lib/poolparty/templates/apache2/directory_indexes.conf.erb +101 -0
  30. data/lib/poolparty/templates/apache2/logging-syslog.conf.erb +42 -0
  31. data/lib/poolparty/templates/apache2/mime-extras.conf.erb +211 -0
  32. data/lib/poolparty/templates/apache2/mime-minimal.conf.erb +15 -0
  33. data/lib/poolparty/templates/apache2/mpm-worker.conf.erb +20 -0
  34. data/lib/poolparty/templates/apache2/mpm-worker.erb +20 -0
  35. data/lib/poolparty/templates/apache2/passenger.conf.erb +20 -0
  36. data/lib/poolparty/templates/apache2/php.ini.erb +1253 -0
  37. data/lib/poolparty/templates/apache2/server-status.erb +19 -0
  38. data/lib/poolparty/verification/verifiers/http_match.rb +43 -0
  39. data/lib/poolparty/verification/verifiers/http_status.rb +59 -0
  40. data/lib/poolparty/verification/verifiers/ping.rb +13 -1
  41. data/lib/poolparty.rb +1 -1
  42. data/lib/poolpartycl.rb +51 -0
  43. data/spec/poolparty/dependency_resolver/dependency_resolver_cloud_extensions_spec.rb +5 -11
  44. data/spec/poolparty/modules/searchable_paths_spec.rb +76 -0
  45. data/spec/poolparty/plugins/git_spec.rb +4 -3
  46. data/spec/poolparty/poolparty/cloud_spec.rb +3 -19
  47. data/spec/poolparty/resources/file_spec.rb +1 -0
  48. data/spec/poolparty/resources/service_spec.rb +1 -1
  49. data/test/poolparty/dependency_resolver/puppet_resolver_test.rb +5 -11
  50. data/test/poolparty/poolparty/poolparty_base_class_test.rb +1 -1
  51. metadata +27 -7
  52. data/lib/poolparty/plugins/apache2.rb +0 -53
  53. data/lib/poolparty/plugins/dynomite.rb +0 -14
  54. data/lib/poolparty/plugins/tokyo_tyrant.rb +0 -23
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 2
3
- :patch: 0
3
+ :patch: 1
4
4
  :major: 1
data/bin/cloud-verify CHANGED
@@ -23,6 +23,8 @@ o.loaded_clouds.each do |cld|
23
23
  Verification failed: #{e}"
24
24
  Please check your clouds.rb for any errors
25
25
 
26
+ Exception: #{e.class}: #{e.message}\n\t#{e.backtrace.join("\n\t")}
27
+
26
28
  EOM
27
29
  end
28
30
 
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "poolparty"
4
+ require "poolpartycl"
5
+ require "highline/import"
6
+
7
+ welcome_msg = <<-EOE
8
+ We are going to take you through the installation process of PoolParty.
9
+
10
+ First, we'll setup your environment so using PoolParty will be a breeze
11
+ EOE
12
+
13
+ closing_message = <<-EOE
14
+ You are now set to ride the waves with PoolParty! You'll notice there is a clouds.rb file in your current directory. You can start your new cloud
15
+ by typing:
16
+
17
+ cloud start
18
+
19
+ You can start your clouds.rb. More samples are available here:
20
+ http://github.com/auser/poolparty-examples/tree/master
21
+ EOE
22
+
23
+ colored_say "Welcome to PoolParty!", :help
24
+ say welcome_msg
25
+ begin
26
+ t = colored_ask "Press enter to continue or Ctrl+C to exit"
27
+ rescue Exception => e
28
+ say <<-EOE
29
+
30
+ Cancelled PoolParty installation
31
+
32
+ You can always restart this by typing:
33
+ install-poolparty
34
+ EOE
35
+ exit 0
36
+ end
37
+
38
+ say("\nWhat remoter base would you like to use?")
39
+ choose do |menu|
40
+ menu.prompt = "> "
41
+
42
+ available_bases.each do |base|
43
+ menu.choice base.to_sym do
44
+
45
+ colored_say "Great, we'll be using #{base}"
46
+
47
+ case base
48
+ when :ec2
49
+
50
+ key_help_str = <<-EOE
51
+ Now you need to get your keys from Amazon AWS.
52
+ If you don't already have your keys setup, navigate to http://aws.amazon.com
53
+ and click on Your Account. Click on the Access Identifiers tab and find:
54
+ Your Access Key ID. This is your access key.
55
+ EOE
56
+ access_key_str = <<-EOE
57
+ Since you'll be using ec2, we'll have to set some things up before
58
+ we can get going on PoolParty. Don't worry, this information will stay between us.
59
+
60
+ EOE
61
+ say access_key_str
62
+ ask_with_help :message => "First, what's your access key?",
63
+ :help => key_help_str do |t|
64
+
65
+ @access_key = t
66
+
67
+ key_help_str = <<-EOE
68
+ If you don't already have your keys setup, navigate to http://aws.amazon.com
69
+ and click on Your Account. Click on the Access Identifiers tab and find:
70
+ Your Secret Access Key ID. Click on the - show button.
71
+ This is your secret access key.
72
+ EOE
73
+ ask_with_help :message => "Awesome. Now what's your secret access key? ",
74
+ :help => key_help_str do |t|
75
+ @secret_access_key = t
76
+
77
+ rescued_ask_str = <<-EOS
78
+ Super duper! You'll need to make sure you have yout X.509 certificate downloaded too.
79
+ Save this in your ~/.ec2 directory.
80
+
81
+ Press enter when you're ready
82
+ EOS
83
+
84
+ cert_help_str = <<-EOE
85
+ To get your X.509 certificates, navigate to http://aws.amazon.com and login. Click on
86
+ Your Account and scroll down. The X.509 Certificate box is at the bottom. Make sure you
87
+ click download and save the cert-*.pem file. If you don't know or don't have the pk-*.pem file
88
+ you may have to recreate it. Not to worry though, it's super easy. Click on the Create New button.
89
+ From there, you can download the cert-*.pem and the pk-*.pem files.
90
+
91
+ EOE
92
+
93
+ ask_with_help :message => rescued_ask_str,
94
+ :help => cert_help_str do |t|
95
+
96
+ begin
97
+ ec2 = PoolParty::Remote::Ec2.ec2({:access_key => @access_key, :secret_access_key => @secret_access_key})
98
+ keypairs = ec2.describe_keypairs["keySet"]["item"]
99
+ keynames = keypairs.map {|k| k["keyName"]}
100
+ rescue Exception => e
101
+ colored_say "There was an error: #{e}. Recheck your access_key and secret_access_key to make sure you copied them correctly"
102
+ exit 1
103
+ end
104
+
105
+ key_str =<<-EOK
106
+
107
+ Finally, what's the name of the keypair you'd like to use?
108
+
109
+ You already have the following keypairs setup:
110
+ \t#{keynames.join("\n\t")}
111
+
112
+ You can use one of these keys, or create a new one.
113
+ EOK
114
+
115
+ key_str_help =<<-EOH
116
+ To make a new keypair, make sure you have the ec2 tools installed. You can create a new one by typing the command:
117
+ ec2-add-keypair
118
+
119
+ Save this into a file in your ~/.ec2 directory. Enter the name of the keypair here.
120
+ EOH
121
+ ask_with_help :message => key_str,
122
+ :help => key_str_help do |t|
123
+ @keypair = t
124
+ say <<-EOE
125
+
126
+ In your clouds.rb, you can use this keypair in your clouds.
127
+
128
+ Create one for each cloud you want to use.
129
+
130
+ EOE
131
+
132
+ clds =<<-EOC
133
+ pool :my_pool do
134
+ cloud :my_app do
135
+
136
+ # Copy these lines and source them in your .profile or .bashrc file
137
+ # export AWS_ACCESS_KEY="#{@access_key}"
138
+ # export AWS_SECRET_ACCESS_KEY="#{@secret_access_key}"
139
+ # export EC2_PRIVATE_KEY=$(ls ~/.ec2/pk-*.pem)
140
+ # export EC2_CERT=$(ls ~/.ec2/cert-*.pem)
141
+
142
+ access_key "#{@access_key}"
143
+ secret_access_key "#{@secret_access_key}"
144
+ keypair "#{@keypair}"
145
+
146
+ has_file "/etc/motd" do
147
+ content "Welcome to your first PoolParty instance!"
148
+ end
149
+ end
150
+ end
151
+ EOC
152
+
153
+ ::File.open("clouds.rb", "w") {|f| f << clds}
154
+ colored_say closing_message
155
+ end
156
+ end
157
+
158
+ end
159
+ end
160
+ when :vmrun
161
+ vmrun_file_help =<<-EOV
162
+ Vmware uses a vmwarevm file to keep information about the vmware instance. To find the vmwarevm file,
163
+ navigate to vmware and find the vm you'd like to use. Find this in finder and paste that here.
164
+ EOV
165
+ default_vmrun_file = Dir["#{::File.expand_path("~")}/Documents/Virtual\ Machines/*.vmwarevm"].first rescue nil
166
+ vmrun_file = <<-EOE
167
+ Awesome. What's the path to your vmwarevm file?
168
+ #{
169
+ if default_vmrun_file
170
+ "Is this it: #{default_vmrun_file}? (Press enter to accept default)"
171
+ end
172
+ }
173
+ EOE
174
+ ask_with_help :message => vmrun_file,
175
+ :help => vmrun_file_help do |t|
176
+
177
+ t = default_vmrun_file if t.nil? || t.empty?
178
+ ip_help =<<-EOV
179
+ Right now, vmrun, the remoter base needs an explicitly set ip. Log into your vm and type ifconfig. Copy and paste that here.
180
+ EOV
181
+ ask_with_help :message => "Now, what's the ip of your vm?",
182
+ :validate => /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|h|H/,
183
+ :help => ip_help do |i|
184
+
185
+ ask_with_help :message => "Finally, make sure you get your key on the vm. You can use this command: \n\tscp ~/.ssh/id_rsa.pub root@#{i}:/root/.ssh/authorized_keys.\n\nPress enter when you're ready" do |qqqq|
186
+
187
+ vmx_file = Dir["#{t}/*.vmx"].first
188
+ clds =<<-EOC
189
+ pool :my_pool do
190
+ cloud :my_app do
191
+ using :vmrun do
192
+ vmx_hash({
193
+ "#{vmx_file}" => "#{i}"
194
+ })
195
+ end
196
+
197
+ has_file "/etc/motd" do
198
+ content "Welcome to your first PoolParty instance!"
199
+ end
200
+ end
201
+ end
202
+ EOC
203
+
204
+ ::File.open("clouds.rb", "w") {|f| f << clds}
205
+ colored_say closing_message
206
+
207
+ end
208
+ end
209
+ end
210
+ else
211
+ say("Not sure what remoter_base you mean. Please choose from the menu.")
212
+ end
213
+ end
214
+ end
215
+
216
+ end
File without changes
@@ -176,5 +176,16 @@ class String
176
176
  def macify
177
177
  split(":").map {|a| a[0].chr == "0" ? a[1].chr : a}.join(":")
178
178
  end
179
+
180
+ ##
181
+ # @param o<String> The path component to join with the string.
182
+ #
183
+ # @return <String> The original path concatenated with o.
184
+ #
185
+ # @example
186
+ # "merb"/"core_ext" #=> "merb/core_ext"
187
+ def /(o)
188
+ File.join(self, o.to_s)
189
+ end
179
190
 
180
191
  end
@@ -14,4 +14,14 @@ class Symbol
14
14
  def <=>(b)
15
15
  "#{self}" <=> "#{b}"
16
16
  end
17
+ ##
18
+ # @param o<String, Symbol> The path component to join with the string.
19
+ #
20
+ # @return <String> The original path concatenated with o.
21
+ #
22
+ # @example
23
+ # :merb/"core_ext" #=> "merb/core_ext"
24
+ def /(o)
25
+ File.join(self.to_s, o.to_s)
26
+ end
17
27
  end
@@ -39,11 +39,7 @@ module PoolParty
39
39
 
40
40
  def comp(cld_name, props, tabs)
41
41
 
42
- default_recipe = [
43
- resources_to_string(props[:resources],tabs),
44
- services_to_string(props[:services],tabs)
45
- ].join("\n")
46
-
42
+ default_recipe = resources_to_string(props[:resources],tabs)
47
43
  ::File.open("#{base_dir}/recipes/default.rb", "w+") {|f| f << default_recipe }
48
44
 
49
45
  default_recipe
@@ -73,7 +69,7 @@ module PoolParty
73
69
  end
74
70
 
75
71
  def resources_to_string(opts,tabs=0)
76
- out = []
72
+ out = []
77
73
  out << opts.map do |resource|
78
74
  case ty = resource.delete(:pp_type)
79
75
  when "variable"
@@ -82,6 +78,8 @@ module PoolParty
82
78
  "#{tf(tabs)}include_recipe #{to_option_string(resource.name)}"
83
79
  when "chef_library"
84
80
  "#{tf(tabs)}require #{to_option_string("/etc/chef/lib/#{resource.name}")}"
81
+ when "plugin"
82
+ handle_print_service(resource, tabs)
85
83
  else
86
84
  real_type = handle_chef_types(ty)
87
85
  real_name = resource[:name]
@@ -89,22 +87,22 @@ module PoolParty
89
87
  "#{tf(tabs)}#{real_type} \"#{real_name}\" do\n#{tf(tabs+1)}#{hash_flush_out(res).compact.join("\n#{tf(tabs+1)}")}\n#{tf(tabs)}end"
90
88
  end
91
89
  end
92
- out.join("\n")
90
+ out.compact.join("\n")
93
91
  end
94
92
 
95
93
  def handle_print_variable(varhash)
96
94
  o = []
97
95
  if varhash[:namespace]
98
96
  o << ["\n#{varhash[:namespace]} Mash.new unless attribute?('#{varhash[:namespace]}')"]
99
- o << "#{varhash[:namespace]}[:#{varhash[:name]}] = #{to_option_string(varhash[:value])}\n"
97
+ o << "#{varhash[:namespace]}['#{varhash[:name]}'] = #{to_option_string(varhash[:value])}\n"
100
98
  else
101
- o << "poolparty[:#{varhash[:name]}] = #{to_option_string(varhash[:value])}"
99
+ o << "poolparty['#{varhash[:name]}'] = #{to_option_string(varhash[:value])}"
102
100
  end
103
101
  ::File.open("#{base_dir}/attributes/poolparty.rb", "a+") do |f|
104
102
  f << o.join("\n")
105
103
  f << "\n"
106
104
  end
107
- ""
105
+ nil
108
106
  end
109
107
 
110
108
  def handle_chef_types(ty)
@@ -137,19 +135,15 @@ module PoolParty
137
135
  end
138
136
  end
139
137
 
140
- def handle_print_service(klassname, klassarray, tabs)
141
- case klassname
142
- when nil
143
- nil
144
- else
145
- kname = klassname.to_s.gsub(/pool_party_/, '').gsub(/_class/, '')
138
+ def handle_print_service(plugin, tabs)
139
+ if plugin && plugin.has_key?(:resources) && !plugin[:resources].empty?
140
+ kname = plugin.delete(:name).to_s.gsub(/pool_party_/, '').gsub(/_class/, '')
146
141
  str = "\n#{tf(tabs)}# #{kname}\n"
147
142
  str << "#{tf(tabs)}"
148
- klassarray.each do |hsh|
149
- str << _compile(hsh,tabs+1, klassname)
150
- end
143
+ str << _compile(plugin,tabs+1, kname)
151
144
  str << "#{tf(tabs)}"
152
145
  end
146
+ str
153
147
  end
154
148
 
155
149
  # Check if the hash has content and that the content exists here. This is used
@@ -170,21 +164,6 @@ module PoolParty
170
164
  hsh
171
165
  end
172
166
 
173
- # Turn the services into strings using the handle_print_service method
174
- # Here we can strip out non-meaningful chef services
175
- def services_to_string(opts,tabs=0)
176
- if opts
177
- str = ""
178
- [:control_statements, :conditional].each do |k|
179
- opts.delete(k)
180
- end
181
- opts.map do |klassname, klasshash|
182
- str << handle_print_service(klassname, klasshash, tabs)
183
- end
184
- str
185
- end
186
- end
187
-
188
167
  # Handle ensures
189
168
  def handle_actions(key,value)
190
169
  case key
@@ -197,6 +176,8 @@ module PoolParty
197
176
 
198
177
  # Take the keys from the resource hash and turn them into chef-like
199
178
  # meaningful keys. This is how helpers are created for chef
179
+ #
180
+ # * <tt>reloads</tt> - todo
200
181
  def to_chef_key(key)
201
182
  case key
202
183
  when :ensures
@@ -224,6 +205,7 @@ module PoolParty
224
205
 
225
206
  # Resolve the value of the resource hash into a meaningful chef
226
207
  # value. Resources are turned into resource strings here
208
+ #
227
209
  def to_option_string(obj)
228
210
  case obj
229
211
  when PoolParty::Resources::Resource
@@ -6,15 +6,15 @@ module PoolParty
6
6
  # Take the cloud dependency tree
7
7
  module DependencyResolverCloudExtensions
8
8
  def to_properties_hash
9
- oh = OrderedHash.new
9
+ oh = {}
10
10
  oh[:options] = options.merge(:cloud_name => name)
11
11
  oh[:resources] = ordered_resources.map {|a| a.to_properties_hash }
12
12
  # oh[:resources] = resources.keys.inject(OrderedHash.new) do |sum,k|
13
13
  # sum.merge(k.to_sym => resources[k].map {|a| a.to_properties_hash } )
14
14
  # end
15
- oh[:services] = services.keys.inject(OrderedHash.new) do |sum,k|
16
- sum.merge(k.to_sym => services[k].map {|a| a.to_properties_hash } )
17
- end
15
+ # oh[:services] = services.keys.inject(OrderedHash.new) do |sum,k|
16
+ # sum.merge(k.to_sym => services[k].map {|a| a.to_properties_hash } )
17
+ # end
18
18
  oh
19
19
  end
20
20
 
@@ -22,11 +22,7 @@ module PoolParty
22
22
  end
23
23
 
24
24
  def compile(props=@properties_hash, tabs=0)
25
- [
26
- # options_to_string(props[:options],tabs),
27
- resources_to_string(props[:resources],tabs),
28
- services_to_string(props[:services],tabs)
29
- ].join("\n")
25
+ resources_to_string(props[:resources],tabs)
30
26
  end
31
27
 
32
28
  def options_to_string(opts,tabs=0)
@@ -62,6 +58,8 @@ module PoolParty
62
58
  case ty = resource.delete(:pp_type)
63
59
  when "variable"
64
60
  handle_print_variable(resource[:name], resource[:value], :variable)
61
+ when "plugin"
62
+ handle_print_service(resource.delete(:name), resource, tabs)
65
63
  else
66
64
  real_name = resource[:name]
67
65
  handle_print_resource(resource, ty.to_sym, tabs)
@@ -80,14 +78,6 @@ module PoolParty
80
78
  # end
81
79
  end
82
80
 
83
- def services_to_string(opts,tabs=0)
84
- if opts
85
- opts.map do |klassname, klasshash|
86
- handle_print_service(klassname, klasshash, tabs)
87
- end
88
- end
89
- end
90
-
91
81
  def hash_flush_out(hash, pre="", post="")
92
82
  setup_hash_for_output(hash).map do |k,v|
93
83
  hash.empty? ? nil : "#{pre}#{k} => #{v}#{post}"
@@ -135,28 +125,26 @@ module PoolParty
135
125
  end
136
126
  end
137
127
 
138
- def handle_print_service(klassname, klassarray, tabs)
128
+ def handle_print_service(klassname, plugin, tabs)
139
129
  case klassname.to_s
140
130
  when "conditional"
141
131
  # "#{tf(tabs)}case $#{klasshash[:options][:variable]} {#{klasshash[:services][:control_statements].map do |k,v|"\n#{tf(tabs+1)}#{k} : {#{compile(v.to_properties_hash, tabs+2)}#{tf(tabs+1)}\n#{tf(tabs)}}" end}}"
142
-
143
- str = ""
144
- klassarray.each do |klasshash|
145
- # str << "\n#{tf(tabs+1)}#{compile(hsh,tabs+1)}"
146
- str << "#{tf(tabs)}case $#{klasshash[:options][:variable]} {"
147
- str << "#{klasshash[:services][:control_statements].map do |k,v|"\n#{tf(tabs+1)}#{k} : {#{compile(v.to_properties_hash, tabs+2)}#{tf(tabs+1)}\n#{tf(tabs)}}" end}"
148
- end
149
- str << "#{tf(tabs)}}"
132
+ #
133
+ # str = ""
134
+ # plugin.each do |klasshash|
135
+ # # str << "\n#{tf(tabs+1)}#{compile(hsh,tabs+1)}"
136
+ # str << "#{tf(tabs)}case $#{klasshash[:options][:variable]} {"
137
+ # str << "#{klasshash[:services][:control_statements].map do |k,v|"\n#{tf(tabs+1)}#{k} : {#{compile(v.to_properties_hash, tabs+2)}#{tf(tabs+1)}\n#{tf(tabs)}}" end}"
138
+ # end
139
+ # str << "#{tf(tabs)}}"
140
+ # deprecated conditional
150
141
 
151
142
  else
152
143
  kname = klassname.to_s.gsub(/pool_party_/, '').gsub(/_class/, '')
153
144
  str = "\n#{tf(tabs)}# #{kname}\n"
154
145
  str << "#{tf(tabs)}class #{kname} {"
155
- klassarray.each do |hsh|
156
- str << "\n#{tf(tabs+1)}#{compile(hsh,tabs+1)}"
157
- end
158
- str << "#{tf(tabs)}} include #{kname}"
159
-
146
+ str << "\n#{tf(tabs+1)}#{compile(plugin,tabs+1)}"
147
+ str << "#{tf(tabs)}} include #{kname}"
160
148
  end
161
149
  end
162
150
 
@@ -8,8 +8,8 @@ end
8
8
  require "#{::File.dirname(__FILE__)}/poolparty/default"
9
9
  require "#{::File.dirname(__FILE__)}/modules/user_helpers"
10
10
  require "#{::File.dirname(__FILE__)}/schema"
11
- require "#{::File.dirname(__FILE__)}/net/init"
12
11
  require "#{::File.dirname(__FILE__)}/core/string"
12
+ require "#{::File.dirname(__FILE__)}/net/init"
13
13
  require "#{::File.dirname(__FILE__)}/core/hash"
14
14
  require "#{::File.dirname(__FILE__)}/poolparty/neighborhoods"
15
15
  require "#{::File.dirname(__FILE__)}/exceptions/RemoteException.rb"
@@ -0,0 +1,91 @@
1
+ module PoolParty
2
+ # Abstracts out the searchable path for a resource such as a
3
+ # template file, key, or clouds.rb
4
+ #
5
+ # NOTE: this is currently _only_ implemented on templates
6
+ # (PoolParty::Resources::File) and not yet working on clouds.rb or key files.
7
+ # These will eventually be refactored to use this class.
8
+ module SearchablePaths
9
+ def self.included(mod)
10
+ mod.extend(ClassMethods)
11
+ end
12
+
13
+ module ClassMethods
14
+ # Specify that a particular class has methods for searchable paths.
15
+ #
16
+ # Options:
17
+ # * <tt>:dirs</tt>: array of directories to look in *under* the search paths. (default: <tt>["/"]</tt>)
18
+ # * <tt>:dir</tt>: set the directory to look in *under* the search paths. Use either dir or dirs, not both. (default: +/+)
19
+ # * <tt>:paths</tt>: overwrite all default paths and set the paths to this array exactly
20
+ # * <tt>:append_paths</tt>: append these paths to any existing paths
21
+ # * <tt>:prepend_paths</tt>: prepend these paths to any existing paths
22
+ def has_searchable_paths(opts={})
23
+ class_eval do
24
+ extend PoolParty::SearchablePaths::SingletonMethods
25
+
26
+ @searchable_paths_dirs = [opts[:dir]] if opts[:dir]
27
+ @searchable_paths_dirs = opts[:dirs] if opts[:dirs]
28
+ @paths_override = opts[:paths] if opts[:paths]
29
+ @paths_prepend = opts[:prepend_paths] || []
30
+ @paths_append = opts[:append_paths] || []
31
+ end
32
+ include PoolParty::SearchablePaths::InstanceMethods
33
+ end
34
+ end
35
+
36
+ module SingletonMethods
37
+ def searchable_paths_dir; @searchable_paths_dirs.first; end
38
+ def searchable_paths_dirs
39
+ @searchable_paths_dirs && @searchable_paths_dirs.size > 0 ? @searchable_paths_dirs : ["/"]
40
+ end
41
+
42
+ # The default paths are primarily defined in PoolParty::Default. These are the default search paths in order:
43
+ #
44
+ # * current working directory (Dir.pwd)
45
+ # * ~/.poolparty
46
+ # * ~/.ec2
47
+ # * /etc/poolparty
48
+ # * /var/poolparty
49
+ def default_paths
50
+ [
51
+ Dir.pwd,
52
+ PoolParty::Default.poolparty_home_path,
53
+ PoolParty::Default.base_keypair_path,
54
+ PoolParty::Default.poolparty_src_path,
55
+ PoolParty::Default.poolparty_src_path/:lib/:poolparty,
56
+ PoolParty::Default.base_config_directory,
57
+ PoolParty::Default.remote_storage_path
58
+ ]
59
+ end
60
+
61
+ # returns the full set of valid searchable paths, given the options
62
+ def searchable_paths
63
+ return @paths_override if @paths_override && @paths_override.size > 0
64
+ @paths_prepend + default_paths + @paths_append
65
+ end
66
+ end
67
+
68
+ module InstanceMethods
69
+
70
+ # Searches for +filepath+ in the <tt>searchable_paths</tt> iff +filepath+
71
+ # doesn't exist. e.g. +filepath+ is interpreted *first* as an absolute
72
+ # path, if +filepath+ doesn't exist verbatim then it looks for the file
73
+ # in the searchable_paths.
74
+ #
75
+ # Returns +nil+ if the file cannot be found.
76
+ def search_in_known_locations(filepath)
77
+ return filepath if File.exists?(filepath) # return the file if its an absolute path
78
+ self.class.searchable_paths.each do |path|
79
+ self.class.searchable_paths_dirs.each do |dir|
80
+ full_path = File.expand_path(path / dir / filepath)
81
+ return full_path if File.exists?(full_path)
82
+ end
83
+ end
84
+ nil
85
+ end
86
+ alias_method :find_file, :search_in_known_locations
87
+
88
+ end
89
+
90
+ end
91
+ end
@@ -7,5 +7,4 @@ end
7
7
  Dir["#{::File.dirname(__FILE__)}/remoter_bases/*/*.rb"].each do |base|
8
8
  name = File.join(::File.basename(base, ::File.extname(base)))
9
9
  require base
10
- register_remote_base name
11
10
  end
@@ -17,5 +17,4 @@ end
17
17
  Dir["#{File.dirname(__FILE__)}/remote_bases/*.rb"].each do |base|
18
18
  name = ::File.basename(base, ::File.extname(base))
19
19
  require base
20
- register_remote_base name
21
20
  end
@@ -33,6 +33,11 @@ module PoolParty
33
33
  instance_eval &block if block
34
34
  @cloud = prnt
35
35
  end
36
+
37
+ def self.inherited(arg)
38
+ base_name = "#{arg}".downcase.top_level_class.to_sym
39
+ (remote_bases << base_name) unless remote_bases.include?(base_name)
40
+ end
36
41
 
37
42
 
38
43
  # def method_missing(meth, *args, &block)
@@ -105,7 +105,9 @@ module PoolParty
105
105
  )
106
106
  end
107
107
  def self.ec2(o)
108
- @ec2 ||= self.class.ec2(o)
108
+ @ec2 ||= EC2::Base.new( :access_key_id => o[:access_key],
109
+ :secret_access_key => o[:secret_access_key]
110
+ )
109
111
  end
110
112
 
111
113
  # Get the ec2 description for the response in a hash format