right_agent 2.2.1-x86-mingw32 → 2.4.3-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/README.rdoc +2 -0
  2. data/lib/right_agent.rb +1 -0
  3. data/lib/right_agent/actor.rb +0 -28
  4. data/lib/right_agent/actors/agent_manager.rb +20 -18
  5. data/lib/right_agent/agent.rb +70 -87
  6. data/lib/right_agent/agent_config.rb +1 -1
  7. data/lib/right_agent/agent_tag_manager.rb +1 -1
  8. data/lib/right_agent/clients/api_client.rb +2 -1
  9. data/lib/right_agent/clients/auth_client.rb +2 -6
  10. data/lib/right_agent/clients/balanced_http_client.rb +22 -11
  11. data/lib/right_agent/clients/base_retry_client.rb +14 -22
  12. data/lib/right_agent/clients/non_blocking_client.rb +1 -0
  13. data/lib/right_agent/clients/right_http_client.rb +4 -8
  14. data/lib/right_agent/clients/router_client.rb +10 -16
  15. data/lib/right_agent/command/command_parser.rb +3 -3
  16. data/lib/right_agent/command/command_runner.rb +1 -1
  17. data/lib/right_agent/command/command_serializer.rb +0 -32
  18. data/lib/right_agent/connectivity_checker.rb +7 -11
  19. data/lib/right_agent/core_payload_types/dev_repository.rb +32 -0
  20. data/lib/right_agent/dispatcher.rb +8 -45
  21. data/lib/right_agent/enrollment_result.rb +2 -2
  22. data/lib/right_agent/error_tracker.rb +230 -0
  23. data/lib/right_agent/exceptions.rb +1 -1
  24. data/lib/right_agent/log.rb +8 -6
  25. data/lib/right_agent/packets.rb +5 -3
  26. data/lib/right_agent/pending_requests.rb +10 -4
  27. data/lib/right_agent/pid_file.rb +3 -3
  28. data/lib/right_agent/platform.rb +14 -14
  29. data/lib/right_agent/protocol_version_mixin.rb +6 -3
  30. data/lib/right_agent/scripts/agent_deployer.rb +13 -1
  31. data/lib/right_agent/sender.rb +16 -35
  32. data/lib/right_agent/serialize/secure_serializer.rb +6 -9
  33. data/lib/right_agent/serialize/serializer.rb +7 -3
  34. data/right_agent.gemspec +5 -5
  35. data/spec/agent_spec.rb +5 -5
  36. data/spec/clients/auth_client_spec.rb +1 -1
  37. data/spec/clients/balanced_http_client_spec.rb +20 -28
  38. data/spec/clients/base_retry_client_spec.rb +5 -6
  39. data/spec/clients/non_blocking_client_spec.rb +4 -0
  40. data/spec/clients/router_client_spec.rb +1 -4
  41. data/spec/dispatcher_spec.rb +6 -55
  42. data/spec/error_tracker_spec.rb +346 -0
  43. data/spec/log_spec.rb +4 -0
  44. data/spec/pending_requests_spec.rb +2 -2
  45. data/spec/sender_spec.rb +3 -3
  46. data/spec/serialize/serializer_spec.rb +14 -0
  47. data/spec/spec_helper.rb +4 -2
  48. metadata +13 -11
@@ -200,10 +200,14 @@ module RightScale
200
200
  description += " (#{exception}"
201
201
  backtrace = :no_trace
202
202
  end
203
- case backtrace
204
- when :no_trace then description += ")"
205
- when :caller then description += " in " + exception.backtrace[0] + ")"
206
- when :trace then description += " in\n " + exception.backtrace.join("\n ") + ")"
203
+ if exception.respond_to?(:backtrace) && exception.backtrace
204
+ case backtrace
205
+ when :no_trace then description += ")"
206
+ when :caller then description += " in " + exception.backtrace[0] + ")"
207
+ when :trace then description += " in\n " + exception.backtrace.join("\n ") + ")"
208
+ end
209
+ else
210
+ description += ")"
207
211
  end
