engineyard-metadata 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/README.rdoc +134 -0
- data/Rakefile +13 -48
- data/engineyard-metadata.gemspec +22 -76
- data/lib/engineyard-metadata.rb +12 -2
- data/lib/engineyard-metadata/insider.rb +20 -20
- data/lib/engineyard-metadata/metadata.rb +11 -26
- data/lib/engineyard-metadata/outsider.rb +17 -17
- data/lib/engineyard-metadata/ssh_alias_helper.rb +1 -1
- data/lib/engineyard-metadata/version.rb +5 -0
- data/spec/metadata_spec.rb +39 -45
- data/spec/spec_helper.rb +5 -2
- metadata +20 -16
- data/VERSION +0 -1
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/README.rdoc
CHANGED
@@ -98,6 +98,140 @@ You can put the output of <tt>ey_ssh_aliases</tt> into <tt>~/.ssh/config</tt>:
|
|
98
98
|
|
99
99
|
This is the second generation of http://rubygems.org/gems/ey_cloud_awareness.
|
100
100
|
|
101
|
+
== Sample test output
|
102
|
+
|
103
|
+
engineyard-metadata (master) $ rake
|
104
|
+
|
105
|
+
EY.metadata
|
106
|
+
being executed on an EngineYard AppCloud (i.e. Amazon EC2) instance
|
107
|
+
it should behave like it does in all execution environments
|
108
|
+
by getting the database username
|
109
|
+
by getting the database name
|
110
|
+
by getting the database host
|
111
|
+
by getting the ssh username
|
112
|
+
by getting the app server hostnames
|
113
|
+
by getting the db server hostnames
|
114
|
+
by getting the utilities hostnames
|
115
|
+
by getting the app master hostname
|
116
|
+
by getting the db master hostname
|
117
|
+
by getting the db slave hostnames
|
118
|
+
by getting the app slave hostnames
|
119
|
+
by getting the solo hostname
|
120
|
+
by getting the environment name
|
121
|
+
by getting the stack name
|
122
|
+
by getting the repository URI
|
123
|
+
by getting the app name
|
124
|
+
by getting the current path
|
125
|
+
by getting the shared path
|
126
|
+
by getting helpful ssh aliases
|
127
|
+
it should behave like it's executing inside the cloud
|
128
|
+
by refusing to get the list of all environment names
|
129
|
+
by getting the present instance ID
|
130
|
+
by getting the present instance role (as a string)
|
131
|
+
by getting the present public hostname
|
132
|
+
by getting the present security group
|
133
|
+
by getting the database password
|
134
|
+
by getting the ssh password
|
135
|
+
by getting the mysql command
|
136
|
+
by getting the mysqldump command
|
137
|
+
being executed from a developer/administrator's local machine
|
138
|
+
controlled with environment variables
|
139
|
+
it should behave like it does in all execution environments
|
140
|
+
by getting the database username
|
141
|
+
by getting the database name
|
142
|
+
by getting the database host
|
143
|
+
by getting the ssh username
|
144
|
+
by getting the app server hostnames
|
145
|
+
by getting the db server hostnames
|
146
|
+
by getting the utilities hostnames
|
147
|
+
by getting the app master hostname
|
148
|
+
by getting the db master hostname
|
149
|
+
by getting the db slave hostnames
|
150
|
+
by getting the app slave hostnames
|
151
|
+
by getting the solo hostname
|
152
|
+
by getting the environment name
|
153
|
+
by getting the stack name
|
154
|
+
by getting the repository URI
|
155
|
+
by getting the app name
|
156
|
+
by getting the current path
|
157
|
+
by getting the shared path
|
158
|
+
by getting helpful ssh aliases
|
159
|
+
it should behave like it's executing outside the cloud
|
160
|
+
by getting the list of all environment names
|
161
|
+
by refusing to get the present instance ID
|
162
|
+
by refusing to get the present instance role (as a string)
|
163
|
+
by refusing to get the present public hostname
|
164
|
+
by refusing to get the present security group
|
165
|
+
by refusing to get the database password
|
166
|
+
by refusing to get the ssh password
|
167
|
+
by refusing to get the mysql command
|
168
|
+
by refusing to get the mysqldump command
|
169
|
+
controlled with attr writers
|
170
|
+
it should behave like it does in all execution environments
|
171
|
+
by getting the database username
|
172
|
+
by getting the database name
|
173
|
+
by getting the database host
|
174
|
+
by getting the ssh username
|
175
|
+
by getting the app server hostnames
|
176
|
+
by getting the db server hostnames
|
177
|
+
by getting the utilities hostnames
|
178
|
+
by getting the app master hostname
|
179
|
+
by getting the db master hostname
|
180
|
+
by getting the db slave hostnames
|
181
|
+
by getting the app slave hostnames
|
182
|
+
by getting the solo hostname
|
183
|
+
by getting the environment name
|
184
|
+
by getting the stack name
|
185
|
+
by getting the repository URI
|
186
|
+
by getting the app name
|
187
|
+
by getting the current path
|
188
|
+
by getting the shared path
|
189
|
+
by getting helpful ssh aliases
|
190
|
+
it should behave like it's executing outside the cloud
|
191
|
+
by getting the list of all environment names
|
192
|
+
by refusing to get the present instance ID
|
193
|
+
by refusing to get the present instance role (as a string)
|
194
|
+
by refusing to get the present public hostname
|
195
|
+
by refusing to get the present security group
|
196
|
+
by refusing to get the database password
|
197
|
+
by refusing to get the ssh password
|
198
|
+
by refusing to get the mysql command
|
199
|
+
by refusing to get the mysqldump command
|
200
|
+
depending on .eyrc
|
201
|
+
it should behave like it does in all execution environments
|
202
|
+
by getting the database username
|
203
|
+
by getting the database name
|
204
|
+
by getting the database host
|
205
|
+
by getting the ssh username
|
206
|
+
by getting the app server hostnames
|
207
|
+
by getting the db server hostnames
|
208
|
+
by getting the utilities hostnames
|
209
|
+
by getting the app master hostname
|
210
|
+
by getting the db master hostname
|
211
|
+
by getting the db slave hostnames
|
212
|
+
by getting the app slave hostnames
|
213
|
+
by getting the solo hostname
|
214
|
+
by getting the environment name
|
215
|
+
by getting the stack name
|
216
|
+
by getting the repository URI
|
217
|
+
by getting the app name
|
218
|
+
by getting the current path
|
219
|
+
by getting the shared path
|
220
|
+
by getting helpful ssh aliases
|
221
|
+
it should behave like it's executing outside the cloud
|
222
|
+
by getting the list of all environment names
|
223
|
+
by refusing to get the present instance ID
|
224
|
+
by refusing to get the present instance role (as a string)
|
225
|
+
by refusing to get the present public hostname
|
226
|
+
by refusing to get the present security group
|
227
|
+
by refusing to get the database password
|
228
|
+
by refusing to get the ssh password
|
229
|
+
by refusing to get the mysql command
|
230
|
+
by refusing to get the mysqldump command
|
231
|
+
|
232
|
+
Finished in 0.95816 seconds
|
233
|
+
112 examples, 0 failures
|
234
|
+
|
101
235
|
== Copyright
|
102
236
|
|
103
237
|
Copyright (c) 2010 Seamus Abshere. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,52 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "engineyard-metadata"
|
8
|
-
gem.summary = %Q{Make your EngineYard AppCloud (Amazon EC2) instances aware of each other.}
|
9
|
-
gem.description = %Q{Pulls metadata from EC2 and EngineYard so that your EngineYard AppCloud (Amazon EC2) instances know about each other.}
|
10
|
-
gem.email = "seamus@abshere.net"
|
11
|
-
gem.homepage = "http://github.com/seamusabshere/engineyard-metadata"
|
12
|
-
gem.authors = ["Seamus Abshere"]
|
13
|
-
gem.add_dependency 'activesupport', '>=2.3.4'
|
14
|
-
gem.add_dependency 'nap', '>=0.4'
|
15
|
-
gem.add_dependency 'eat', '>=0.0.5'
|
16
|
-
gem.add_development_dependency "fakeweb"
|
17
|
-
gem.add_development_dependency "fakefs"
|
18
|
-
gem.add_development_dependency "rspec", "~>2"
|
19
|
-
gem.executables = ['ey_ssh_aliases']
|
20
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
21
|
-
end
|
22
|
-
Jeweler::GemcutterTasks.new
|
23
|
-
rescue LoadError
|
24
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
25
|
-
end
|
26
|
-
|
27
|
-
require 'rake/testtask'
|
28
|
-
Rake::TestTask.new(:test) do |test|
|
29
|
-
test.libs << 'lib' << 'test'
|
30
|
-
test.pattern = 'test/**/test_*.rb'
|
31
|
-
test.verbose = true
|
32
|
-
end
|
33
|
-
|
34
|
-
begin
|
35
|
-
require 'rcov/rcovtask'
|
36
|
-
Rcov::RcovTask.new do |test|
|
37
|
-
test.libs << 'test'
|
38
|
-
test.pattern = 'test/**/test_*.rb'
|
39
|
-
test.verbose = true
|
40
|
-
end
|
41
|
-
rescue LoadError
|
42
|
-
task :rcov do
|
43
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
44
|
-
end
|
45
|
-
end
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
46
3
|
|
47
|
-
|
48
|
-
|
49
|
-
task :default => :test
|
4
|
+
require 'rake'
|
50
5
|
|
51
6
|
require 'rake/rdoctask'
|
52
7
|
Rake::RDocTask.new do |rdoc|
|
@@ -57,3 +12,13 @@ Rake::RDocTask.new do |rdoc|
|
|
57
12
|
rdoc.rdoc_files.include('README*')
|
58
13
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
59
14
|
end
|
15
|
+
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
|
18
|
+
# thanks bundler
|
19
|
+
RSpec::Core::RakeTask.new do |t|
|
20
|
+
t.rspec_opts = %w(-fs --color)
|
21
|
+
# t.ruby_opts = %w(-w)
|
22
|
+
end
|
23
|
+
|
24
|
+
task :default => :spec
|
data/engineyard-metadata.gemspec
CHANGED
@@ -1,82 +1,28 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "engineyard-metadata/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
6
|
+
s.name = "engineyard-metadata"
|
7
|
+
s.version = EY::Metadata::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Seamus Abshere"]
|
10
|
+
s.email = ["seamus@abshere.net"]
|
11
|
+
s.homepage = "https://github.com/seamusabshere/engineyard-metadata"
|
12
|
+
s.summary = %Q{Make your EngineYard AppCloud (Amazon EC2) instances aware of each other.}
|
13
|
+
s.description = %Q{Pulls metadata from EC2 and EngineYard so that your EngineYard AppCloud (Amazon EC2) instances know about each other.}
|
9
14
|
|
10
|
-
s.
|
11
|
-
s.authors = ["Seamus Abshere"]
|
12
|
-
s.date = %q{2011-02-01}
|
13
|
-
s.default_executable = %q{ey_ssh_aliases}
|
14
|
-
s.description = %q{Pulls metadata from EC2 and EngineYard so that your EngineYard AppCloud (Amazon EC2) instances know about each other.}
|
15
|
-
s.email = %q{seamus@abshere.net}
|
16
|
-
s.executables = ["ey_ssh_aliases"]
|
17
|
-
s.extra_rdoc_files = [
|
18
|
-
"LICENSE",
|
19
|
-
"README.rdoc"
|
20
|
-
]
|
21
|
-
s.files = [
|
22
|
-
".document",
|
23
|
-
".gitignore",
|
24
|
-
"LICENSE",
|
25
|
-
"README.rdoc",
|
26
|
-
"Rakefile",
|
27
|
-
"VERSION",
|
28
|
-
"bin/ey_ssh_aliases",
|
29
|
-
"engineyard-metadata.gemspec",
|
30
|
-
"lib/engineyard-metadata.rb",
|
31
|
-
"lib/engineyard-metadata/amazon_ec2_api.rb",
|
32
|
-
"lib/engineyard-metadata/chef_dna.rb",
|
33
|
-
"lib/engineyard-metadata/engine_yard_cloud_api.rb",
|
34
|
-
"lib/engineyard-metadata/insider.rb",
|
35
|
-
"lib/engineyard-metadata/metadata.rb",
|
36
|
-
"lib/engineyard-metadata/outsider.rb",
|
37
|
-
"lib/engineyard-metadata/ssh_alias_helper.rb",
|
38
|
-
"spec/metadata_spec.rb",
|
39
|
-
"spec/spec_helper.rb",
|
40
|
-
"spec/support/dna.json",
|
41
|
-
"spec/support/dot.git.config",
|
42
|
-
"spec/support/engine_yard_cloud_api_response.json"
|
43
|
-
]
|
44
|
-
s.homepage = %q{http://github.com/seamusabshere/engineyard-metadata}
|
45
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
46
|
-
s.require_paths = ["lib"]
|
47
|
-
s.rubygems_version = %q{1.3.7}
|
48
|
-
s.summary = %q{Make your EngineYard AppCloud (Amazon EC2) instances aware of each other.}
|
49
|
-
s.test_files = [
|
50
|
-
"spec/metadata_spec.rb",
|
51
|
-
"spec/spec_helper.rb"
|
52
|
-
]
|
53
|
-
|
54
|
-
if s.respond_to? :specification_version then
|
55
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
56
|
-
s.specification_version = 3
|
15
|
+
s.rubyforge_project = "engineyard-metadata"
|
57
16
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
s.add_dependency(%q<fakeweb>, [">= 0"])
|
70
|
-
s.add_dependency(%q<fakefs>, [">= 0"])
|
71
|
-
s.add_dependency(%q<rspec>, ["~> 2"])
|
72
|
-
end
|
73
|
-
else
|
74
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.4"])
|
75
|
-
s.add_dependency(%q<nap>, [">= 0.4"])
|
76
|
-
s.add_dependency(%q<eat>, [">= 0.0.5"])
|
77
|
-
s.add_dependency(%q<fakeweb>, [">= 0"])
|
78
|
-
s.add_dependency(%q<fakefs>, [">= 0"])
|
79
|
-
s.add_dependency(%q<rspec>, ["~> 2"])
|
80
|
-
end
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,fengineyard-metadataures}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency 'activesupport', '>=2.3.4'
|
23
|
+
s.add_dependency 'nap', '>=0.4'
|
24
|
+
s.add_dependency 'eat', '>=0.0.5'
|
25
|
+
s.add_development_dependency "fakeweb"
|
26
|
+
s.add_development_dependency "fakefs"
|
27
|
+
s.add_development_dependency "rspec", "~>2"
|
81
28
|
end
|
82
|
-
|
data/lib/engineyard-metadata.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
+
require 'engineyard-metadata/version'
|
2
|
+
require 'engineyard-metadata/metadata'
|
3
|
+
|
1
4
|
module EY
|
2
|
-
autoload :Metadata, 'engineyard-metadata/metadata'
|
3
5
|
def self.metadata
|
4
|
-
|
6
|
+
@metadata ||= if ::File.directory?('/var/log/engineyard')
|
7
|
+
Metadata::Insider.new
|
8
|
+
else
|
9
|
+
Metadata::Outsider.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.reload_metadata
|
14
|
+
@metadata = nil
|
5
15
|
end
|
6
16
|
end
|
@@ -1,26 +1,7 @@
|
|
1
1
|
module EY
|
2
2
|
class Metadata
|
3
3
|
# This gets pulled in when you're running directly on a cloud instance.
|
4
|
-
|
5
|
-
DELEGATED_TO_AMAZON_EC2_API = %w{
|
6
|
-
present_instance_id
|
7
|
-
present_security_group
|
8
|
-
}
|
9
|
-
|
10
|
-
DELEGATED_TO_CHEF_DNA = METHODS - DELEGATED_TO_AMAZON_EC2_API
|
11
|
-
|
12
|
-
DELEGATED_TO_AMAZON_EC2_API.each do |name|
|
13
|
-
define_method name do
|
14
|
-
amazon_ec2_api.send name
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
DELEGATED_TO_CHEF_DNA.each do |name|
|
19
|
-
define_method name do
|
20
|
-
chef_dna.send name
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
4
|
+
class Insider < Metadata
|
24
5
|
# You can't get the list of environment names while you're on the instances themselves.
|
25
6
|
def environment_names
|
26
7
|
raise CannotGetFromHere
|
@@ -46,6 +27,25 @@ module EY
|
|
46
27
|
raise RuntimeError, "[engineyard-metadata gem] Please set EY.metadata.app_name= or set ENV['EY_APP_NAME']" unless @app_name.to_s.strip.length > 0
|
47
28
|
@app_name
|
48
29
|
end
|
30
|
+
|
31
|
+
DELEGATED_TO_AMAZON_EC2_API = %w{
|
32
|
+
present_instance_id
|
33
|
+
present_security_group
|
34
|
+
}
|
35
|
+
|
36
|
+
DELEGATED_TO_CHEF_DNA = METHODS - instance_methods.map { |m| m.to_s } - DELEGATED_TO_AMAZON_EC2_API
|
37
|
+
|
38
|
+
DELEGATED_TO_AMAZON_EC2_API.each do |name|
|
39
|
+
define_method name do
|
40
|
+
amazon_ec2_api.send name
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
DELEGATED_TO_CHEF_DNA.each do |name|
|
45
|
+
define_method name do
|
46
|
+
chef_dna.send name
|
47
|
+
end
|
48
|
+
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
1
|
module EY
|
4
2
|
# All methods are defined on this module. For example, you're supposed to say
|
5
3
|
#
|
@@ -7,8 +5,17 @@ module EY
|
|
7
5
|
#
|
8
6
|
# instead of trying to call it from a particular adapter.
|
9
7
|
class Metadata
|
10
|
-
|
11
|
-
|
8
|
+
autoload :Insider, 'engineyard-metadata/insider'
|
9
|
+
autoload :Outsider, 'engineyard-metadata/outsider'
|
10
|
+
autoload :SshAliasHelper, 'engineyard-metadata/ssh_alias_helper'
|
11
|
+
autoload :ChefDna, 'engineyard-metadata/chef_dna'
|
12
|
+
autoload :AmazonEc2Api, 'engineyard-metadata/amazon_ec2_api'
|
13
|
+
autoload :EngineYardCloudApi, 'engineyard-metadata/engine_yard_cloud_api'
|
14
|
+
|
15
|
+
# This gets raised when you can't get a particular piece of metadata from the execution environment you're in.
|
16
|
+
class CannotGetFromHere < RuntimeError
|
17
|
+
end
|
18
|
+
|
12
19
|
attr_writer :app_name
|
13
20
|
|
14
21
|
METHODS = %w{
|
@@ -51,27 +58,5 @@ module EY
|
|
51
58
|
def shared_path
|
52
59
|
"/data/#{app_name}/shared"
|
53
60
|
end
|
54
|
-
|
55
|
-
# This gets raised when you can't get a particular piece of metadata from the execution environment you're in.
|
56
|
-
class CannotGetFromHere < RuntimeError
|
57
|
-
end
|
58
|
-
|
59
|
-
autoload :SshAliasHelper, 'engineyard-metadata/ssh_alias_helper'
|
60
|
-
|
61
|
-
autoload :Insider, 'engineyard-metadata/insider'
|
62
|
-
autoload :Outsider, 'engineyard-metadata/outsider'
|
63
|
-
autoload :ChefDna, 'engineyard-metadata/chef_dna'
|
64
|
-
autoload :AmazonEc2Api, 'engineyard-metadata/amazon_ec2_api'
|
65
|
-
autoload :EngineYardCloudApi, 'engineyard-metadata/engine_yard_cloud_api'
|
66
|
-
|
67
|
-
def reload
|
68
|
-
if File.directory? '/var/log/engineyard'
|
69
|
-
Metadata.send :include, Insider
|
70
|
-
else
|
71
|
-
Metadata.send :include, Outsider
|
72
|
-
end
|
73
|
-
end
|
74
61
|
end
|
75
62
|
end
|
76
|
-
|
77
|
-
EY.metadata.reload
|
@@ -4,23 +4,7 @@ require 'yaml'
|
|
4
4
|
module EY
|
5
5
|
class Metadata
|
6
6
|
# This gets pulled in when you're running from your developer machine (i.e., not on a cloud instance).
|
7
|
-
|
8
|
-
UNGETTABLE = METHODS.grep(/present/) + METHODS.grep(/password/) + METHODS.grep(/mysql/)
|
9
|
-
|
10
|
-
GETTABLE = METHODS - UNGETTABLE - %w{ environment_name }
|
11
|
-
|
12
|
-
UNGETTABLE.each do |name|
|
13
|
-
define_method name do
|
14
|
-
raise CannotGetFromHere
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
GETTABLE.each do |name|
|
19
|
-
define_method name do
|
20
|
-
engine_yard_cloud_api.send name
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
7
|
+
class Outsider < Metadata
|
24
8
|
def eyrc_path
|
25
9
|
File.join File.expand_path("~#{Etc.getpwuid.name}"), '.eyrc'
|
26
10
|
end
|
@@ -84,6 +68,22 @@ module EY
|
|
84
68
|
def engine_yard_cloud_api
|
85
69
|
@engine_yard_cloud_api ||= EngineYardCloudApi.new ey_cloud_token
|
86
70
|
end
|
71
|
+
|
72
|
+
UNGETTABLE = METHODS.grep(/present/) + METHODS.grep(/password/) + METHODS.grep(/mysql/)
|
73
|
+
|
74
|
+
GETTABLE = METHODS - instance_methods.map { |m| m.to_s } - UNGETTABLE
|
75
|
+
|
76
|
+
UNGETTABLE.each do |name|
|
77
|
+
define_method name do
|
78
|
+
raise CannotGetFromHere
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
GETTABLE.each do |name|
|
83
|
+
define_method name do
|
84
|
+
engine_yard_cloud_api.send name
|
85
|
+
end
|
86
|
+
end
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
@@ -11,7 +11,7 @@ module EY
|
|
11
11
|
def ssh_aliases
|
12
12
|
counter = Hash.new 0
|
13
13
|
%w{ app_master db_master db_slaves app_slaves utilities }.map do |role_group|
|
14
|
-
send(role_group).map do |public_hostname|
|
14
|
+
[send(role_group)].flatten.map do |public_hostname|
|
15
15
|
ssh_alias counter, role_group, public_hostname
|
16
16
|
end
|
17
17
|
end.flatten.join("\n")
|
data/spec/metadata_spec.rb
CHANGED
@@ -1,131 +1,131 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
shared_examples_for "it does in all execution environments" do
|
4
|
-
it '
|
4
|
+
it 'by getting the database username' do
|
5
5
|
EY.metadata.database_username.should == 'deploy'
|
6
6
|
end
|
7
7
|
|
8
|
-
it '
|
8
|
+
it 'by getting the database name' do
|
9
9
|
EY.metadata.database_name.should == 'cm1_certified_blue'
|
10
10
|
end
|
11
11
|
|
12
|
-
it '
|
12
|
+
it 'by getting the database host' do
|
13
13
|
EY.metadata.database_host.should == 'ec2-67-202-19-255.compute-1.amazonaws.com'
|
14
14
|
end
|
15
15
|
|
16
|
-
it '
|
16
|
+
it 'by getting the ssh username' do
|
17
17
|
EY.metadata.ssh_username.should == 'deploy'
|
18
18
|
end
|
19
19
|
|
20
|
-
it '
|
20
|
+
it 'by getting the app server hostnames' do
|
21
21
|
EY.metadata.app_servers.should == ["ec2-174-129-212-130.compute-1.amazonaws.com"]
|
22
22
|
end
|
23
23
|
|
24
|
-
it '
|
24
|
+
it 'by getting the db server hostnames' do
|
25
25
|
EY.metadata.db_servers.should == ["ec2-67-202-19-255.compute-1.amazonaws.com"]
|
26
26
|
end
|
27
27
|
|
28
|
-
it '
|
28
|
+
it 'by getting the utilities hostnames' do
|
29
29
|
EY.metadata.utilities.should == []
|
30
30
|
end
|
31
31
|
|
32
|
-
it '
|
32
|
+
it 'by getting the app master hostname' do
|
33
33
|
EY.metadata.app_master.should == 'ec2-174-129-212-130.compute-1.amazonaws.com'
|
34
34
|
end
|
35
35
|
|
36
|
-
it '
|
36
|
+
it 'by getting the db master hostname' do
|
37
37
|
EY.metadata.db_master.should == 'ec2-67-202-19-255.compute-1.amazonaws.com'
|
38
38
|
end
|
39
39
|
|
40
|
-
it '
|
40
|
+
it 'by getting the db slave hostnames' do
|
41
41
|
EY.metadata.db_slaves.should == []
|
42
42
|
end
|
43
43
|
|
44
|
-
it '
|
44
|
+
it 'by getting the app slave hostnames' do
|
45
45
|
EY.metadata.app_slaves.should == []
|
46
46
|
end
|
47
47
|
|
48
|
-
it '
|
48
|
+
it 'by getting the solo hostname' do
|
49
49
|
EY.metadata.solo.should == nil
|
50
50
|
end
|
51
51
|
|
52
|
-
it '
|
52
|
+
it 'by getting the environment name' do
|
53
53
|
EY.metadata.environment_name.should == 'cm1_production_blue'
|
54
54
|
end
|
55
55
|
|
56
|
-
it '
|
56
|
+
it 'by getting the stack name' do
|
57
57
|
EY.metadata.stack_name.should == 'nginx_unicorn'
|
58
58
|
end
|
59
59
|
|
60
|
-
it '
|
60
|
+
it 'by getting the repository URI' do
|
61
61
|
EY.metadata.repository_uri.should == 'git@github.com:brighterplanet/cm1.git'
|
62
62
|
end
|
63
63
|
|
64
|
-
it '
|
64
|
+
it 'by getting the app name' do
|
65
65
|
EY.metadata.app_name.should == 'cm1_certified_blue'
|
66
66
|
end
|
67
67
|
|
68
|
-
it '
|
68
|
+
it 'by getting the current path' do
|
69
69
|
EY.metadata.current_path.should == '/data/cm1_certified_blue/current'
|
70
70
|
end
|
71
71
|
|
72
|
-
it '
|
72
|
+
it 'by getting the shared path' do
|
73
73
|
EY.metadata.shared_path.should == '/data/cm1_certified_blue/shared'
|
74
74
|
end
|
75
75
|
|
76
|
-
it '
|
76
|
+
it 'by getting helpful ssh aliases' do
|
77
77
|
EY.metadata.ssh_aliases.should =~ /Host cm1_production_blue-app_master\n Hostname ec2-174-129-212-130.compute-1.amazonaws.com/
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
81
|
shared_examples_for "it's executing outside the cloud" do
|
82
|
-
it '
|
82
|
+
it 'by getting the list of all environment names' do
|
83
83
|
EY.metadata.environment_names.should == ["app1_production", "wlpf1_production", "data1_production", "cm1_production_red", "cm1_production_blue"]
|
84
84
|
end
|
85
85
|
|
86
|
-
it '
|
86
|
+
it 'by refusing to get the present instance ID' do
|
87
87
|
lambda {
|
88
88
|
EY.metadata.present_instance_id
|
89
89
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
90
90
|
end
|
91
91
|
|
92
|
-
it '
|
92
|
+
it 'by refusing to get the present instance role (as a string)' do
|
93
93
|
lambda {
|
94
94
|
EY.metadata.present_instance_role
|
95
95
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
96
96
|
end
|
97
97
|
|
98
|
-
it '
|
98
|
+
it 'by refusing to get the present public hostname' do
|
99
99
|
lambda {
|
100
100
|
EY.metadata.present_public_hostname
|
101
101
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
102
102
|
end
|
103
103
|
|
104
|
-
it '
|
104
|
+
it 'by refusing to get the present security group' do
|
105
105
|
lambda {
|
106
106
|
EY.metadata.present_security_group
|
107
107
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
108
108
|
end
|
109
109
|
|
110
|
-
it '
|
110
|
+
it 'by refusing to get the database password' do
|
111
111
|
lambda {
|
112
112
|
EY.metadata.database_password
|
113
113
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
114
114
|
end
|
115
115
|
|
116
|
-
it '
|
116
|
+
it 'by refusing to get the ssh password' do
|
117
117
|
lambda {
|
118
118
|
EY.metadata.ssh_password
|
119
119
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
120
120
|
end
|
121
121
|
|
122
|
-
it '
|
122
|
+
it 'by refusing to get the mysql command' do
|
123
123
|
lambda {
|
124
124
|
EY.metadata.mysql_command
|
125
125
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
126
126
|
end
|
127
127
|
|
128
|
-
it '
|
128
|
+
it 'by refusing to get the mysqldump command' do
|
129
129
|
lambda {
|
130
130
|
EY.metadata.mysqldump_command
|
131
131
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
@@ -133,41 +133,41 @@ shared_examples_for "it's executing outside the cloud" do
|
|
133
133
|
end
|
134
134
|
|
135
135
|
shared_examples_for "it's executing inside the cloud" do
|
136
|
-
it '
|
136
|
+
it 'by refusing to get the list of all environment names' do
|
137
137
|
lambda {
|
138
138
|
EY.metadata.environment_names
|
139
139
|
}.should raise_error(EY::Metadata::CannotGetFromHere)
|
140
140
|
end
|
141
141
|
|
142
|
-
it '
|
142
|
+
it 'by getting the present instance ID' do
|
143
143
|
EY.metadata.present_instance_id.should == FAKE_INSTANCE_ID
|
144
144
|
end
|
145
145
|
|
146
|
-
it '
|
146
|
+
it 'by getting the present instance role (as a string)' do
|
147
147
|
EY.metadata.present_instance_role.should == 'app_master'
|
148
148
|
end
|
149
149
|
|
150
|
-
it '
|
150
|
+
it 'by getting the present public hostname' do
|
151
151
|
EY.metadata.present_public_hostname.should == 'ec2-174-129-212-130.compute-1.amazonaws.com'
|
152
152
|
end
|
153
153
|
|
154
|
-
it '
|
154
|
+
it 'by getting the present security group' do
|
155
155
|
EY.metadata.present_security_group.should == FAKE_SECURITY_GROUP
|
156
156
|
end
|
157
157
|
|
158
|
-
it '
|
158
|
+
it 'by getting the database password' do
|
159
159
|
EY.metadata.database_password.should == 'USERS-0-PASSWORD'
|
160
160
|
end
|
161
161
|
|
162
|
-
it '
|
162
|
+
it 'by getting the ssh password' do
|
163
163
|
EY.metadata.ssh_password.should == 'USERS-0-PASSWORD'
|
164
164
|
end
|
165
165
|
|
166
|
-
it '
|
166
|
+
it 'by getting the mysql command' do
|
167
167
|
EY.metadata.mysql_command.should =~ %r{mysql -h ec2-67-202-19-255.compute-1.amazonaws.com -u deploy -pUSERS-0-PASSWORD cm1_certified_blue}
|
168
168
|
end
|
169
169
|
|
170
|
-
it '
|
170
|
+
it 'by getting the mysqldump command' do
|
171
171
|
EY.metadata.mysqldump_command.should =~ %r{mysqldump -h ec2-67-202-19-255.compute-1.amazonaws.com -u deploy -pUSERS-0-PASSWORD cm1_certified_blue}
|
172
172
|
end
|
173
173
|
end
|
@@ -180,7 +180,7 @@ describe 'EY.metadata' do
|
|
180
180
|
describe "being executed on an EngineYard AppCloud (i.e. Amazon EC2) instance" do
|
181
181
|
before do
|
182
182
|
pretend_we_are_on_an_engineyard_appcloud_ec2_instance
|
183
|
-
EY.
|
183
|
+
EY.reload_metadata
|
184
184
|
EY.metadata.app_name = 'cm1_certified_blue'
|
185
185
|
end
|
186
186
|
it_should_behave_like "it does in all execution environments"
|
@@ -190,10 +190,7 @@ describe 'EY.metadata' do
|
|
190
190
|
describe "being executed from a developer/administrator's local machine" do
|
191
191
|
before do
|
192
192
|
pretend_we_are_on_a_developer_machine
|
193
|
-
EY.
|
194
|
-
EY.metadata.instance_variables.each do |ivar_name|
|
195
|
-
EY.metadata.instance_variable_set ivar_name, nil
|
196
|
-
end
|
193
|
+
EY.reload_metadata
|
197
194
|
ENV.delete 'EY_CLOUD_TOKEN'
|
198
195
|
ENV.delete 'EY_ENVIRONMENT_NAME'
|
199
196
|
ENV.delete 'EY_APP_NAME'
|
@@ -201,9 +198,6 @@ describe 'EY.metadata' do
|
|
201
198
|
end
|
202
199
|
describe "controlled with environment variables" do
|
203
200
|
before do
|
204
|
-
EY.metadata.instance_variables.each do |ivar_name|
|
205
|
-
EY.metadata.instance_variable_set ivar_name, nil
|
206
|
-
end
|
207
201
|
ENV['EY_CLOUD_TOKEN'] = FAKE_CLOUD_TOKEN + 'aaa'
|
208
202
|
ENV['EY_APP_NAME'] = 'cm1_certified_blue'
|
209
203
|
EY.metadata.ey_cloud_token.should == FAKE_CLOUD_TOKEN + 'aaa' # sanity check
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
2
4
|
require 'rspec'
|
3
5
|
require 'active_support/json/encoding'
|
4
6
|
require 'fakeweb'
|
5
7
|
require 'fakefs/safe'
|
6
8
|
require 'eat' # otherwise it's loaded when fakefs is already active
|
9
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
10
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
11
|
+
require 'engineyard-metadata'
|
7
12
|
|
8
13
|
FAKE_SECURITY_GROUP = 'ey-cm1_production_blue-1294775925-1371-55979'
|
9
14
|
FAKE_INSTANCE_ID = 'i-ff17d493'
|
@@ -55,5 +60,3 @@ def stop_pretending
|
|
55
60
|
FakeFS.deactivate!
|
56
61
|
FakeWeb.clean_registry
|
57
62
|
end
|
58
|
-
|
59
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'engineyard-metadata'))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-metadata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 17
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Seamus Abshere
|
@@ -15,8 +15,8 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-03-31 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: activesupport
|
@@ -108,21 +108,21 @@ dependencies:
|
|
108
108
|
type: :development
|
109
109
|
version_requirements: *id006
|
110
110
|
description: Pulls metadata from EC2 and EngineYard so that your EngineYard AppCloud (Amazon EC2) instances know about each other.
|
111
|
-
email:
|
111
|
+
email:
|
112
|
+
- seamus@abshere.net
|
112
113
|
executables:
|
113
114
|
- ey_ssh_aliases
|
114
115
|
extensions: []
|
115
116
|
|
116
|
-
extra_rdoc_files:
|
117
|
-
|
118
|
-
- README.rdoc
|
117
|
+
extra_rdoc_files: []
|
118
|
+
|
119
119
|
files:
|
120
120
|
- .document
|
121
121
|
- .gitignore
|
122
|
+
- Gemfile
|
122
123
|
- LICENSE
|
123
124
|
- README.rdoc
|
124
125
|
- Rakefile
|
125
|
-
- VERSION
|
126
126
|
- bin/ey_ssh_aliases
|
127
127
|
- engineyard-metadata.gemspec
|
128
128
|
- lib/engineyard-metadata.rb
|
@@ -133,18 +133,19 @@ files:
|
|
133
133
|
- lib/engineyard-metadata/metadata.rb
|
134
134
|
- lib/engineyard-metadata/outsider.rb
|
135
135
|
- lib/engineyard-metadata/ssh_alias_helper.rb
|
136
|
+
- lib/engineyard-metadata/version.rb
|
136
137
|
- spec/metadata_spec.rb
|
137
138
|
- spec/spec_helper.rb
|
138
139
|
- spec/support/dna.json
|
139
140
|
- spec/support/dot.git.config
|
140
141
|
- spec/support/engine_yard_cloud_api_response.json
|
141
142
|
has_rdoc: true
|
142
|
-
homepage:
|
143
|
+
homepage: https://github.com/seamusabshere/engineyard-metadata
|
143
144
|
licenses: []
|
144
145
|
|
145
146
|
post_install_message:
|
146
|
-
rdoc_options:
|
147
|
-
|
147
|
+
rdoc_options: []
|
148
|
+
|
148
149
|
require_paths:
|
149
150
|
- lib
|
150
151
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -167,11 +168,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
168
|
version: "0"
|
168
169
|
requirements: []
|
169
170
|
|
170
|
-
rubyforge_project:
|
171
|
-
rubygems_version: 1.
|
171
|
+
rubyforge_project: engineyard-metadata
|
172
|
+
rubygems_version: 1.6.2
|
172
173
|
signing_key:
|
173
174
|
specification_version: 3
|
174
175
|
summary: Make your EngineYard AppCloud (Amazon EC2) instances aware of each other.
|
175
176
|
test_files:
|
176
177
|
- spec/metadata_spec.rb
|
177
178
|
- spec/spec_helper.rb
|
179
|
+
- spec/support/dna.json
|
180
|
+
- spec/support/dot.git.config
|
181
|
+
- spec/support/engine_yard_cloud_api_response.json
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.2
|