fog_tracker 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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 allows such applications to decouple their requests to cloud service providers from their access to the results of those requests.
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 (and its dependencies if necessary) from RubyGems
23
+ Install the Fog Tracker gem and its dependencies from RubyGems:
24
24
 
25
- gem install fog_tracker [rake bundler]
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 calling `Tracker::query`, and passing it a filter-based query String. The query string format is: `account_name::service::provider::collection`
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
- If you're tired of calling `each` on the results of every query, pass a single-argument block, and it will be invoked once with each resulting resource:
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 a list of the updated Resources as its first argument:
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
- The appropriate account information for each Fog resource, read from `accounts.yml` can be obtained by calling its `tracker_account` method.
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.error e.backtrace.join("\n")
50
- exit 99
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
@@ -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, :logger => @log})
92
+ {:delay => @delay, :callback => @callback,
93
+ :error_callback => @error_proc, :logger => @log})
90
94
  end
91
95
  end
92
96
 
@@ -1,3 +1,3 @@
1
1
  module FogTracker
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -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.2
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: &70121482437700 !ruby/object:Gem::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: *70121482437700
24
+ version_requirements: *2151853820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70121482437100 !ruby/object:Gem::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: *70121482437100
35
+ version_requirements: *2151853060
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70121482436440 !ruby/object:Gem::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: *70121482436440
46
+ version_requirements: *2151852120
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &70121482435700 !ruby/object:Gem::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: *70121482435700
57
+ version_requirements: *2151850540
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard
60
- requirement: &70121482434720 !ruby/object:Gem::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: *70121482434720
68
+ version_requirements: *2151848880
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard-rake
71
- requirement: &70121482433280 !ruby/object:Gem::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: *70121482433280
79
+ version_requirements: *2151844960
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ruby_gntp
82
- requirement: &70121482432400 !ruby/object:Gem::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: *70121482432400
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: -2556488865982976006
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: -2556488865982976006
148
+ hash: 586888198881977126
149
149
  requirements: []
150
150
  rubyforge_project: fog_tracker
151
- rubygems_version: 1.8.10
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