208
212
  end
209
213
  description
@@ -410,8 +414,6 @@ module RightScale
410
414
  @logger = logger
411
415
  end
412
416
 
413
- protected
414
-
415
417
  # Initialize logger
416
418
  #
417
419
  # === Parameters
@@ -56,6 +56,10 @@ module RightScale
56
56
  # Instance variables that are not serialized because they are only used locally
57
57
  NOT_SERIALIZED = ["received_at"]
58
58
 
59
+ # Regexp for inserting packet size into msgpack encoded packet
60
+ # For ruby 1.9 size attribute moves from front to back of packet
61
+ PACKET_SIZE_REGEXP = RUBY_VERSION < "1.9.0" ? Regexp.new("size\xC0", nil, "n") : Regexp.new("size\xC0$", nil, "n")
62
+
59
63
  # (Float) Time in seconds in Unix-epoch when message was received
60
64
  attr_accessor :received_at
61
65
 
@@ -106,10 +110,8 @@ module RightScale
106
110
  'size' => nil
107
111
  }.to_msgpack(*a)
108
112
  @size = msg.size
109
- # For ruby 1.9 size attribute moves from front to back of packet
110
- re = RUBY_VERSION < "1.9.0" ? /size\xC0/ : /size\xC0$/
111
113
  # For msgpack 0.5.1 the to_msgpack result is a MessagePack::Packer so need to convert to string
112
- msg = msg.to_s.sub!(re) { |m| "size" + @size.to_msgpack }
114
+ msg = msg.to_s.sub!(PACKET_SIZE_REGEXP) { |m| "size" + @size.to_msgpack }
113
115
  msg
114
116
  end
115
117
 
@@ -97,12 +97,15 @@ module RightScale
97
97
 
98
98
  # Get age of youngest pending request
99
99
  #
100
+ # === Parameters
101
+ # pending_requests(Hash):: Pending requests to be examined
102
+ #
100
103
  # === Return
101
104
  # age(Integer):: Age of youngest request
102
- def youngest_age
105
+ def self.youngest_age(pending_requests)
103
106
  now = Time.now
104
107
  age = nil
105
- self.each_value do |r|
108
+ pending_requests.each_value do |r|
106
109
  seconds = (now - r.receive_time).to_i
107
110
  age = seconds if age.nil? || seconds < age
108
111
  end
@@ -111,12 +114,15 @@ module RightScale
111
114
 
112
115
  # Get age of oldest pending request
113
116
  #
117
+ # === Parameters
118
+ # pending_requests(Hash):: Pending requests to be examined
119
+ #
114
120
  # === Return
115
121
  # age(Integer):: Age of oldest request
116
- def oldest_age
122
+ def self.oldest_age(pending_requests)
117
123
  now = Time.now
118
124
  age = nil
119
- self.each_value do |r|
125
+ pending_requests.each_value do |r|
120
126
  seconds = (now - r.receive_time).to_i
121
127
  age = seconds if age.nil? || seconds > age
122
128
  end
@@ -31,7 +31,7 @@ module RightScale
31
31
  # the command protocol
32
32
  class PidFile
33
33
 
34
- class AlreadyRunning < Exception; end
34
+ class AlreadyRunning < RuntimeError; end
35
35
 
36
36
  attr_reader :identity, :pid_file, :cookie_file
37
37
 
@@ -72,8 +72,8 @@ module RightScale
72
72
  FileUtils.mkdir_p(@pid_dir)
73
73
  open(@pid_file,'w') { |f| f.write(Process.pid) }
74
74
  File.chmod(0644, @pid_file)
75
- rescue Exception => e
76
- Log.error "Failed to create PID file: #{e.message}"
75
+ rescue StandardError => e
76
+ ErrorTracker.log(self, "Failed to create PID file", e, nil, :caller)
77
77
  raise
78
78
  end
79
79
  true
