right_agent 2.0.7-x86-mingw32 → 2.0.8-x86-mingw32
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/lib/right_agent/agent.rb +15 -17
- data/lib/right_agent/agent_tag_manager.rb +7 -2
- data/lib/right_agent/clients/auth_client.rb +15 -0
- data/lib/right_agent/clients/base_retry_client.rb +6 -3
- data/lib/right_agent/clients/right_http_client.rb +5 -4
- data/lib/right_agent/clients/router_client.rb +2 -0
- data/lib/right_agent/connectivity_checker.rb +1 -1
- data/right_agent.gemspec +3 -3
- data/spec/agent_tag_manager_spec.rb +10 -1
- data/spec/clients/auth_client_spec.rb +14 -0
- data/spec/clients/base_retry_client_spec.rb +5 -1
- metadata +5 -5
data/lib/right_agent/agent.rb
CHANGED
@@ -193,11 +193,7 @@ module RightScale
|
|
193
193
|
@history.update("start")
|
194
194
|
now = Time.now
|
195
195
|
Log.info("[start] Agent #{@identity} starting; time: #{now.utc}; utc_offset: #{now.utc_offset}")
|
196
|
-
Log.
|
197
|
-
log_opts = @options.inject([]) do |t, (k, v)|
|
198
|
-
t << "- #{k}: #{k.to_s =~ /pass/ ? '****' : (v.respond_to?(:each) ? v.inspect : v)}"
|
199
|
-
end
|
200
|
-
log_opts.each { |l| Log.debug(l) }
|
196
|
+
@options.each { |k, v| Log.info("- #{k}: #{k.to_s =~ /pass/ ? '****' : (v.respond_to?(:each) ? v.inspect : v)}") }
|
201
197
|
|
202
198
|
begin
|
203
199
|
# Capture process id in file after optional daemonize
|
@@ -495,7 +491,7 @@ module RightScale
|
|
495
491
|
if @mode == :http
|
496
492
|
stats.merge!(@client.stats(reset))
|
497
493
|
else
|
498
|
-
stats["
|
494
|
+
stats["brokers"] = @client.stats(reset)
|
499
495
|
end
|
500
496
|
result = OperationResult.success(stats)
|
501
497
|
@last_stat_reset_time = now if reset
|
@@ -529,7 +525,7 @@ module RightScale
|
|
529
525
|
"request failures" => @request_failure_stats.all,
|
530
526
|
"response failures" => @response_failure_stats.all
|
531
527
|
}
|
532
|
-
|
528
|
+
if @mode != :http
|
533
529
|
stats["connect requests"] = @connect_request_stats.all
|
534
530
|
stats["non-deliveries"] = @non_delivery_stats.all
|
535
531
|
end
|
@@ -610,7 +606,7 @@ module RightScale
|
|
610
606
|
load_actors
|
611
607
|
setup_traps
|
612
608
|
setup_status
|
613
|
-
|
609
|
+
if @mode != :http
|
614
610
|
setup_non_delivery
|
615
611
|
setup_queues
|
616
612
|
end
|
@@ -731,7 +727,7 @@ module RightScale
|
|
731
727
|
Dir["#{dir}/*.rb"].each do |file|
|
732
728
|
actor = File.basename(file, ".rb")
|
733
729
|
next if actors && !actors.include?(actor)
|
734
|
-
Log.info("[setup]
|
730
|
+
Log.info("[setup] Loading actor #{file}")
|
735
731
|
require file
|
736
732
|
actors.delete(actor)
|
737
733
|
end
|
@@ -740,7 +736,7 @@ module RightScale
|
|
740
736
|
|
741
737
|
# Perform agent-specific initialization including actor creation and registration
|
742
738
|
if (init_file = AgentConfig.init_file)
|
743
|
-
Log.info("[setup]
|
739
|
+
Log.info("[setup] Initializing agent from #{init_file}")
|
744
740
|
instance_eval(File.read(init_file), init_file)
|
745
741
|
else
|
746
742
|
Log.error("No agent init.rb file found in init directory of #{AgentConfig.root_dir.inspect}")
|
@@ -794,12 +790,14 @@ module RightScale
|
|
794
790
|
# true:: Always return true
|
795
791
|
def setup_status
|
796
792
|
@status = {}
|
797
|
-
if @
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
793
|
+
if @client
|
794
|
+
if @mode == :http
|
795
|
+
@status = @client.status { |type, state| update_status(type, state) }.dup
|
796
|
+
else
|
797
|
+
@client.connection_status { |state| update_status(:broker, state) }
|
798
|
+
@status[:broker] = :connected
|
799
|
+
@status[:auth] = @auth_client.status { |type, state| update_status(type, state) } if @auth_client
|
800
|
+
end
|
803
801
|
end
|
804
802
|
true
|
805
803
|
end
|
@@ -976,7 +974,7 @@ module RightScale
|
|
976
974
|
# true:: Always return true
|
977
975
|
def setup_status_checks(interval)
|
978
976
|
@check_status_count = 0
|
979
|
-
@check_status_brokers = @client.all
|
977
|
+
@check_status_brokers = @client.all if @mode != :http
|
980
978
|
@check_status_timer = EM::PeriodicTimer.new(interval) { check_status }
|
981
979
|
true
|
982
980
|
end
|
@@ -45,7 +45,7 @@ module RightScale
|
|
45
45
|
# true:: Always return true
|
46
46
|
def tags(options = {})
|
47
47
|
# TODO remove use of agent identity when fully drop AMQP
|
48
|
-
do_query(nil, @agent.self_href
|
48
|
+
do_query(nil, @agent.mode == :http ? @agent.self_href : @agent.identity, options) do |result|
|
49
49
|
if result.kind_of?(Hash)
|
50
50
|
yield(result.size == 1 ? result.values.first['tags'] : [])
|
51
51
|
else
|
@@ -168,7 +168,12 @@ module RightScale
|
|
168
168
|
agent_check
|
169
169
|
payload = {:agent_identity => @agent.identity}
|
170
170
|
payload[:tags] = ensure_flat_array_value(tags) unless tags.nil? || tags.empty?
|
171
|
-
|
171
|
+
# TODO remove use of agent identity when fully drop AMQP
|
172
|
+
if @agent.mode == :http
|
173
|
+
payload[:hrefs] = ensure_flat_array_value(hrefs) unless hrefs.nil? || hrefs.empty?
|
174
|
+
else
|
175
|
+
payload[:agent_ids] = ensure_flat_array_value(hrefs) unless hrefs.nil? || hrefs.empty?
|
176
|
+
end
|
172
177
|
request = RightScale::RetryableRequest.new("/router/query_tags", payload, request_options)
|
173
178
|
request.callback { |result| yield raw ? request.raw_response : result }
|
174
179
|
request.errback do |message|
|
@@ -154,6 +154,21 @@ module RightScale
|
|
154
154
|
state
|
155
155
|
end
|
156
156
|
|
157
|
+
# Set callback for each successful communication excluding health checks
|
158
|
+
# Multiple callbacks are supported
|
159
|
+
#
|
160
|
+
# @yield [] required block executed after successful communication
|
161
|
+
#
|
162
|
+
# @return [TrueClass] always true
|
163
|
+
#
|
164
|
+
# @raise [ArgumentError] block missing
|
165
|
+
def communicated(&callback)
|
166
|
+
raise ArgumentError, "Block missing" unless callback
|
167
|
+
@communicated_callbacks ||= []
|
168
|
+
@communicated_callbacks << callback
|
169
|
+
true
|
170
|
+
end
|
171
|
+
|
157
172
|
# Current statistics for this client
|
158
173
|
#
|
159
174
|
# @param [Boolean] reset the statistics after getting the current ones
|
@@ -88,7 +88,6 @@ module RightScale
|
|
88
88
|
@auth_client = auth_client
|
89
89
|
@http_client = nil
|
90
90
|
@status_callbacks = []
|
91
|
-
@communicated_callbacks = []
|
92
91
|
@options = options.dup
|
93
92
|
@options[:server_name] ||= type.to_s
|
94
93
|
@options[:open_timeout] ||= DEFAULT_OPEN_TIMEOUT
|
@@ -122,8 +121,12 @@ module RightScale
|
|
122
121
|
# @yield [] required block executed after successful communication
|
123
122
|
#
|
124
123
|
# @return [TrueClass] always true
|
124
|
+
#
|
125
|
+
# @raise [ArgumentError] block missing
|
125
126
|
def communicated(&callback)
|
126
|
-
|
127
|
+
raise ArgumentError, "Block missing" unless callback
|
128
|
+
@communicated_callbacks ||= []
|
129
|
+
@communicated_callbacks << callback
|
127
130
|
true
|
128
131
|
end
|
129
132
|
|
@@ -350,7 +353,7 @@ module RightScale
|
|
350
353
|
request_uuid ? retry : raise
|
351
354
|
end
|
352
355
|
end
|
353
|
-
@communicated_callbacks.each { |callback| callback.call }
|
356
|
+
@communicated_callbacks.each { |callback| callback.call } if @communicated_callbacks
|
354
357
|
result
|
355
358
|
end
|
356
359
|
|
@@ -209,17 +209,18 @@ module RightScale
|
|
209
209
|
|
210
210
|
# Set callback for each successful communication excluding health checks
|
211
211
|
#
|
212
|
-
# @param [
|
212
|
+
# @param [Array] types of server: :auth, :api, or :router; defaults to all
|
213
213
|
#
|
214
214
|
# @yield [] required block executed after successful communication
|
215
215
|
#
|
216
216
|
# @return [TrueClass] always true
|
217
217
|
#
|
218
218
|
# @raise [RuntimeError] init was not called
|
219
|
-
def communicated(
|
219
|
+
def communicated(types = [], &callback)
|
220
220
|
raise RuntimeError, "#{self.class.name}#init was not called" unless @auth
|
221
|
-
@
|
222
|
-
@
|
221
|
+
@auth.communicated(&callback) if types.empty? || types.include?(:auth)
|
222
|
+
@api.communicated(&callback) if @api && (types.empty? || types.include?(:api))
|
223
|
+
@router.communicated(&callback) if @router && (types.empty? || types.include?(:router))
|
223
224
|
true
|
224
225
|
end
|
225
226
|
|
@@ -397,6 +397,7 @@ module RightScale
|
|
397
397
|
Log.info("Sending EVENT <#{result[:uuid]}> #{result[:type]} #{result[:path]} to #{result[:from]}")
|
398
398
|
@websocket.send(JSON.dump({:event => result, :routing_keys => [event[:from]]}))
|
399
399
|
end
|
400
|
+
@communicated_callbacks.each { |callback| callback.call } if @communicated_callbacks
|
400
401
|
rescue Exception => e
|
401
402
|
Log.error("Failed handling WebSocket event", e, :trace)
|
402
403
|
@stats["exceptions"].track("event", e)
|
@@ -420,6 +421,7 @@ module RightScale
|
|
420
421
|
begin
|
421
422
|
result = long_poll(routing_keys, uuids, &handler)
|
422
423
|
@reconnect_interval = RECONNECT_INTERVAL
|
424
|
+
@communicated_callbacks.each { |callback| callback.call } if @communicated_callbacks
|
423
425
|
rescue Exceptions::Unauthorized, Exceptions::ConnectivityFailure, Exceptions::RetryableError => e
|
424
426
|
Log.error("Failed long-polling", e, :no_trace)
|
425
427
|
sleep(backoff_reconnect_interval)
|
@@ -89,7 +89,7 @@ module RightScale
|
|
89
89
|
# === Return
|
90
90
|
# true:: Always return true
|
91
91
|
def check(id = nil, max_ping_timeouts = MAX_PING_TIMEOUTS)
|
92
|
-
unless @terminating || @ping_timer || (id && !@sender.client.connected?(id))
|
92
|
+
unless @terminating || @ping_timer || (id && !@sender.agent.client.connected?(id))
|
93
93
|
@ping_id = id
|
94
94
|
@ping_timer = EM::Timer.new(PING_TIMEOUT) do
|
95
95
|
if @ping_id
|
data/right_agent.gemspec
CHANGED
@@ -25,8 +25,8 @@ require 'rbconfig'
|
|
25
25
|
|
26
26
|
Gem::Specification.new do |spec|
|
27
27
|
spec.name = 'right_agent'
|
28
|
-
spec.version = '2.0.
|
29
|
-
spec.date = '2014-
|
28
|
+
spec.version = '2.0.8'
|
29
|
+
spec.date = '2014-03-03'
|
30
30
|
spec.authors = ['Lee Kirchhoff', 'Raphael Simon', 'Tony Spataro', 'Scott Messier']
|
31
31
|
spec.email = 'lee@rightscale.com'
|
32
32
|
spec.homepage = 'https://github.com/rightscale/right_agent'
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |spec|
|
|
40
40
|
|
41
41
|
spec.add_dependency('right_support', ['>= 2.4.1', '< 3.0'])
|
42
42
|
spec.add_dependency('right_amqp', '~> 0.7')
|
43
|
-
spec.add_dependency('rest-client', '1.7.0.
|
43
|
+
spec.add_dependency('rest-client', '1.7.0.1')
|
44
44
|
spec.add_dependency('faye-websocket', '0.7.0')
|
45
45
|
spec.add_dependency('eventmachine', ['>= 0.12.10', '< 2.0'])
|
46
46
|
spec.add_dependency('net-ssh', '~> 2.0')
|
@@ -32,7 +32,7 @@ describe RightScale::AgentTagManager do
|
|
32
32
|
@identity = "rs-agent-1-1"
|
33
33
|
@agent_href = "/api/clouds/1/instances/1"
|
34
34
|
@agent_href2 = "/api/clouds/2/instances/2"
|
35
|
-
@agent = flexmock("agent", :self_href => @agent_href, :identity => @identity)
|
35
|
+
@agent = flexmock("agent", :self_href => @agent_href, :identity => @identity, :mode => :http).by_default
|
36
36
|
@hrefs = [@agent_href, @agent_href2]
|
37
37
|
@manager = RightScale::AgentTagManager.instance
|
38
38
|
@manager.agent = @agent
|
@@ -60,6 +60,15 @@ describe RightScale::AgentTagManager do
|
|
60
60
|
@result.should == [@tag]
|
61
61
|
end
|
62
62
|
|
63
|
+
it "retrieves current agent tags using agent ID if not in :http mode" do
|
64
|
+
@agent.should_receive(:mode).and_return(:amqp)
|
65
|
+
@retryable_request.should_receive(:new).with("/router/query_tags",
|
66
|
+
{:agent_identity => @identity, :agent_ids => [@identity]}, {}).and_return(@request).once
|
67
|
+
@request.should_receive(:callback).and_yield({@agent_href => {"tags" => [@tag]}}).once
|
68
|
+
@manager.tags { |r| @result = r }
|
69
|
+
@result.should == [@tag]
|
70
|
+
end
|
71
|
+
|
63
72
|
it "returns empty array when there is no results hash" do
|
64
73
|
@request.should_receive(:callback).and_yield({}).once
|
65
74
|
@manager.tags { |r| @result = r }
|
@@ -189,6 +189,20 @@ describe RightScale::AuthClient do
|
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
192
|
+
context :communicated do
|
193
|
+
it "stores callback" do
|
194
|
+
callback = lambda { |_, _| }
|
195
|
+
@client.instance_variable_get(:@communicated_callbacks).should be_nil
|
196
|
+
@client.communicated(&callback)
|
197
|
+
@client.instance_variable_get(:@communicated_callbacks).size.should == 1
|
198
|
+
@client.instance_variable_get(:@communicated_callbacks)[0].should == callback
|
199
|
+
end
|
200
|
+
|
201
|
+
it "requires callback block" do
|
202
|
+
lambda { @client.communicated }.should raise_error(ArgumentError, "Block missing")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
192
206
|
context :check_authorized do
|
193
207
|
it "raises retryable error if state is :expired" do
|
194
208
|
@client.send(:state=, :authorized)
|
@@ -136,11 +136,15 @@ describe RightScale::BaseRetryClient do
|
|
136
136
|
context :communicated do
|
137
137
|
it "stores callback" do
|
138
138
|
callback = lambda { |_, _| }
|
139
|
-
@client.instance_variable_get(:@communicated_callbacks).
|
139
|
+
@client.instance_variable_get(:@communicated_callbacks).should be_nil
|
140
140
|
@client.communicated(&callback)
|
141
141
|
@client.instance_variable_get(:@communicated_callbacks).size.should == 1
|
142
142
|
@client.instance_variable_get(:@communicated_callbacks)[0].should == callback
|
143
143
|
end
|
144
|
+
|
145
|
+
it "requires callback block" do
|
146
|
+
lambda { @client.communicated }.should raise_error(ArgumentError, "Block missing")
|
147
|
+
end
|
144
148
|
end
|
145
149
|
|
146
150
|
context :close do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: x86-mingw32
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-
|
15
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: right_support
|
@@ -59,7 +59,7 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - '='
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 1.7.0.
|
62
|
+
version: 1.7.0.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
requirements:
|
68
68
|
- - '='
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 1.7.0.
|
70
|
+
version: 1.7.0.1
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: faye-websocket
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -437,7 +437,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
437
437
|
version: '0'
|
438
438
|
segments:
|
439
439
|
- 0
|
440
|
-
hash: -
|
440
|
+
hash: -1395793302884247070
|
441
441
|
requirements: []
|
442
442
|
rubyforge_project:
|
443
443
|
rubygems_version: 1.8.26
|