legionio 1.7.8 → 1.7.13

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.
@@ -48,7 +48,7 @@ module Legion
48
48
  end
49
49
  end
50
50
 
51
- def auto_create_exchange(exchange, default_exchange = false) # rubocop:disable Style/OptionalBooleanParameter
51
+ def auto_create_exchange(exchange, default_exchange: false)
52
52
  if Object.const_defined? exchange
53
53
  log.warn "#{exchange} is already defined"
54
54
  return
@@ -107,7 +107,7 @@ module Legion
107
107
  end
108
108
 
109
109
  def auto_generate_runner_messages(runner_info, messages_mod, ext_amqp)
110
- runner_name = runner_info[:runner_name]
110
+ runner_name = runner_info[:runner_name]
111
111
  runner_module = runner_info[:runner_module]
112
112
  return if runner_module.nil?
113
113
  return unless runner_module.respond_to?(:definition_for)
@@ -137,10 +137,17 @@ module Legion
137
137
  binding[:to] = nil unless binding.key?(:to)
138
138
  binding[:from] = default_exchange if !binding.key?(:from) || binding[:from].nil?
139
139
  bind_e_to_q(**binding)
140
+ rescue StandardError => e
141
+ log.warn '[transport] failed to build exchange-to-queue binding ' \
142
+ "from=#{binding[:from].inspect} to=#{binding[:to].inspect} " \
143
+ "routing_key=#{binding[:routing_key].inspect} binding=#{binding.inspect}"
144
+ handle_exception(e, handled: false, level: :warn)
145
+ raise e
140
146
  end
141
147
  end
142
148
 
143
149
  def bind_e_to_q(to:, from: default_exchange, routing_key: nil, **)
150
+ log.debug "[transport] building auto binding exchange: #{from}, routing_key: #{routing_key}, to: #{to}"
144
151
  if from.is_a? String
145
152
  from = "#{transport_class}::Exchanges::#{from.tr('.', '_').split('_').collect(&:capitalize).join}" unless from.include?('::')
146
153
  auto_create_exchange(from) unless Object.const_defined? from
@@ -153,6 +160,9 @@ module Legion
153
160
 
154
161
  routing_key = to.to_s.split('::').last.downcase if routing_key.nil?
155
162
  bind(from, to, routing_key: routing_key)
163
+ rescue StandardError => e
164
+ handle_exception(e, handled: false, level: :warn, from: from, to: to, routing_key: routing_key)
165
+ raise e
156
166
  end
157
167
 
158
168
  def build_e_to_e
@@ -168,6 +178,9 @@ module Legion
168
178
  end
169
179
 
170
180
  bind(binding[:from], binding[:to], binding)
181
+ rescue StandardError => e
182
+ handle_exception(e, handled: false, level: :warn)
183
+ raise e
171
184
  end
172
185
  end
173
186
 
data/lib/legion/region.rb CHANGED
@@ -4,16 +4,42 @@ require 'net/http'
4
4
 
5
5
  module Legion
6
6
  module Region
7
+ include Legion::Logging::Helper if defined?(Legion::Logging::Helper)
8
+
7
9
  module_function
8
10
 
11
+ UNSET = Object.new.freeze
12
+ EXPECTED_METADATA_ERRORS = [
13
+ Net::OpenTimeout,
14
+ Net::ReadTimeout,
15
+ Errno::EHOSTUNREACH,
16
+ Errno::ECONNREFUSED,
17
+ Errno::ENETUNREACH,
18
+ IOError,
19
+ SocketError
20
+ ].freeze
21
+
9
22
  def current
10
23
  setting = defined?(Legion::Settings) ? Legion::Settings.dig(:region, :current) : nil
11
- setting || detect_from_metadata
24
+ return setting unless blank_region?(setting)
25
+
26
+ @detected_region = UNSET unless instance_variable_defined?(:@detected_region)
27
+ return nil if @detected_region.equal?(UNSET) && @metadata_detection_complete == true
28
+ return @detected_region unless @detected_region.equal?(UNSET)
29
+
30
+ @detected_region = detect_from_metadata
31
+ @metadata_detection_complete = true
32
+ @detected_region
12
33
  rescue StandardError => e
13
34
  Legion::Logging.debug "Region#current failed: #{e.message}" if defined?(Legion::Logging)
14
35
  nil
15
36
  end
16
37
 
38
+ def reset!
39
+ remove_instance_variable(:@detected_region) if instance_variable_defined?(:@detected_region)
40
+ remove_instance_variable(:@metadata_detection_complete) if instance_variable_defined?(:@metadata_detection_complete)
41
+ end
42
+
17
43
  def local?(target_region)
18
44
  target_region.nil? || target_region == current
19
45
  end
@@ -76,6 +102,8 @@ module Legion
76
102
  response = http.request(req)
77
103
  response.is_a?(Net::HTTPSuccess) ? response.body.strip : nil
78
104
  end
105
+ rescue *EXPECTED_METADATA_ERRORS
106
+ nil
79
107
  rescue StandardError => e
80
108
  Legion::Logging.debug "Region#detect_aws_region failed: #{e.message}" if defined?(Legion::Logging)
81
109
  nil
@@ -90,9 +118,16 @@ module Legion
90
118
  response = http.request(req)
91
119
  response.is_a?(Net::HTTPSuccess) ? response.body.strip : nil
92
120
  end
121
+ rescue *EXPECTED_METADATA_ERRORS
122
+ nil
93
123
  rescue StandardError => e
94
124
  Legion::Logging.debug "Region#detect_azure_region failed: #{e.message}" if defined?(Legion::Logging)
95
125
  nil
96
126
  end
127
+
128
+ def blank_region?(value)
129
+ value.nil? || (value.respond_to?(:empty?) && value.empty?)
130
+ end
131
+ private_class_method :blank_region?
97
132
  end
98
133
  end