@@ -248,6 +248,20 @@ unless defined?(RightScale::Platform)
248
248
  output_text
249
249
  end
250
250
 
251
+ # Determines which cloud we're on by the cheap but simple expedient of
252
+ # reading the RightScale cloud file.
253
+ #
254
+ # @deprecated leverage the right_link cloud libraries for any cloud-
255
+ # specific behavior because the behavior of all possible clouds is
256
+ # beyond the scope of hard-coded case statements.
257
+ #
258
+ # @return [String] cloud type or nil
259
+ def resolve_cloud_type
260
+ cloud_file_path = ::File.join(self.filesystem.right_scale_static_state_dir, 'cloud')
261
+ @cloud_type = ::File.read(cloud_file_path) rescue nil
262
+ @cloud_type
263
+ end
264
+
251
265
  # Base class for platform helpers.
252
266
  class PlatformHelperBase
253
267
 
@@ -745,20 +759,6 @@ unless defined?(RightScale::Platform)
745
759
  return res
746
760
  end
747
761
 
748
- # Determines which cloud we're on by the cheap but simple expedient of
749
- # reading the RightScale cloud file.
750
- #
751
- # @deprecated leverage the right_link cloud libraries for any cloud-
752
- # specific behavior because the behavior of all possible clouds is
753
- # beyond the scope of hard-coded case statements.
754
- #
755
- # @return [String] cloud type or nil
756
- def resolve_cloud_type
757
- cloud_file_path = ::File.join(self.filesystem.right_scale_static_state_dir, 'cloud')
758
- @cloud_type = ::File.read(cloud_file_path) rescue nil
759
- @cloud_type
760
- end
761
-
762
762
  end # Platform
763
763
 
764
764
  end # RightScale
@@ -34,9 +34,9 @@ module RightScale
34
34
  # Packet::DEFAULT_VERSION, which is true of all with version >= 12)
35
35
  def can_put_version_in_packet?(version); version && version != 0 end
36
36
 
37
- # Test whether given version of agent uses /mapper/query_tags rather than the
38
- # deprecated TagQuery packet
39
- def can_use_mapper_query_tags?(version); version && version >= 8 end
37
+ # Test whether given version of agent uses /router/query_tags or /mapper/query_tags
38
+ # rather than the deprecated TagQuery packet
39
+ def can_use_router_query_tags?(version); version && version >= 8 end
40
40
 
41
41
  # Test whether given version of agent can handle a request that is being retried
42
42
  # as indicated by a retries count in the Request packet
@@ -64,6 +64,9 @@ module RightScale
64
64
  # Test whether given version of agent can handle HTTP communication mode
65
65
  def can_handle_http?(version); version && version >= 23 end
66
66
 
67
+ # Test whether given version of agent can always handle a hash payload
68
+ def can_always_handle_hash_payload?(version); version && version >= 24 end
69
+
67
70
  end # ProtocolVersionMixin
68
71
 
69
72
  end # RightScale
@@ -45,6 +45,8 @@
45
45
  # --grace-timeout SEC Set number of seconds before graceful termination times out
46
46
  # --[no-]dup-check Set whether to check for and reject duplicate requests, .e.g., due to retries
47
47
  # --fiber-pool-size, -f N Set size of fiber pool
48
+ # --airbrake-endpoint URL Set URL for Airbrake endpoint for reporting exceptions to Errbit
49
+ # --airbrake-api-key KEY Set Airbrake API key for use in reporting exceptions to Errbit
48
50
  # --options, -o KEY=VAL Set options that act as final override for any persisted configuration settings
49
51
  # --monit Generate monit configuration file
50
52
  # --test Build test deployment using default test settings
@@ -205,6 +207,14 @@ module RightScale
205
207
  options[:heartbeat] = sec.to_i
206
208
  end
207
209
 
