auser-poolparty 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
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