legion-transport 0.1.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 +7 -0
- data/.circleci/config.yml +116 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +27 -0
- data/Gemfile +4 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bitbucket-pipelines.yml +24 -0
- data/legion-transport.gemspec +38 -0
- data/lib/legion/transport.rb +20 -0
- data/lib/legion/transport/common.rb +71 -0
- data/lib/legion/transport/connection.rb +18 -0
- data/lib/legion/transport/connections/bunny.rb +53 -0
- data/lib/legion/transport/connections/common.rb +36 -0
- data/lib/legion/transport/connections/marchhare.rb +20 -0
- data/lib/legion/transport/consumer.rb +6 -0
- data/lib/legion/transport/consumers/bunny.rb +11 -0
- data/lib/legion/transport/consumers/common.rb +8 -0
- data/lib/legion/transport/consumers/marchhare.rb +11 -0
- data/lib/legion/transport/exchange.rb +13 -0
- data/lib/legion/transport/exchanges/bunny.rb +28 -0
- data/lib/legion/transport/exchanges/common.rb +32 -0
- data/lib/legion/transport/exchanges/lex.rb +11 -0
- data/lib/legion/transport/exchanges/marchhare.rb +17 -0
- data/lib/legion/transport/exchanges/task.rb +11 -0
- data/lib/legion/transport/message.rb +8 -0
- data/lib/legion/transport/messages/base.rb +22 -0
- data/lib/legion/transport/messages/lex_register.rb +39 -0
- data/lib/legion/transport/messages/node_status.rb +49 -0
- data/lib/legion/transport/messages/task_check_subtask.rb +35 -0
- data/lib/legion/transport/messages/task_subtask.rb +45 -0
- data/lib/legion/transport/messages/task_update.rb +52 -0
- data/lib/legion/transport/queue.rb +13 -0
- data/lib/legion/transport/queues/bunny.rb +26 -0
- data/lib/legion/transport/queues/common.rb +45 -0
- data/lib/legion/transport/queues/marchhare.rb +26 -0
- data/lib/legion/transport/queues/node_status.rb +21 -0
- data/lib/legion/transport/queues/task_log.rb +21 -0
- data/lib/legion/transport/queues/task_update.rb +21 -0
- data/lib/legion/transport/version.rb +5 -0
- data/settings/transport.json +1 -0
- metadata +210 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'legion/transport/connections/common'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Transport
|
5
|
+
module Connections
|
6
|
+
module Marchhare
|
7
|
+
include Legion::Transport::Connections::Common
|
8
|
+
attr_accessor :session, :channel
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
options = options_builder(options)
|
12
|
+
@session = MarchHare.connect(options)
|
13
|
+
@session.start
|
14
|
+
@channel = @session.create_channel
|
15
|
+
Legion::Settings[:transport][:rabbitmq][:connected] = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
module Consumer
|
4
|
+
class Bunny < ::Bunny::Consumer
|
5
|
+
def initialize(queue, no_ack = false, exclusive = false, arguments = {})
|
6
|
+
super(Legion::Transport::Connections.new.channel, queue, '', no_ack, exclusive, arguments)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
module Consumer
|
4
|
+
class Marchhare < ::MarchHare::Consumer
|
5
|
+
def initialize(queue, no_ack = false, exclusive = false, arguments = {})
|
6
|
+
super(Legion::Transport::Connection::Marchhare.new.channel, queue, '', no_ack, exclusive, arguments)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
if RUBY_ENGINE == 'jruby'
|
4
|
+
require 'legion/transport/exchanges/marchhare'
|
5
|
+
class Exchange < Legion::Transport::Exchanges::Marchhare
|
6
|
+
end
|
7
|
+
else
|
8
|
+
require 'legion/transport/exchanges/bunny'
|
9
|
+
class Exchange < Legion::Transport::Exchanges::Bunny
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'legion/transport/exchanges/common.rb'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Transport
|
5
|
+
module Exchanges
|
6
|
+
class Bunny < ::Bunny::Exchange
|
7
|
+
include Legion::Transport::Exchanges::Common
|
8
|
+
def initialize(exchange = exchange_name, options = {})
|
9
|
+
retries ||= 0
|
10
|
+
@options = options
|
11
|
+
@type = options[:type] || default_type
|
12
|
+
|
13
|
+
super(channel, @type, exchange, options_builder(default_options, exchange_options, @options))
|
14
|
+
rescue ::Bunny::PreconditionFailed
|
15
|
+
retries.zero? ? retries = 1 : raise
|
16
|
+
recreate_exchange(channel, @type, exchange)
|
17
|
+
retry
|
18
|
+
end
|
19
|
+
|
20
|
+
def recreate_exchange(channel, type, exchange)
|
21
|
+
Legion::Logging.warn "Exchange:#{exchange} exists with wrong parameters, deleting and creating"
|
22
|
+
exchange = ::Bunny::Exchange.new(channel, type, exchange, no_declare: true)
|
23
|
+
exchange.delete
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
module Exchanges
|
4
|
+
module Common
|
5
|
+
include Legion::Transport::Common
|
6
|
+
|
7
|
+
def default_options
|
8
|
+
hash = {}
|
9
|
+
hash[:durable] = true
|
10
|
+
hash[:auto_delete] = false
|
11
|
+
hash[:arguments] = {}
|
12
|
+
hash
|
13
|
+
end
|
14
|
+
|
15
|
+
def exchange_options
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete(options = {})
|
20
|
+
super(options)
|
21
|
+
true
|
22
|
+
rescue ::Bunny::PreconditionFailed
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
26
|
+
def default_type
|
27
|
+
'topic'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
module Exchanges
|
4
|
+
class Marchhare < ::MarchHare::Exchange
|
5
|
+
attr_accessor :channel
|
6
|
+
def self.create(exchange, _type = :direct, _opts = {})
|
7
|
+
@channel = Legion::Transport::Connections::Marchhare.new
|
8
|
+
new(@channel.channel, exchange, type: :direct, durable: true)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.close
|
12
|
+
@channel.close
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Legion
|
2
|
+
module Transport
|
3
|
+
module Messages
|
4
|
+
module Base
|
5
|
+
include Legion::Transport::Common
|
6
|
+
def publish(_options = {}) # rubocop:disable Metrics/AbcSize
|
7
|
+
validate if @valid.nil?
|
8
|
+
raise unless @valid
|
9
|
+
|
10
|
+
thing = exchange.new
|
11
|
+
thing.publish(message) if routing_key.nil?
|
12
|
+
thing.publish(message, routing_key: routing_key) unless routing_key.nil?
|
13
|
+
thing.close
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate
|
17
|
+
@valid = true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'legion/transport/exchanges/lex'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Transport
|
5
|
+
module Messages
|
6
|
+
class LexRegister < Legion::Transport::Message
|
7
|
+
def initialize(namespace, method, options = {})
|
8
|
+
@namespace = namespace
|
9
|
+
@method = method
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def exchange
|
14
|
+
Legion::Transport::Exchanges::Lex
|
15
|
+
end
|
16
|
+
|
17
|
+
def routing_key
|
18
|
+
'lex.methods.register'
|
19
|
+
end
|
20
|
+
|
21
|
+
def message(namespace = @namespace, method = @method, options = @options)
|
22
|
+
obj = { args: { namespace: namespace, method: method } }
|
23
|
+
obj[:args][:namespace_queue] = options[:namespace][:queue] unless options[:namespace][:queue].nil?
|
24
|
+
obj[:args][:namespace_uri] = options[:namespace][:uri] unless options[:namespace][:uri].nil?
|
25
|
+
Legion::JSON.dump(obj)
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate(namespace = @namespace, _method = @method, _options = @options)
|
29
|
+
raise unless namespace.is_a? String
|
30
|
+
|
31
|
+
# raise unless method.is_a? String
|
32
|
+
# raise unless options.is_a? Hash
|
33
|
+
|
34
|
+
@valid = true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'legion/transport/exchanges/task_update'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Exception
|
5
|
+
class InvalidTaskStatus; end
|
6
|
+
class InvalidTaskId; end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Legion
|
11
|
+
module Transport
|
12
|
+
module Messages
|
13
|
+
# Used for sending a task update, to be moved
|
14
|
+
class TaskUpdate < Legion::Transport::Message
|
15
|
+
attr_accessor :status
|
16
|
+
attr_reader :task_id, :valid
|
17
|
+
def initialize(task_id, status = 'unknown', options = {})
|
18
|
+
@status = status
|
19
|
+
@task_id = task_id
|
20
|
+
@routing_key = options[:routing_key] unless options[:routing_key].nil?
|
21
|
+
@valid = validate
|
22
|
+
end
|
23
|
+
|
24
|
+
def exchange
|
25
|
+
Legion::Transport::Exchanges::Task
|
26
|
+
end
|
27
|
+
|
28
|
+
def message(status = @status, task_id = @task_id)
|
29
|
+
Legion::JSON.dump(status: status, task_id: task_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate(status = @status, task_id = @task_id)
|
33
|
+
raise Legion::Exception::InvalidTaskId unless task_id.is_a? Integer
|
34
|
+
raise Legion::Exception::InvalidTaskStatus unless valid_status.include? status
|
35
|
+
|
36
|
+
@valid = true
|
37
|
+
end
|
38
|
+
|
39
|
+
def valid_status
|
40
|
+
conditioner = ['conditioner.queued', 'conditioner.failed', 'conditioner.exception']
|
41
|
+
transfomer = ['transformer.queued', 'transformer.succeeded', 'transformer.exception']
|
42
|
+
task = ['task.scheduled', 'task.queued', 'task.completed']
|
43
|
+
status = conditioner + transfomer + task
|
44
|
+
status
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'legion/transport/exchanges/task'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Transport
|
5
|
+
module Messages
|
6
|
+
class TaskCheckSubtask < Legion::Transport::Message
|
7
|
+
attr_accessor :status
|
8
|
+
attr_reader :task_id, :valid
|
9
|
+
def initialize(namespace, method, result, _options = {})
|
10
|
+
@namespace = namespace
|
11
|
+
@method = method
|
12
|
+
@result = result
|
13
|
+
@routing_key = 'task.subtask.check'
|
14
|
+
validate
|
15
|
+
end
|
16
|
+
|
17
|
+
def exchange
|
18
|
+
Legion::Transport::Exchanges::Task
|
19
|
+
end
|
20
|
+
|
21
|
+
def message(namespace = @namespace, method = @method, result = @result)
|
22
|
+
Legion::JSON.dump(args: { namespace: namespace, method: method, result: result })
|
23
|
+
end
|
24
|
+
|
25
|
+
def routing_key
|
26
|
+
'task.subtask.check'
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate(_namespace = @namespace, _method = @method, _result = @result, _options = {})
|
30
|
+
@valid = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'legion/transport/exchanges/task'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Transport
|
5
|
+
module Messages
|
6
|
+
class TaskSubTask < Legion::Transport::Message
|
7
|
+
attr_accessor :status
|
8
|
+
attr_reader :task_id, :valid
|
9
|
+
def initialize(relationship_id, trigger_id, conditions, transformations, task_id = nil, options = {}) # rubocop:disable Metrics/ParameterLists,Metrics/LineLength
|
10
|
+
@relationship_id = relationship_id
|
11
|
+
@trigger_id = trigger_id
|
12
|
+
@conditions = conditions
|
13
|
+
@tranformations = transformations
|
14
|
+
@task_id = task_id
|
15
|
+
@options = options
|
16
|
+
@routing_key = 'task.subtask'
|
17
|
+
validate
|
18
|
+
end
|
19
|
+
|
20
|
+
def exchange
|
21
|
+
Legion::Transport::Exchanges::Task
|
22
|
+
end
|
23
|
+
|
24
|
+
def message(relationship_id = @relationship_id, trigger_id = @trigger_id, conditions = @conditions, transformations = @tranformations, task_id = @task_id, options = @options) # rubocop:disable Metrics/ParameterLists,Metrics/LineLength
|
25
|
+
Legion::JSON.dump(args: {
|
26
|
+
relationship_id: relationship_id,
|
27
|
+
trigger_id: trigger_id,
|
28
|
+
conditions: conditions,
|
29
|
+
task_id: task_id,
|
30
|
+
transformations: transformations,
|
31
|
+
options: options
|
32
|
+
})
|
33
|
+
end
|
34
|
+
|
35
|
+
def routing_key
|
36
|
+
'task.subtask'
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate(_namespace = @namespace, _method = @method, _result = @result, _options = {})
|
40
|
+
@valid = true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'legion/transport/exchanges/task'
|
2
|
+
|
3
|
+
module Legion
|
4
|
+
module Exception
|
5
|
+
class InvalidTaskStatus; end
|
6
|
+
class InvalidTaskId; end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Legion
|
11
|
+
module Transport
|
12
|
+
module Messages
|
13
|
+
class TaskUpdate < Legion::Transport::Message
|
14
|
+
attr_accessor :status
|
15
|
+
attr_reader :task_id, :valid
|
16
|
+
def initialize(task_id, status = 'unknown', _options = {})
|
17
|
+
@status = status
|
18
|
+
@task_id = task_id
|
19
|
+
@routing_key = 'task.update'
|
20
|
+
validate
|
21
|
+
end
|
22
|
+
|
23
|
+
def routing_key
|
24
|
+
'task.update'
|
25
|
+
end
|
26
|
+
|
27
|
+
def exchange
|
28
|
+
Legion::Transport::Exchanges::Task
|
29
|
+
end
|
30
|
+
|
31
|
+
def message(status = @status, task_id = @task_id, options = {})
|
32
|
+
Legion::JSON.dump(args: { status: status, task_id: task_id, options: options })
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate(status = @status, task_id = @task_id)
|
36
|
+
raise Legion::Exception::InvalidTaskId unless task_id.is_a? Integer
|
37
|
+
raise Legion::Exception::InvalidTaskStatus unless valid_status.include? status
|
38
|
+
|
39
|
+
@valid = true
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid_status
|
43
|
+
conditioner = ['conditioner.queued', 'conditioner.failed', 'conditioner.exception']
|
44
|
+
transfomer = ['transformer.queued', 'transformer.succeeded', 'transformer.exception']
|
45
|
+
task = ['task.scheduled', 'task.queued', 'task.completed', 'task.exception']
|
46
|
+
status = conditioner + transfomer + task
|
47
|
+
status
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|