210
+ opts.on('--airbrake-endpoint URL') do |url|
211
+ options[:airbrake_endpoint] = url
212
+ end
213
+
214
+ opts.on('--airbrake-api-key KEY') do |key|
215
+ options[:airbrake_api_key] = key
216
+ end
217
+
208
218
  opts.on('-o', '--options OPT') do |e|
209
219
  fail("Invalid option definition #{e}' (use '=' to separate name and value)") unless e.include?('=')
210
220
  key, val = e.split(/=/)
@@ -277,7 +287,7 @@ module RightScale
277
287
  actors_dirs = AgentConfig.actors_dirs
278
288
  actors.each do |a|
279
289
  found = false
280
- actors_dirs.each { |d| break if found = File.exist?(File.normalize_path(File.join(d, "#{a}.rb"))) }
290
+ actors_dirs.each { |d| break if (found = File.exist?(File.normalize_path(File.join(d, "#{a}.rb")))) }
281
291
  fail("Cannot find source for actor #{a.inspect} in #{actors_dirs.inspect}") unless found
282
292
  end
283
293
  true
@@ -318,6 +328,8 @@ module RightScale
318
328
  cfg[:http_proxy] = options[:http_proxy] if options[:http_proxy]
319
329
  cfg[:http_no_proxy] = options[:http_no_proxy] if options[:http_no_proxy]
320
330
  cfg[:fiber_pool_size] = options[:fiber_pool_size] if options[:fiber_pool_size]
331
+ cfg[:airbrake_endpoint] = options[:airbrake_endpoint] if options[:airbrake_endpoint]
332
+ cfg[:airbrake_api_key] = options[:airbrake_api_key] if options[:airbrake_api_key]
321
333
  cfg
322
334
  end
323
335
 
@@ -68,10 +68,6 @@ module RightScale
68
68
  #
69
69
  # === Parameters
70
70
  # agent(Agent):: Agent using this sender; uses its identity, client, and following options:
71
- # :exception_callback(Proc):: Callback with following parameters that is activated on exception events:
72
- # exception(Exception):: Exception
73
- # message(Packet):: Message being processed
74
- # agent(Agent):: Reference to agent
75
71
  # :offline_queueing(Boolean):: Whether to queue request if client currently disconnected,
76
72
  # also requires agent invocation of initialize_offline_queue and start_offline_queue methods below,
77
73
  # as well as enable_offline_mode and disable_offline_mode as client connection status changes
@@ -102,7 +98,7 @@ module RightScale
102
98
  @connectivity_checker = if @mode == :amqp
103
99
  # Only need connectivity checker for AMQP broker since RightHttpClient does its own checking
104
100
  # via periodic session renewal
105
- ConnectivityChecker.new(self, @options[:ping_interval] || 0, @ping_stats, @exception_stats)
101
+ ConnectivityChecker.new(self, @options[:ping_interval] || 0, @ping_stats)
106
102
  end
107
103
  @@instance = self
108
104
  end
@@ -369,9 +365,9 @@ module RightScale
369
365
  token = response.token
370
366
  if (result = OperationResult.from_results(response))
371
367
  if result.non_delivery?
372
- @non_delivery_stats.update(result.content.nil? ? "nil" : result.content.inspect)
368
+ @non_delivery_stats.update(result.content.nil? ? "nil" : result.content)
373
369
  elsif result.error?
374
- @result_error_stats.update(result.content.nil? ? "nil" : result.content.inspect)
370
+ @result_error_stats.update(result.content.nil? ? "nil" : result.content)
375
371
  end
376
372
  @result_stats.update(result.status)
377
373
  else
@@ -418,7 +414,7 @@ module RightScale
418
414
  @offline_handler.terminate
419
415
  @connectivity_checker.terminate if @connectivity_checker
420
416
  pending = @pending_requests.kind(:send_request)
421
- [pending.size, pending.youngest_age]
417
+ [pending.size, PendingRequests.youngest_age(pending)]
422
418
  else
423
419
  [0, nil]
424
420
  end
@@ -448,9 +444,6 @@ module RightScale
448
444
  #
