aws-data 0.0.0 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +49 -0
- data/aws-data.gemspec +1 -1
- data/lib/aws-data.rb +2 -0
- data/lib/aws-data/base.rb +72 -0
- data/lib/aws-data/metadata.rb +2 -7
- data/lib/aws-data/transport.rb +7 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e475268b6b72f7eb862131e4cd37243a283d0d4
|
4
|
+
data.tar.gz: 8ff49f8b175a99cdd0717c6b44b0188871eb690b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b27ad408bbe7ae779fe4a7a7e219f8fce2641e4d4069739b41b26ed6ec64bf8e914766330122afbf5b76c782f08a54403ab11dc9503e3505e4e1b1464e3ee658
|
7
|
+
data.tar.gz: 3b8c305c5c372d637142f27d18870ea149b96dd6b04abeb18bb2bbab7ef1f5ea51e2d430e2dd800299fdbafe704c2a0fc284573c6461ce76a766922f572ba38e
|
data/README.md
CHANGED
@@ -3,4 +3,53 @@ aws-data
|
|
3
3
|
|
4
4
|
A rubygem for fetching data from AWS's user and metadata endpoints from ec2.
|
5
5
|
|
6
|
+
### API
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
|
10
|
+
data = AWSData::Metadata.new
|
11
|
+
|
12
|
+
=begin
|
13
|
+
|
14
|
+
The constructor reaches out to the network to enumerate all the endpoints.
|
15
|
+
It'll block for a bit and then throw exceptions if you're not on EC2, or better
|
16
|
+
still do random undefined things if someone's chosen to make 169.254/24
|
17
|
+
routable on your network
|
18
|
+
|
19
|
+
=end
|
20
|
+
|
21
|
+
data.instance-id #=> i-xxxxxxx
|
22
|
+
|
23
|
+
data.methods #=>
|
24
|
+
# ...
|
25
|
+
# 'ami_id',
|
26
|
+
# 'ami_launch_index',
|
27
|
+
# 'ami_manifest_path',
|
28
|
+
# 'block_device_mapping',
|
29
|
+
# 'hostname',
|
30
|
+
# 'instance_action',
|
31
|
+
# 'instance_id',
|
32
|
+
# 'instance_type',
|
33
|
+
# 'kernel_id',
|
34
|
+
# 'local_hostname',
|
35
|
+
# 'local_ipv4',
|
36
|
+
# 'mac',
|
37
|
+
# 'metrics',
|
38
|
+
# 'network',
|
39
|
+
# 'placement',
|
40
|
+
# 'profile',
|
41
|
+
# 'public_hostname',
|
42
|
+
# 'public_ipv4',
|
43
|
+
# 'public_keys',
|
44
|
+
# 'reservation_id',
|
45
|
+
# ...
|
46
|
+
|
47
|
+
=begin
|
48
|
+
|
49
|
+
Note that some of these will return a new Transport object, eg network, which has finder methods for it's keys
|
50
|
+
|
51
|
+
=end
|
52
|
+
```
|
53
|
+
|
54
|
+
|
6
55
|
See: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
|
data/aws-data.gemspec
CHANGED
data/lib/aws-data.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
module AWSData
|
2
|
+
|
3
|
+
Record = Struct.new("Record", :name, :finder)
|
4
|
+
|
5
|
+
class Base
|
6
|
+
|
7
|
+
class << self
|
8
|
+
@base_path = nil
|
9
|
+
def base_path(path)
|
10
|
+
@base_path = path
|
11
|
+
end
|
12
|
+
|
13
|
+
def _base_path
|
14
|
+
@base_path
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
# Setup the finders, or throw an exception if their IP isn't routable
|
20
|
+
unless self.class._base_path
|
21
|
+
raise "Can't instanciate without a base_path"
|
22
|
+
end
|
23
|
+
|
24
|
+
methods = parse_endpoint_data(transport.get(self.class._base_path))
|
25
|
+
|
26
|
+
methods.each do |m|
|
27
|
+
method_name = m.name.gsub(/-/, "_").to_sym
|
28
|
+
if m.finder
|
29
|
+
eigenclass.send(:define_method, method_name) do
|
30
|
+
Finder.new("#{self.class._base_path}/#{m.name}/")
|
31
|
+
end
|
32
|
+
else
|
33
|
+
eigenclass.send(:define_method, method_name) do
|
34
|
+
transport.get("#{self.class._base_path}/#{m.name}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def transport
|
41
|
+
@transport ||= Transport.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_endpoint_data(data)
|
45
|
+
ret = []
|
46
|
+
data.split("\n").each do |el|
|
47
|
+
if el.end_with? "/"
|
48
|
+
el.gsub!(/\/$/, "")
|
49
|
+
ret << Record.new(el, true)
|
50
|
+
else
|
51
|
+
ret << Record.new(el, false)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
return ret
|
55
|
+
end
|
56
|
+
|
57
|
+
def eigenclass
|
58
|
+
class << self
|
59
|
+
self
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
class Finder
|
66
|
+
def self.new(path)
|
67
|
+
Class.new(Base) do
|
68
|
+
base_path(path)
|
69
|
+
end.new
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/aws-data/metadata.rb
CHANGED
data/lib/aws-data/transport.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
|
3
3
|
module AWSData
|
4
|
+
class EndpointUnavailable < Exception
|
5
|
+
end
|
6
|
+
|
4
7
|
class Transport
|
5
8
|
|
9
|
+
ENDPOINT_IP = "169.254.169.254"
|
10
|
+
|
6
11
|
def get(path)
|
7
12
|
uri = uri_for(path)
|
8
13
|
res = Net::HTTP.get_response(uri)
|
9
14
|
if res.is_a?(Net::HTTPSuccess)
|
10
|
-
return
|
15
|
+
return res.body
|
11
16
|
else
|
12
|
-
raise
|
17
|
+
raise EndpointUnavailable
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richo Healey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Fetch instance data from AWS
|
14
14
|
email:
|
@@ -20,6 +20,7 @@ files:
|
|
20
20
|
- README.md
|
21
21
|
- aws-data.gemspec
|
22
22
|
- lib/aws-data.rb
|
23
|
+
- lib/aws-data/base.rb
|
23
24
|
- lib/aws-data/metadata.rb
|
24
25
|
- lib/aws-data/transport.rb
|
25
26
|
homepage: http://github.com/richo/aws-data
|