diameter 0.2.0pre1 → 0.2.0pre2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6abc6042bb8a5998edf863242bf158597742cd34
4
- data.tar.gz: 98272882c82f789b0a3ae62c5e4e6ebe05516490
3
+ metadata.gz: 5f3f9bf79194a1bf46cdeb9f5554f4d6b1e12969
4
+ data.tar.gz: a652abd1f5e36bb61de18851e17fc097fab8c806
5
5
  SHA512:
6
- metadata.gz: 223aa9169ba4cf1d6bfb0512c86ce33e4dbf4926d1d3227a29fc01bca1e920d1efd832808482cdff995174a84ad2e3228a1e3169b8a6a87836a03a949c37cb2f
7
- data.tar.gz: 01eae609616ab4ade22e09f63053d396ba3fc7c3d1c1d680fc098b6475865b6a3c42c6465d0fe3487ab0c250526acf41743f0c2655d62e7895627c618d9a7ada
6
+ metadata.gz: 9ba23cea6ecdb922d02f9d2bd0589054e4e098fe3b522442835f36deb59649f83baa56ab84592c5fb2ae053bd0408838eebc732de2d6f1c73501ef12436780f5
7
+ data.tar.gz: 1cd7b01d9b41dff2608da114711b83cad13b9fd196eff9bbc8b6eddff325bff9d3515674ed7be0157e29a591faa7c9b56b700ad320e3d1444305b9f89b8d2c20
@@ -8,6 +8,21 @@ require 'concurrent'
8
8
  require 'dnsruby'
9
9
 
10
10
  module Diameter
11
+ class Realm
12
+ def initialize(peer_name)
13
+ @peers = []
14
+ add_peer(peer_name)
15
+ end
16
+
17
+ def add_peer(name)
18
+ @peers << name
19
+ end
20
+
21
+ def best_peer
22
+ @peers[0]
23
+ end
24
+ end
25
+
11
26
  class Stack
12
27
  include Internals
13
28
 
@@ -36,6 +51,7 @@ module Diameter
36
51
 
37
52
  @tcp_helper = TCPStackHelper.new(self)
38
53
  @peer_table = {}
54
+ @realm_table = {}
39
55
  @handlers = {}
40
56
 
41
57
  @answer_timeout = opts.fetch(:timeout, 60)
@@ -127,6 +143,11 @@ module Diameter
127
143
 
128
144
  # @!group Peer connections and message sending
129
145
 
146
+ # Looks up the given Diameter realm with DNS-SRV, and establishes
147
+ # a connection to one peer in that realm.
148
+ #
149
+ # @param realm [String] The Diameter realm to connect to.
150
+ # @return [Peer] The Diameter peer chosen.
130
151
  def connect_to_realm(realm)
131
152
  possible_peers = []
132
153
  @res.query("_diameter._tcp.#{realm}", "SRV").each_answer do |a|
@@ -152,6 +173,7 @@ module Diameter
152
173
  # @param peer_host [String] The DiameterIdentity of this peer, which
153
174
  # will uniquely identify it in the peer table.
154
175
  # @param realm [String] The Diameter realm of this peer.
176
+ # @return [Peer] The Diameter peer chosen.
155
177
  def connect_to_peer(peer_uri, peer_host, realm)
156
178
  uri = URI(peer_uri)
157
179
  cxn = @tcp_helper.setup_new_connection(uri.host, uri.port)
@@ -164,15 +186,20 @@ module Diameter
164
186
  avps += app_avps
165
187
  cer_bytes = Message.new(version: 1, command_code: 257, app_id: 0, request: true, proxyable: false, retransmitted: false, error: false, avps: avps).to_wire
166
188
  @tcp_helper.send(cer_bytes, cxn)
189
+
190
+ @realm_table[realm] = Realm.new(peer_host)
191
+
167
192
  @peer_table[peer_host] = Peer.new(peer_host)
168
193
  @peer_table[peer_host].state = :WAITING
194
+ # Will move to :UP when the CEA is received
169
195
  @peer_table[peer_host].cxn = cxn
196
+
170
197
  @peer_table[peer_host]
171
- # Will move to :UP when the CEA is received
172
198
  end
173
199
 
174
200
  # Sends a Diameter request. This is routed to an appropriate peer
175
- # based on the Destination-Host AVP.
201
+ # based on the Destination-Host AVP (or, if that is absent, on the
202
+ # Destination-Realm AVP).
176
203
  #
177
204
  # This adds this stack's Origin-Host and Origin-Realm AVPs, if
178
205
  # those AVPs don't already exist.
@@ -180,8 +207,19 @@ module Diameter
180
207
  # @param req [Message] The request to send.
181
208
  def send_request(req)
182
209
  fail "Must pass a request" unless req.request
183
- req.add_origin_host_and_realm(@local_host, @local_realm)
184
- peer_name = req.avp_by_name('Destination-Host').octet_string
210
+ req.add_origin_host_and_realm(@local_host, @local_realm)
211
+ peer_name = if req['Destination-Host']
212
+ req['Destination-Host'].octet_string
213
+ elsif req['Destination-Realm']
214
+ realm = req['Destination-Realm'].octet_string
215
+ if @realm_table.has_key? realm
216
+ @realm_table[realm].best_peer
217
+ else
218
+ fail "No connection to realm #{realm}"
219
+ end
220
+ else
221
+ fail "Request must have Destination-Host or Destination-Realm"
222
+ end
185
223
  state = peer_state(peer_name)
186
224
  if state == :UP
187
225
  peer = @peer_table[peer_name]
@@ -190,13 +228,17 @@ module Diameter
190
228
  @pending_ete[req.ete] = q
191
229
 
192
230
  # Time this request out if no answer is received
231
+ Diameter.logger.debug("Scheduling timeout for #{@answer_timeout}s time")
232
+ =begin
193
233
  Concurrent::timer(@answer_timeout) do
234
+ Diameter.logger.debug("Timing out message with EtE #{req.ete}")
194
235
  q = @pending_ete.delete(req.ete)
195
236
  if q
196
237
  q.push(:timeout)
197
238
  end
198
239
  end
199
-
240
+ =end
241
+
200
242
  p = Concurrent::Promise.execute(executor: @threadpool) {
201
243
  Diameter.logger.debug("Waiting for answer to message with EtE #{req.ete}, queue #{q}")
202
244
  val = q.pop
@@ -48,7 +48,9 @@ module Diameter
48
48
  rs, _ws, es = IO.select(@all_connections + [@wakeup_pipe_rd], [], @all_connections)
49
49
 
50
50
  es.each do |e|
51
+ # :nocov:
51
52
  Diameter.logger.log(Logger::WARN, "Exception on connection #{e}")
53
+ # :nocov:
52
54
  end
53
55
 
54
56
  rs.each do |r|
@@ -134,7 +136,9 @@ module Diameter
134
136
  def accept_loop
135
137
  rs, _ws, es = IO.select(@listen_connections, [], @listen_connections)
136
138
  es.each do |e|
139
+ # :nocov:
137
140
  Diameter.logger.log(Logger::WARN, "Exception on connection #{e}")
141
+ # :nocov:
138
142
  end
139
143
 
140
144
  rs.each do |r|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diameter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0pre1
4
+ version: 0.2.0pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Day