449
445
  # === Return
450
446
  # stats(Hash):: Current statistics:
451
- # "exceptions"(Hash|nil):: Exceptions raised per category, or nil if none
452
- # "total"(Integer):: Total exceptions for this category
453
- # "recent"(Array):: Most recent as a hash of "count", "type", "message", "when", and "where"
454
447
  # "non-deliveries"(Hash|nil):: Non-delivery activity stats with keys "total", "percent", "last",
455
448
  # and 'rate' with percentage breakdown per reason, or nil if none
456
449
  # "offlines"(Hash|nil):: Offline activity stats with keys "total", "last", and "duration",
@@ -463,7 +456,6 @@ module RightScale
463
456
  # with percentage breakdown per request type, or nil if none
464
457
  # "requests pending"(Hash|nil):: Number of requests waiting for response and age of oldest,
465
458
  # or nil if none
466
- # "response time"(Float):: Average number of seconds to respond to a request recently
467
459
  # "result errors"(Hash|nil):: Error result activity stats with keys "total", "percent", "last",
468
460
  # and 'rate' with percentage breakdown per error, or nil if none
469
461
  # "results"(Hash|nil):: Results activity stats with keys "total", "percent", "last", and "rate"
@@ -482,18 +474,16 @@ module RightScale
482
474
  pending["pushes"] = @pending_requests.kind(:send_push).size
483
475
  requests = @pending_requests.kind(:send_request)
484
476
  if (pending["requests"] = requests.size) > 0
485
- pending["oldest age"] = requests.oldest_age
477
+ pending["oldest age"] = PendingRequests.oldest_age(requests)
486
478
  end
487
479
  end
