fog_tracker 0.1.2 → 0.1.3
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.
- data/README.md +12 -7
- data/lib/fog_tracker/account_tracker.rb +7 -2
- data/lib/fog_tracker/tracker.rb +5 -1
- data/lib/fog_tracker/version.rb +1 -1
- data/spec/lib/fog_tracker/account_tracker_spec.rb +29 -0
- metadata +18 -18
data/README.md
CHANGED
@@ -14,15 +14,15 @@ The Fog Tracker uses the [Fog gem](https://github.com/fog/fog) to periodically p
|
|
14
14
|
----------------
|
15
15
|
Why is it?
|
16
16
|
----------------
|
17
|
-
The Fog Tracker is intended to be a foundation library, on top of which more complex cloud dashboard or management applications can be built. It
|
17
|
+
The Fog Tracker is intended to be a foundation library, on top of which more complex cloud dashboard or management applications can be built. It is a polling and query layer, allowing such applications to decouple their (read-only) requests to cloud service providers from access to the results of those requests.
|
18
18
|
|
19
19
|
|
20
20
|
----------------
|
21
21
|
Where is it? (Installation)
|
22
22
|
----------------
|
23
|
-
Install the Fog Tracker gem
|
23
|
+
Install the Fog Tracker gem and its dependencies from RubyGems:
|
24
24
|
|
25
|
-
gem install fog_tracker
|
25
|
+
gem install fog_tracker
|
26
26
|
|
27
27
|
|
28
28
|
----------------
|
@@ -57,7 +57,7 @@ How is it [done]? (Usage)
|
|
57
57
|
|
58
58
|
tracker.start
|
59
59
|
|
60
|
-
3) Access the Fog object collections by
|
60
|
+
3) Access the Fog object collections by passing a filter-based query String to `Tracker::query`. The query string format is: `account_name::service::provider::collection`
|
61
61
|
|
62
62
|
# get all Compute instances across all accounts and providers
|
63
63
|
tracker.query("*::Compute::*::servers")
|
@@ -68,11 +68,14 @@ How is it [done]? (Usage)
|
|
68
68
|
# get all S3 objects in a given account
|
69
69
|
tracker["my production account::Storage::AWS::files"]
|
70
70
|
|
71
|
-
|
71
|
+
----------------
|
72
|
+
*Usage Tips*
|
73
|
+
|
74
|
+
Instead of calling `each` on the results of every query, you can pass a single-argument block, and it will be invoked once with each resulting resource:
|
72
75
|
|
73
76
|
tracker.query("*::*::*::*"){|r| puts "Found #{r.class} #{r.identity}"}
|
74
77
|
|
75
|
-
You can also pass a Proc to the Tracker at initialization, which will be invoked whenever an account's Resources have been updated. It should accept
|
78
|
+
You can also pass a Proc to the Tracker at initialization, which will be invoked whenever an account's Resources have been updated. It should accept an Array containing the updated Resources as its first argument:
|
76
79
|
|
77
80
|
FogTracker::Tracker.new(YAML::load(File.read 'accounts.yml'),
|
78
81
|
:callback => Proc.new do |resources|
|
@@ -81,7 +84,9 @@ How is it [done]? (Usage)
|
|
81
84
|
end
|
82
85
|
).start
|
83
86
|
|
84
|
-
|
87
|
+
To get a Resource's Hash of account information, call its `tracker_account` method _(credentials are removed)_.
|
88
|
+
|
89
|
+
Any Exceptions that occur in the Tracker's polling threads are rescued and logged. If you want to take further action, you can initialize the Tracker with an `:error_callback` Proc, similar to the Account update `:callback` -- except that the `:error_callback` should accept an Exception instead of an Array of Resources.
|
85
90
|
|
86
91
|
|
87
92
|
----------------
|
@@ -20,6 +20,8 @@ module FogTracker
|
|
20
20
|
# * +:delay+ - Default time between polling of accounts
|
21
21
|
# * +:callback+ - A Method or Proc to call each time an account is polled.
|
22
22
|
# It should take the name of the account as its only required parameter
|
23
|
+
# * +:error_callback+ - A Proc to call if polling errors occur.
|
24
|
+
# It should take a single Exception as its only required parameter
|
23
25
|
# * +:logger+ - a Ruby Logger-compatible object
|
24
26
|
def initialize(account_name, account, options={})
|
25
27
|
@name = account_name
|
@@ -28,6 +30,7 @@ module FogTracker
|
|
28
30
|
@log = options[:logger] || FogTracker.default_logger
|
29
31
|
@delay = options[:delay] || account[:polling_time] ||
|
30
32
|
FogTracker::DEFAULT_POLLING_TIME
|
33
|
+
@error_proc = options[:error_callback]
|
31
34
|
@log.debug "Creating tracker for account #{@name}."
|
32
35
|
create_resource_trackers
|
33
36
|
end
|
@@ -46,8 +49,10 @@ module FogTracker
|
|
46
49
|
end
|
47
50
|
rescue Exception => e
|
48
51
|
@log.error "Exception polling account #{name}: #{e.message}"
|
49
|
-
@log.
|
50
|
-
|
52
|
+
e.backtrace.each {|line| @log.debug line}
|
53
|
+
@error_proc.call(e) if @error_proc
|
54
|
+
sleep @delay
|
55
|
+
retry
|
51
56
|
end
|
52
57
|
end
|
53
58
|
else
|
data/lib/fog_tracker/tracker.rb
CHANGED
@@ -17,12 +17,15 @@ module FogTracker
|
|
17
17
|
# * +:delay+ - Time between polling of accounts. Overrides per-account value
|
18
18
|
# * +:callback+ - A Proc to call each time an account is polled.
|
19
19
|
# It should take the name of the account as its only required parameter
|
20
|
+
# * +:error_callback+ - A Proc to call if polling errors occur.
|
21
|
+
# It should take a single Exception as its only required parameter
|
20
22
|
# * +:logger+ - a Ruby Logger-compatible object
|
21
23
|
def initialize(accounts = {}, options = {})
|
22
24
|
@accounts = accounts
|
23
25
|
@delay = options[:delay]
|
24
26
|
@callback = options[:callback]
|
25
27
|
@log = options[:logger] || FogTracker.default_logger
|
28
|
+
@error_proc = options[:error_callback]
|
26
29
|
# Create a Hash that maps account names to AccountTrackers
|
27
30
|
create_trackers
|
28
31
|
end
|
@@ -86,7 +89,8 @@ module FogTracker
|
|
86
89
|
@accounts.each do |name, account|
|
87
90
|
@log.debug "Setting up tracker for account #{name}"
|
88
91
|
@trackers[name] = AccountTracker.new(name, account,
|
89
|
-
{:delay => @delay, :callback => @callback,
|
92
|
+
{:delay => @delay, :callback => @callback,
|
93
|
+
:error_callback => @error_proc, :logger => @log})
|
90
94
|
end
|
91
95
|
end
|
92
96
|
|
data/lib/fog_tracker/version.rb
CHANGED
@@ -26,6 +26,24 @@ module FogTracker
|
|
26
26
|
@tracker.resource_trackers.size.should be > 0
|
27
27
|
end
|
28
28
|
|
29
|
+
context "when it encounters an Exception while updating" do
|
30
|
+
context "when initialized with an error callback" do
|
31
|
+
it "should fire the callback" do
|
32
|
+
ResourceTracker.any_instance.stub(:update).and_raise
|
33
|
+
receiver = double "error callback object"
|
34
|
+
receiver.stub(:callback)
|
35
|
+
tracker = AccountTracker.new(
|
36
|
+
FAKE_ACCOUNT_NAME, FAKE_ACCOUNT, {
|
37
|
+
:error_callback => Proc.new {|err| receiver.callback(err)}
|
38
|
+
}
|
39
|
+
)
|
40
|
+
receiver.should_receive(:callback).exactly(:once)
|
41
|
+
tracker.start
|
42
|
+
sleep THREAD_STARTUP_DELAY
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
29
47
|
describe '#start' do
|
30
48
|
it "sends update() to its ResourceTrackers" do
|
31
49
|
@tracker.resource_trackers.each do |resource_tracker|
|
@@ -34,6 +52,17 @@ module FogTracker
|
|
34
52
|
@tracker.start
|
35
53
|
sleep THREAD_STARTUP_DELAY # wait for background thread to start
|
36
54
|
end
|
55
|
+
it "invokes its callback Proc when its account is updated" do
|
56
|
+
receiver = double "account callback object"
|
57
|
+
receiver.stub(:callback)
|
58
|
+
tracker = AccountTracker.new(
|
59
|
+
FAKE_ACCOUNT_NAME, FAKE_ACCOUNT, :logger => LOG,
|
60
|
+
:callback => Proc.new {|resources| receiver.callback(resources)}
|
61
|
+
)
|
62
|
+
receiver.should_receive(:callback).exactly(FAKE_ACCOUNTS.size).times
|
63
|
+
tracker.start
|
64
|
+
sleep THREAD_STARTUP_DELAY
|
65
|
+
end
|
37
66
|
end
|
38
67
|
|
39
68
|
describe '#stop' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-27 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
16
|
-
requirement: &
|
16
|
+
requirement: &2151853820 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2151853820
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &2151853060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2151853060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &2151852120 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2151852120
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rdoc
|
49
|
-
requirement: &
|
49
|
+
requirement: &2151850540 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2151850540
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: guard
|
60
|
-
requirement: &
|
60
|
+
requirement: &2151848880 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2151848880
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: guard-rake
|
71
|
-
requirement: &
|
71
|
+
requirement: &2151844960 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2151844960
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: ruby_gntp
|
82
|
-
requirement: &
|
82
|
+
requirement: &2151843360 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2151843360
|
91
91
|
description: This gem peridically polls mutiple cloud computing services using the
|
92
92
|
fog gem, asynchronously updating the state of the resulting collections of Fog Resources.
|
93
93
|
email:
|
@@ -136,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
136
|
version: '0'
|
137
137
|
segments:
|
138
138
|
- 0
|
139
|
-
hash:
|
139
|
+
hash: 586888198881977126
|
140
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
141
|
none: false
|
142
142
|
requirements:
|
@@ -145,10 +145,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
145
|
version: '0'
|
146
146
|
segments:
|
147
147
|
- 0
|
148
|
-
hash:
|
148
|
+
hash: 586888198881977126
|
149
149
|
requirements: []
|
150
150
|
rubyforge_project: fog_tracker
|
151
|
-
rubygems_version: 1.8.
|
151
|
+
rubygems_version: 1.8.15
|
152
152
|
signing_key:
|
153
153
|
specification_version: 3
|
154
154
|
summary: Tracks the state of cloud computing resources across multiple accounts with
|