alchemy-flux 0.1.2 → 1.0.0
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 +4 -4
- data/lib/alchemy-flux.rb +113 -44
- data/lib/alchemy-flux/flux_rack_handler.rb +1 -0
- data/spec/performance_spec.rb +2 -2
- data/spec/rack_handler_spec.rb +3 -3
- data/spec/resources_spec.rb +35 -6
- data/spec/service_spec.rb +27 -24
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79536f814a7c62f09925bf33d0ba8f5faaff4d72
|
4
|
+
data.tar.gz: c165d0e7b4023b3199bac181896c0b796a5e7fa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a55a9a147d17e23b32db10217a94816aada57385c0d86ebc02c70cf42d87f466726593e4919585669289401ffc92ffa2093e0748023b8621b989bedd9af68f7f
|
7
|
+
data.tar.gz: 628d1735463517bcb0f112c695e7461af86d95e6d152e5fd79c3f9b0b69cd8d1e06c674fc48e40ef0040fe17424e6c8f7623e8f20b0e4f9ffb3db0ab59c0a8cf
|
data/lib/alchemy-flux.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'time'
|
2
2
|
require 'amqp'
|
3
3
|
require "uuidtools"
|
4
|
-
require '
|
4
|
+
require 'json'
|
5
5
|
|
6
6
|
require 'alchemy-flux/flux_rack_handler.rb'
|
7
7
|
|
@@ -140,25 +140,25 @@ module AlchemyFlux
|
|
140
140
|
|
141
141
|
@service_queue = @channel.queue( @service_queue_name, {:durable => true})
|
142
142
|
@service_queue.subscribe({:ack => true}) do |metadata, payload|
|
143
|
-
payload =
|
143
|
+
payload = JSON.parse(payload)
|
144
144
|
process_service_queue_message(metadata, payload)
|
145
145
|
end
|
146
146
|
|
147
147
|
response_queue = @channel.queue(@response_queue_name, {:exclusive => true, :auto_delete => true})
|
148
148
|
response_queue.subscribe({}) do |metadata, payload|
|
149
|
-
payload =
|
149
|
+
payload = JSON.parse(payload)
|
150
150
|
process_response_queue_message(metadata, payload)
|
151
151
|
end
|
152
152
|
|
153
153
|
@channel.default_exchange.on_return do |basic_return, frame, payload|
|
154
|
-
payload =
|
154
|
+
payload = JSON.parse(payload)
|
155
155
|
process_returned_message(basic_return, frame.properties, payload)
|
156
156
|
end
|
157
157
|
|
158
158
|
# RESOURCES HANDLE
|
159
159
|
@resources_exchange = @channel.topic("resources.exchange", {:durable => true})
|
160
160
|
@resources_exchange.on_return do |basic_return, frame, payload|
|
161
|
-
payload =
|
161
|
+
payload = JSON.parse(payload)
|
162
162
|
process_returned_message(basic_return, frame.properties, payload)
|
163
163
|
end
|
164
164
|
|
@@ -229,7 +229,6 @@ module AlchemyFlux
|
|
229
229
|
rescue Exception => e
|
230
230
|
puts "Service Fn Error " + e.inspect
|
231
231
|
|
232
|
-
# Returning Hoodoo formatted Error code (just in case service doesnt handle the error, it should!)
|
233
232
|
{
|
234
233
|
'status_code' => 500,
|
235
234
|
'headers' => {'Content-Type' => 'application/json; charset=utf-8'},
|
@@ -237,7 +236,11 @@ module AlchemyFlux
|
|
237
236
|
'kind' => "Errors",
|
238
237
|
'id' => AlchemyFlux::Service.generateUUID(),
|
239
238
|
'created_at' => Time.now.utc.iso8601,
|
240
|
-
'errors' => [{
|
239
|
+
'errors' => [{
|
240
|
+
'code' => 'alchemy-flux.error',
|
241
|
+
'message' => 'An unexpected error occurred',
|
242
|
+
'message_id' => message_replying_to
|
243
|
+
}]
|
241
244
|
}
|
242
245
|
}
|
243
246
|
end
|
@@ -248,12 +251,16 @@ module AlchemyFlux
|
|
248
251
|
if result == AlchemyFlux::NAckError
|
249
252
|
@service_queue.reject(delivery_tag)
|
250
253
|
else
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
254
|
+
#if there is a service to reply to then reply, else ignore
|
255
|
+
|
256
|
+
if service_to_reply_to
|
257
|
+
send_message(@channel.default_exchange, service_to_reply_to, result, {
|
258
|
+
:message_id => this_message_id,
|
259
|
+
:correlation_id => message_replying_to,
|
260
|
+
:type => 'http_response'
|
261
|
+
})
|
262
|
+
end
|
263
|
+
|
257
264
|
@processing_messages -= 1
|
258
265
|
@service_queue.acknowledge(delivery_tag)
|
259
266
|
end
|
@@ -294,7 +301,7 @@ module AlchemyFlux
|
|
294
301
|
# *options*:: The message options
|
295
302
|
def send_message(exchange, routing_key, message, options)
|
296
303
|
message_options = options.merge({:routing_key => routing_key})
|
297
|
-
message =
|
304
|
+
message = message.to_json
|
298
305
|
EventMachine.next_tick do
|
299
306
|
exchange.publish message, message_options
|
300
307
|
end
|
@@ -302,44 +309,51 @@ module AlchemyFlux
|
|
302
309
|
|
303
310
|
public
|
304
311
|
|
305
|
-
# send a message to
|
312
|
+
# send a message to a service, this does not wait for a response
|
306
313
|
#
|
307
|
-
# *
|
314
|
+
# *service_name*:: The name of the service
|
308
315
|
# *message*:: The message to be sent
|
309
|
-
|
310
|
-
|
311
|
-
send_message( @channel.default_exchange, routing_key, message, {type: 'ignore'} )
|
316
|
+
def send_message_to_service(service_name, message)
|
317
|
+
send_HTTP_message(@channel.default_exchange, service_name, message)
|
312
318
|
end
|
313
319
|
|
314
|
-
# send a message to a
|
320
|
+
# send a message to a resource, this does not wait for a response
|
321
|
+
#
|
322
|
+
# *message*:: HTTP formatted message to be sent, must contain `'path'` key with URL path
|
323
|
+
def send_message_to_resource(message)
|
324
|
+
routing_key = path_to_routing_key(message['path'])
|
325
|
+
send_HTTP_message(@resources_exchange, routing_key, message)
|
326
|
+
end
|
327
|
+
|
328
|
+
# send a request to a service, this will wait for a response
|
315
329
|
#
|
316
330
|
# *service_name*:: the name of the service
|
317
331
|
# *message*:: the message to be sent
|
318
332
|
#
|
319
333
|
# This method can optionally take a block which will be executed asynchronously and yielded the response
|
320
|
-
def
|
334
|
+
def send_request_to_service(service_name, message)
|
321
335
|
if block_given?
|
322
336
|
EventMachine.defer do
|
323
|
-
yield
|
337
|
+
yield send_request_to_service(service_name, message)
|
324
338
|
end
|
325
339
|
else
|
326
|
-
|
340
|
+
send_HTTP_request(@channel.default_exchange, service_name, message)
|
327
341
|
end
|
328
342
|
end
|
329
343
|
|
330
344
|
# send a message to a resource
|
331
345
|
#
|
332
|
-
# *
|
346
|
+
# *message*:: HTTP formatted message to be sent, must contain `'path'` key with URL path
|
333
347
|
#
|
334
348
|
# This method can optionally take a block which will be executed asynchronously and yielded the response
|
335
|
-
def
|
336
|
-
routing_key = path_to_routing_key(
|
349
|
+
def send_request_to_resource(message)
|
350
|
+
routing_key = path_to_routing_key(message['path'])
|
337
351
|
if block_given?
|
338
352
|
EventMachine.defer do
|
339
|
-
yield
|
353
|
+
yield send_request_to_resource(message)
|
340
354
|
end
|
341
355
|
else
|
342
|
-
|
356
|
+
send_HTTP_request(@resources_exchange, routing_key, message)
|
343
357
|
end
|
344
358
|
end
|
345
359
|
|
@@ -363,35 +377,90 @@ module AlchemyFlux
|
|
363
377
|
new_path
|
364
378
|
end
|
365
379
|
|
380
|
+
# format the HTTP message
|
381
|
+
#
|
382
|
+
# The entire body is a JSON string with the keys:
|
383
|
+
#
|
384
|
+
# Request Information:
|
385
|
+
#
|
386
|
+
# 1. *body*: A string of body information
|
387
|
+
# 2. *verb*: The HTTP verb for the query, e.g. GET
|
388
|
+
# 3. *headers*: an object with headers in is, e.g. {"X-HEADER-KEY": "value"}
|
389
|
+
# 4. *path*: the path of the request, e.g. "/v1/users/1337"
|
390
|
+
# 5. *query*: an object with keys for query, e.g. {'search': 'flux'}
|
391
|
+
#
|
392
|
+
# Call information:
|
393
|
+
#
|
394
|
+
# 1. *scheme*: the scheme used for the call
|
395
|
+
# 2. *host*: the host called to make the call
|
396
|
+
# 3. *port*: the port the call was made on
|
397
|
+
#
|
398
|
+
# Authentication information:
|
399
|
+
#
|
400
|
+
# 1. *session*: undefined structure that can be passed in the message
|
401
|
+
# so that a service does not need to re-authenticate with each message
|
402
|
+
#
|
403
|
+
def format_HTTP_message(message)
|
404
|
+
message = {
|
405
|
+
# Request Parameters
|
406
|
+
'body' => message['body'] || "",
|
407
|
+
'verb' => message['verb'] || "GET",
|
408
|
+
'headers' => message['headers'] || {},
|
409
|
+
'path' => message['path'] || "/",
|
410
|
+
'query' => message['query'] || {},
|
411
|
+
|
412
|
+
# Location
|
413
|
+
'scheme' => message['protocol'] || 'http',
|
414
|
+
'host' => message['hostname'] || 'localhost',
|
415
|
+
'port' => message['port'] || 8080,
|
416
|
+
|
417
|
+
# Custom Authentication
|
418
|
+
'session' => message['session']
|
419
|
+
}
|
420
|
+
|
421
|
+
message
|
422
|
+
end
|
423
|
+
|
366
424
|
# send a HTTP message to an exchange with routing key
|
367
425
|
#
|
368
426
|
# *exchange*:: A AMQP exchange
|
369
427
|
# *routing_key*:: The routing key to use
|
370
428
|
# *message*:: The message to be sent
|
371
|
-
def
|
429
|
+
def send_HTTP_message(exchange, routing_key, message)
|
430
|
+
http_message = format_HTTP_message(message)
|
372
431
|
|
373
|
-
|
374
|
-
|
375
|
-
'
|
376
|
-
'
|
377
|
-
'
|
378
|
-
|
379
|
-
|
380
|
-
'verb' => message['verb'] || "GET",
|
381
|
-
'headers' => message['headers'] || {},
|
382
|
-
'body' => message['body'] || ""
|
432
|
+
http_message_options = {
|
433
|
+
message_id: AlchemyFlux::Service.generateUUID(),
|
434
|
+
type: 'http',
|
435
|
+
content_encoding: '8bit',
|
436
|
+
content_type: 'application/json',
|
437
|
+
expiration: @options[:timeout],
|
438
|
+
mandatory: true
|
383
439
|
}
|
384
440
|
|
441
|
+
send_message(exchange, routing_key, http_message, http_message_options)
|
442
|
+
end
|
443
|
+
|
444
|
+
|
445
|
+
|
446
|
+
# send a HTTP message to an exchange with routing key
|
447
|
+
#
|
448
|
+
# *exchange*:: A AMQP exchange
|
449
|
+
# *routing_key*:: The routing key to use
|
450
|
+
# *message*:: The message to be sent
|
451
|
+
def send_HTTP_request(exchange, routing_key, message)
|
452
|
+
http_message = format_HTTP_message(message)
|
453
|
+
|
385
454
|
message_id = AlchemyFlux::Service.generateUUID()
|
386
455
|
|
387
456
|
http_message_options = {
|
388
457
|
message_id: message_id,
|
389
|
-
type: '
|
458
|
+
type: 'http',
|
390
459
|
reply_to: @response_queue_name,
|
391
|
-
content_encoding:
|
392
|
-
content_type:
|
393
|
-
expiration:
|
394
|
-
mandatory:
|
460
|
+
content_encoding: '8bit',
|
461
|
+
content_type: 'application/json',
|
462
|
+
expiration: @options[:timeout],
|
463
|
+
mandatory: true
|
395
464
|
}
|
396
465
|
|
397
466
|
response_queue = Queue.new
|
data/spec/performance_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe "performance of AlchemyFlux" do
|
|
22
22
|
responses = Queue.new
|
23
23
|
st = Time.now()
|
24
24
|
(1..calls).each do
|
25
|
-
service_b.
|
25
|
+
service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}}) do |response|
|
26
26
|
responses << response
|
27
27
|
end
|
28
28
|
end
|
@@ -51,7 +51,7 @@ describe "performance of AlchemyFlux" do
|
|
51
51
|
|
52
52
|
st = Time.now()
|
53
53
|
(1..calls).each do
|
54
|
-
resp = service_b.
|
54
|
+
resp = service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}})
|
55
55
|
expect(resp['body']).to eq "hola Bob"
|
56
56
|
end
|
57
57
|
|
data/spec/rack_handler_spec.rb
CHANGED
@@ -19,7 +19,7 @@ describe Rack::Handler::AlchemyFlux do
|
|
19
19
|
Rack::Handler::AlchemyFlux.start app
|
20
20
|
service_a.start
|
21
21
|
sleep(0.5)
|
22
|
-
response = service_a.
|
22
|
+
response = service_a.send_request_to_service("rack.service", {})
|
23
23
|
expect(response['body']).to eq "hi Bob"
|
24
24
|
service_a.stop
|
25
25
|
Rack::Handler::AlchemyFlux.stop
|
@@ -38,10 +38,10 @@ describe Rack::Handler::AlchemyFlux do
|
|
38
38
|
service_a.start
|
39
39
|
sleep(0.5)
|
40
40
|
|
41
|
-
response = service_a.
|
41
|
+
response = service_a.send_request_to_resource({'path' => '/alice'})
|
42
42
|
expect(response['body']).to eq "hi /alice"
|
43
43
|
|
44
|
-
response = service_a.
|
44
|
+
response = service_a.send_request_to_resource({'path' => '/bob'})
|
45
45
|
expect(response['body']).to eq "hi /bob"
|
46
46
|
|
47
47
|
service_a.stop
|
data/spec/resources_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe AlchemyFlux::Service do
|
|
7
7
|
AlchemyFlux::Service.stop
|
8
8
|
end
|
9
9
|
|
10
|
-
describe "#
|
10
|
+
describe "#send_request_to_resource" do
|
11
11
|
|
12
12
|
it 'should be able to send messages to resource via path' do
|
13
13
|
resource_path = "/v1/fluxy_#{AlchemyFlux::Service.generateUUID()}"
|
@@ -22,10 +22,10 @@ describe AlchemyFlux::Service do
|
|
22
22
|
|
23
23
|
sleep(1)
|
24
24
|
|
25
|
-
response = service_b.
|
25
|
+
response = service_b.send_request_to_resource({'path' => resource_path, 'body' => {'name' => "Bob"}})
|
26
26
|
expect(response['body']).to eq "hi Bob"
|
27
27
|
|
28
|
-
response = service_b.
|
28
|
+
response = service_b.send_request_to_resource({'path' => "#{resource_path}/id", 'body' => {'name' => "Alice"}})
|
29
29
|
expect(response['body']).to eq "hi Alice"
|
30
30
|
|
31
31
|
service_a.stop
|
@@ -46,10 +46,10 @@ describe AlchemyFlux::Service do
|
|
46
46
|
|
47
47
|
sleep(1)
|
48
48
|
|
49
|
-
response = service_b.
|
49
|
+
response = service_b.send_request_to_resource({'path' => resource_path1, 'body' => {'name' => "Bob"}})
|
50
50
|
expect(response['body']).to eq "hi Bob"
|
51
51
|
|
52
|
-
response = service_b.
|
52
|
+
response = service_b.send_request_to_resource({'path' => resource_path2, 'body' => {'name' => "Alice"}})
|
53
53
|
expect(response['body']).to eq "hi Alice"
|
54
54
|
service_a.stop
|
55
55
|
service_b.stop
|
@@ -62,7 +62,7 @@ describe AlchemyFlux::Service do
|
|
62
62
|
|
63
63
|
service_b.start
|
64
64
|
|
65
|
-
expect(service_b.
|
65
|
+
expect(service_b.send_request_to_resource({'path' => '/v1/unregistered_resource'})).to eq AlchemyFlux::MessageNotDeliveredError
|
66
66
|
expect(service_b.transactions.length).to eq 0
|
67
67
|
|
68
68
|
service_b.stop
|
@@ -70,4 +70,33 @@ describe AlchemyFlux::Service do
|
|
70
70
|
|
71
71
|
end
|
72
72
|
end
|
73
|
+
|
74
|
+
describe "#send_message_to_resource" do
|
75
|
+
it 'should be able to send messages to resource via path' do
|
76
|
+
resource_path = "/v1/fluxy_#{AlchemyFlux::Service.generateUUID()}"
|
77
|
+
recieved_count = 0
|
78
|
+
service_a = AlchemyFlux::Service.new("fluxa.send_service", resource_paths: [resource_path]) do |message|
|
79
|
+
recieved_count += 1
|
80
|
+
{}
|
81
|
+
end
|
82
|
+
|
83
|
+
service_b = AlchemyFlux::Service.new("fluxb.send_service")
|
84
|
+
|
85
|
+
service_a.start
|
86
|
+
service_b.start
|
87
|
+
|
88
|
+
sleep(1)
|
89
|
+
expect(recieved_count).to be 0
|
90
|
+
response = service_b.send_request_to_resource({'path' => resource_path, 'body' => {'name' => "Bob"}})
|
91
|
+
sleep(0.1)
|
92
|
+
expect(recieved_count).to be 1
|
93
|
+
response = service_b.send_request_to_resource({'path' => "#{resource_path}/id", 'body' => {'name' => "Alice"}})
|
94
|
+
sleep(0.1)
|
95
|
+
expect(recieved_count).to be 2
|
96
|
+
|
97
|
+
service_a.stop
|
98
|
+
service_b.stop
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
73
102
|
end
|
data/spec/service_spec.rb
CHANGED
@@ -92,7 +92,7 @@ describe AlchemyFlux::Service do
|
|
92
92
|
service_b.start
|
93
93
|
|
94
94
|
service_a.stop
|
95
|
-
expect(service_b.
|
95
|
+
expect(service_b.send_request_to_service("fluxa.service", {})).to eq AlchemyFlux::TimeoutError
|
96
96
|
service_b.stop
|
97
97
|
end
|
98
98
|
|
@@ -108,7 +108,7 @@ describe AlchemyFlux::Service do
|
|
108
108
|
service_b.start
|
109
109
|
|
110
110
|
response_queue = Queue.new
|
111
|
-
service_b.
|
111
|
+
service_b.send_request_to_service("fluxa.service", {}) do |response|
|
112
112
|
response_queue << response
|
113
113
|
end
|
114
114
|
sleep(0.05)
|
@@ -132,7 +132,7 @@ describe AlchemyFlux::Service do
|
|
132
132
|
service_b.start
|
133
133
|
|
134
134
|
response_queue = Queue.new
|
135
|
-
service_b.
|
135
|
+
service_b.send_request_to_service("fluxa.service", {}) do |response|
|
136
136
|
response_queue << response
|
137
137
|
end
|
138
138
|
sleep(0.01)
|
@@ -156,13 +156,13 @@ describe AlchemyFlux::Service do
|
|
156
156
|
service_b.start
|
157
157
|
|
158
158
|
response_queue = Queue.new
|
159
|
-
service_b.
|
159
|
+
service_b.send_request_to_service("fluxa.service", {}) do |response|
|
160
160
|
response_queue << response
|
161
161
|
end
|
162
162
|
sleep(0.1)
|
163
163
|
Thread.new do service_a.stop end
|
164
164
|
sleep(0.3)
|
165
|
-
expect(service_b.
|
165
|
+
expect(service_b.send_request_to_service("fluxa.service", {})).to eq AlchemyFlux::TimeoutError
|
166
166
|
|
167
167
|
response = response_queue.pop
|
168
168
|
|
@@ -180,10 +180,10 @@ describe AlchemyFlux::Service do
|
|
180
180
|
service_a.start
|
181
181
|
service_b.start
|
182
182
|
|
183
|
-
response = service_b.
|
183
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}})
|
184
184
|
expect(response['body']).to eq "hi Bob"
|
185
185
|
|
186
|
-
response = service_a.
|
186
|
+
response = service_a.send_request_to_service("fluxb.service", {'body' => {'name' => "Bob"}})
|
187
187
|
expect(response['body']).to be_empty
|
188
188
|
|
189
189
|
|
@@ -192,7 +192,8 @@ describe AlchemyFlux::Service do
|
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
195
|
-
|
195
|
+
|
196
|
+
describe "#send_message_to_service" do
|
196
197
|
it 'should send a message to services' do
|
197
198
|
received = false
|
198
199
|
service_a = AlchemyFlux::Service.new("fluxa.service") do |message|
|
@@ -205,7 +206,7 @@ describe AlchemyFlux::Service do
|
|
205
206
|
service_a.start
|
206
207
|
service_b.start
|
207
208
|
|
208
|
-
|
209
|
+
service_b.send_message_to_service("fluxa.service", {})
|
209
210
|
sleep(0.1)
|
210
211
|
expect(received).to be true
|
211
212
|
service_a.stop
|
@@ -214,7 +215,9 @@ describe AlchemyFlux::Service do
|
|
214
215
|
|
215
216
|
end
|
216
217
|
|
217
|
-
|
218
|
+
|
219
|
+
|
220
|
+
describe "#send_request_to_service" do
|
218
221
|
|
219
222
|
it 'should send and receive messages between services' do
|
220
223
|
service_a = AlchemyFlux::Service.new("fluxa.service") do |message|
|
@@ -226,7 +229,7 @@ describe AlchemyFlux::Service do
|
|
226
229
|
service_a.start
|
227
230
|
service_b.start
|
228
231
|
|
229
|
-
response = service_b.
|
232
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}})
|
230
233
|
expect(response['body']).to eq "hi Bob"
|
231
234
|
service_a.stop
|
232
235
|
service_b.stop
|
@@ -244,7 +247,7 @@ describe AlchemyFlux::Service do
|
|
244
247
|
service_a.start
|
245
248
|
service_b.start
|
246
249
|
|
247
|
-
response = service_b.
|
250
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => '{"name" : "Bob"}'})
|
248
251
|
expect(response['body']).to eq "hi Bob"
|
249
252
|
service_a.stop
|
250
253
|
service_b.stop
|
@@ -264,7 +267,7 @@ describe AlchemyFlux::Service do
|
|
264
267
|
service_a.start
|
265
268
|
service_b.start
|
266
269
|
|
267
|
-
response = service_b.
|
270
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => '{"name" : "Bob"}'})
|
268
271
|
expect(response['body']).to eq "hi Bob"
|
269
272
|
expect(response['headers']["X-header"]).to eq "header1"
|
270
273
|
service_a.stop
|
@@ -285,7 +288,7 @@ describe AlchemyFlux::Service do
|
|
285
288
|
service_a.start
|
286
289
|
service_b.start
|
287
290
|
|
288
|
-
response = service_b.
|
291
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => '{"name" : "Bob"}'})
|
289
292
|
expect(response['body']).to eq "hi Bob"
|
290
293
|
expect(response['status_code']).to eq 201
|
291
294
|
service_a.stop
|
@@ -294,7 +297,7 @@ describe AlchemyFlux::Service do
|
|
294
297
|
|
295
298
|
it 'should be able to send messages within the service call' do
|
296
299
|
service_a = AlchemyFlux::Service.new("fluxa.service") do |message|
|
297
|
-
resp = service_a.
|
300
|
+
resp = service_a.send_request_to_service("fluxb.service", {})
|
298
301
|
{'body' => "hi #{resp['body']}"}
|
299
302
|
end
|
300
303
|
|
@@ -305,7 +308,7 @@ describe AlchemyFlux::Service do
|
|
305
308
|
service_a.start
|
306
309
|
service_b.start
|
307
310
|
|
308
|
-
response = service_b.
|
311
|
+
response = service_b.send_request_to_service("fluxa.service", {})
|
309
312
|
expect(response['body']).to eq "hi Bob"
|
310
313
|
service_a.stop
|
311
314
|
service_b.stop
|
@@ -316,7 +319,7 @@ describe AlchemyFlux::Service do
|
|
316
319
|
service_a = AlchemyFlux::Service.new("fluxa.service") do |message|
|
317
320
|
if first
|
318
321
|
first = !first
|
319
|
-
resp = service_a.
|
322
|
+
resp = service_a.send_request_to_service("fluxa.service", {})
|
320
323
|
{'body' => "hi #{resp['body']}"}
|
321
324
|
else
|
322
325
|
{'body' => 'Bob'}
|
@@ -328,7 +331,7 @@ describe AlchemyFlux::Service do
|
|
328
331
|
service_a.start
|
329
332
|
service_b.start
|
330
333
|
|
331
|
-
response = service_b.
|
334
|
+
response = service_b.send_request_to_service("fluxa.service", {})
|
332
335
|
expect(response['body']).to eq "hi Bob"
|
333
336
|
service_a.stop
|
334
337
|
service_b.stop
|
@@ -351,7 +354,7 @@ describe AlchemyFlux::Service do
|
|
351
354
|
expect(service_a.processing_messages).to eq 0
|
352
355
|
|
353
356
|
response = Queue.new
|
354
|
-
service_b.
|
357
|
+
service_b.send_request_to_service("fluxa.service", {}) do |resp|
|
355
358
|
response << resp
|
356
359
|
end
|
357
360
|
sleep(0.05)
|
@@ -378,7 +381,7 @@ describe AlchemyFlux::Service do
|
|
378
381
|
service_b.start
|
379
382
|
|
380
383
|
block = Queue.new
|
381
|
-
service_b.
|
384
|
+
service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}}) do |response|
|
382
385
|
block << response
|
383
386
|
end
|
384
387
|
|
@@ -404,7 +407,7 @@ describe AlchemyFlux::Service do
|
|
404
407
|
service_b.start
|
405
408
|
|
406
409
|
block = Queue.new
|
407
|
-
service_b.
|
410
|
+
service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}}) do |response|
|
408
411
|
block << response
|
409
412
|
end
|
410
413
|
response = block.pop
|
@@ -425,7 +428,7 @@ describe AlchemyFlux::Service do
|
|
425
428
|
service_a.start
|
426
429
|
service_b.start
|
427
430
|
|
428
|
-
response = service_b.
|
431
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}})
|
429
432
|
|
430
433
|
expect(response).to eq AlchemyFlux::TimeoutError
|
431
434
|
expect(service_b.transactions.length).to eq 0
|
@@ -444,7 +447,7 @@ describe AlchemyFlux::Service do
|
|
444
447
|
service_a.start
|
445
448
|
service_b.start
|
446
449
|
|
447
|
-
response = service_b.
|
450
|
+
response = service_b.send_request_to_service("fluxa.service", {'body' => {'name' => "Bob"}})
|
448
451
|
|
449
452
|
expect(response['status_code']).to eq 500
|
450
453
|
expect(service_b.transactions.length).to eq 0
|
@@ -458,7 +461,7 @@ describe AlchemyFlux::Service do
|
|
458
461
|
|
459
462
|
service_b.start
|
460
463
|
|
461
|
-
expect(service_b.
|
464
|
+
expect(service_b.send_request_to_service("not_a_servoces.service", {})).to eq AlchemyFlux::MessageNotDeliveredError
|
462
465
|
expect(service_b.transactions.length).to eq 0
|
463
466
|
|
464
467
|
service_b.stop
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy-flux
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Loyalty New Zealand
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -122,20 +122,6 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '2.1'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: msgpack
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0.7'
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0.7'
|
139
125
|
description: Ruby implementation of the Alchemy micro-service framework
|
140
126
|
email:
|
141
127
|
- graham.jenson@loyalty.co.nz
|
@@ -170,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
156
|
version: '0'
|
171
157
|
requirements: []
|
172
158
|
rubyforge_project:
|
173
|
-
rubygems_version: 2.4.
|
159
|
+
rubygems_version: 2.4.8
|
174
160
|
signing_key:
|
175
161
|
specification_version: 4
|
176
162
|
summary: Ruby implementation of the Alchemy micro-service framework
|