488
480
  stats = {
489
- "exceptions" => @exception_stats.stats,
490
481
  "non-deliveries" => @non_delivery_stats.all,
491
482
  "offlines" => offlines,
492
483
  "pings" => @ping_stats.all,
493
484
  "request kinds" => @request_kind_stats.all,
494
485
  "requests" => @request_stats.all,
495
486
  "requests pending" => pending,
496
- "response time" => @request_stats.avg_duration,
497
487
  "result errors" => @result_error_stats.all,
498
488
  "results" => @result_stats.all,
499
489
  "retries" => @retry_stats.all,
@@ -520,7 +510,6 @@ module RightScale
520
510
  @offline_stats = RightSupport::Stats::Activity.new(measure_rate = false)
521
511
  @request_kind_stats = RightSupport::Stats::Activity.new(measure_rate = false)
522
512
  @send_failure_stats = RightSupport::Stats::Activity.new
523
- @exception_stats = RightSupport::Stats::Exceptions.new(@agent, @options[:exception_callback])
524
513
  true
525
514
  end
526
515
 
@@ -614,9 +603,8 @@ module RightScale
614
603
  EM_S.next_tick do
615
604
  begin
616
605
  http_send_once(kind, target, packet, received_at, &callback)
617
- rescue Exception => e
618
- Log.error("Failed sending or handling response for #{packet.trace} #{packet.type}", e, :trace)
619
- @exception_stats.track("request", e)
606
+ rescue StandardError => e
607
+ ErrorTracker.log(self, "Failed sending or handling response for #{packet.trace} #{packet.type}", e)
620
608
  end
621
609
  end
622
610
  else
@@ -668,8 +656,7 @@ module RightScale
668
656
  result = error_result(e.inspect)
669
657
  else
670
658
  agent_type = AgentIdentity.parse(@identity).agent_type
671
- Log.error("Failed to send #{packet.trace} #{packet.type}", e, :trace)
672
- @exception_stats.track("request", e)
659
+ ErrorTracker.log(self, "Failed to send #{packet.trace} #{packet.type}", e)
673
660
  result = error_result("#{agent_type.capitalize} agent internal error")
674
661
  end
675
662
  end
@@ -739,21 +726,17 @@ module RightScale
739
726
  # TemporarilyOffline:: If cannot send request because RightNet client currently disconnected
740
727
  # and offline queueing is disabled
741
728
  def amqp_send_once(packet, ids = nil)
742
- name =
743
729
  exchange = {:type => :fanout, :name => @request_queue, :options => {:durable => true, :no_declare => @secure}}
744
730
  @agent.client.publish(exchange, packet, :persistent => packet.persistent, :mandatory => true,
745
731
  :log_filter => [:tags, :target, :tries, :persistent], :brokers => ids)
746
732
  rescue RightAMQP::HABrokerClient::NoConnectedBrokers => e
747
- msg = "Failed to publish request #{packet.trace} #{packet.type}"
748
- Log.error(msg, e)
733
+ ErrorTracker.log(self, error = "Failed to publish request #{packet.trace} #{packet.type}", e, packet)
749
734
  @send_failure_stats.update("NoConnectedBrokers")
750
- raise TemporarilyOffline.new(msg + " (#{e.class}: #{e.message})")
751
- rescue Exception => e
752
- msg = "Failed to publish request #{packet.trace} #{packet.type}"
753
- Log.error(msg, e, :trace)
735
+ raise TemporarilyOffline.new(error + " (#{e.class}: #{e.message})")
736
+ rescue StandardError => e
737
+ ErrorTracker.log(self, error = "Failed to publish request #{packet.trace} #{packet.type}", e, packet)
754
738
  @send_failure_stats.update(e.class.name)
755
- @exception_stats.track("publish", e, packet)
756
- raise SendFailure.new(msg + " (#{e.class}: #{e.message})")
739
+ raise SendFailure.new(error + " (#{e.class}: #{e.message})")
757
740
  end
758
741
 
759
742
  # Send request via AMQP with one or more retries if do not receive a response in time
@@ -796,20 +779,18 @@ module RightScale
796
779
  else
797
780
  Log.warning("RE-SEND TIMEOUT after #{elapsed.to_i} seconds for #{packet.trace} #{packet.type}")
798
781
  result = OperationResult.non_delivery(OperationResult::RETRY_TIMEOUT)
799
- @non_delivery_stats.update(result.content)
800
782
  handle_response(Result.new(packet.token, @identity, result, @identity))
801
783
  end
802
784
  @connectivity_checker.check(check_broker_ids.first) if check_broker_ids.any? && count == 1
803
785
  end
804
786
  rescue TemporarilyOffline => e
805
- Log.error("Failed retry for #{packet.trace} #{packet.type} because temporarily offline")
787
+ ErrorTracker.log(self, "Failed retry for #{packet.trace} #{packet.type} because temporarily offline")
806
788
  rescue SendFailure => e
807
- Log.error("Failed retry for #{packet.trace} #{packet.type} because of send failure")
789
+ ErrorTracker.log(self, "Failed retry for #{packet.trace} #{packet.type} because of send failure")
808
790
  rescue Exception => e
809
791
  # Not sending a response here because something more basic is broken in the retry
810
792
  # mechanism and don't want an error response to preempt a delayed actual response
811
- Log.error("Failed retry for #{packet.trace} #{packet.type} without responding", e, :trace)
812
- @exception_stats.track("retry", e, packet)
793
+ ErrorTracker.log(self, "Failed retry for #{packet.trace} #{packet.type} without responding", e, packet)
813
794
  end
814
795
  end
815
796
  end
@@ -28,9 +28,9 @@ module RightScale
28
28
 
29
29
  include ProtocolVersionMixin
30
30
 
31
- class MissingPrivateKey < Exception; end
32
- class MissingCertificate < Exception; end
33
- class InvalidSignature < Exception; end
31
+ class MissingPrivateKey < StandardError; end
32
+ class MissingCertificate < StandardError; end
33
+ class InvalidSignature < StandardError; end
34
34
 
35
35
  # Create the one and only SecureSerializer
36
36
  def self.init(serializer, identity, store, encrypt = true)
@@ -87,9 +87,6 @@ module RightScale
87
87
  #
88
88
  # === Return
89
89
  # (String):: MessagePack serialized and optionally encrypted object
90
- #
91
- # === Raise
92
- # Exception:: If certificate identity, certificate store, certificate, or private key missing
93
90
  def dump(obj, encrypt = nil)
94
91
  must_encrypt = encrypt || @encrypt
95
92
  serialize_format = if obj.respond_to?(:send_version) && can_handle_msgpack_result?(obj.send_version)
@@ -105,7 +102,7 @@ module RightScale
105
102
  msg = EncryptedDocument.new(msg, certs).encrypted_data(encode_format)
106
103
  else
107
104
  target = obj.target_for_encryption if obj.respond_to?(:target_for_encryption)
108
- Log.error("No certs available for object #{obj.class} being sent to #{target.inspect}\n") if target
105
+ ErrorTracker.log(self, "No certs available for object #{obj.class} being sent to #{target.inspect}") if target
109
106
  end
110
107
  end
111
108
  sig = Signature.new(msg, @cert, @key).data(encode_format)
@@ -124,8 +121,8 @@ module RightScale
124
121
  # (Object):: Unserialized object
125
122
  #
126
123
  # === Raise
127
- # Exception:: If certificate store, certificate, or private key missing
128
- # MissingCertificate:: If could not find certificate for message signer
124
+ # MissingCertificate:: If could not find certificate for message signer or receiver
125
+ # MissingPrivateKey:: If could not find private key for message receiver
129
126
  # InvalidSignature:: If message signature check failed for message
130
127
  def load(msg, id = nil)
131
128
  msg = @serializer.load(msg)
@@ -140,15 +140,19 @@ module RightScale
140
140
  #
141
141
  # === Raises
142
142
  # SerializationError:: If none of the serializers can perform the requested action
143
+ # RightScale::Exceptions::ConnectivityFailure:: If cannot access external services
143
144
  def cascade_serializers(action, packet, serializers, id = nil)
144
145
  errors = []
145
146
  serializers.map do |serializer|
146
147
  obj = nil
147
148
  begin
148
- obj = serializer == SecureSerializer ? serializer.send(action, packet, id) : serializer.send(action, packet)
149
- rescue SecureSerializer::MissingCertificate, SecureSerializer::InvalidSignature => e
149
+ obj = serializer == SecureSerializer ? serializer.send(action, packet, id) : serializer.send(action, packet)
150
+ rescue RightSupport::Net::NoResult, SocketError => e
151
+ raise Exceptions::ConnectivityFailure.new("Failed to #{action} with #{serializer.name} due to external " +
152
+ "service access failures (#{e.class.name}: #{e.message})", e)
153
+ rescue SecureSerializer::MissingCertificate, SecureSerializer::MissingPrivateKey, SecureSerializer::InvalidSignature => e
150
154
  errors << Log.format("Failed to #{action} with #{serializer.name}", e)
151
- rescue Exception => e
155
+ rescue StandardError => e
152
156
  errors << Log.format("Failed to #{action} with #{serializer.name}", e, :trace)
153
157
  end
154
158
  return obj if obj
@@ -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.2.1'
29
- spec.date = '2014-05-07'
28
+ spec.version = '2.4.3'
29
+ spec.date = '2014-10-02'
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'
@@ -39,9 +39,9 @@ Gem::Specification.new do |spec|
39
39
  spec.require_path = 'lib'
40
40
 
41
41
  spec.add_dependency('right_support', ['>= 2.4.1', '< 3.0'])
42
- spec.add_dependency('right_amqp', '~> 0.7')
43
- spec.add_dependency('rest-client', '1.7.0.1')
44
- spec.add_dependency('faye-websocket', '0.7.0')
42
+ spec.add_dependency('right_amqp', '~> 0.8')
43
+ spec.add_dependency('rest-client', '~> 1.7.0.3')
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')
47
47