diameter 0.2.0pre1 → 0.2.0pre2

Sign up to get free protection for your applications and to get access to all the features.
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