legion-transport 0.1.0 → 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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +12 -12
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/legion-transport.iml +45 -0
  5. data/.idea/misc.xml +7 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vagrant.xml +7 -0
  8. data/.idea/workspace.xml +14 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +1 -8
  11. data/CHANGELOG.md +0 -0
  12. data/Gemfile +0 -1
  13. data/README.md +35 -0
  14. data/legion-transport.gemspec +15 -5
  15. data/lib/legion/transport.rb +11 -9
  16. data/lib/legion/transport/common.rb +23 -18
  17. data/lib/legion/transport/connection.rb +55 -12
  18. data/lib/legion/transport/consumer.rb +7 -1
  19. data/lib/legion/transport/exchange.rb +44 -6
  20. data/lib/legion/transport/exchanges/crypt.rb +11 -0
  21. data/lib/legion/transport/exchanges/node.rb +11 -0
  22. data/lib/legion/transport/message.rb +94 -2
  23. data/lib/legion/transport/messages/check_subtask.rb +25 -0
  24. data/lib/legion/transport/messages/dynamic.rb +24 -0
  25. data/lib/legion/transport/messages/lex_register.rb +11 -19
  26. data/lib/legion/transport/messages/node_health.rb +21 -0
  27. data/lib/legion/transport/messages/request_cluster_secret.rb +32 -0
  28. data/lib/legion/transport/messages/subtask.rb +38 -0
  29. data/lib/legion/transport/messages/task_log.rb +36 -0
  30. data/lib/legion/transport/messages/task_update.rb +3 -23
  31. data/lib/legion/transport/queue.rb +63 -6
  32. data/lib/legion/transport/queues/node.rb +15 -0
  33. data/lib/legion/transport/queues/node_status.rb +1 -1
  34. data/lib/legion/transport/queues/task_log.rb +1 -1
  35. data/lib/legion/transport/queues/task_update.rb +1 -1
  36. data/lib/legion/transport/settings.rb +64 -0
  37. data/lib/legion/transport/version.rb +1 -1
  38. data/settings/transport.json +9 -1
  39. metadata +81 -33
  40. data/lib/legion/transport/connections/bunny.rb +0 -53
  41. data/lib/legion/transport/connections/common.rb +0 -36
  42. data/lib/legion/transport/connections/marchhare.rb +0 -20
  43. data/lib/legion/transport/consumers/bunny.rb +0 -11
  44. data/lib/legion/transport/consumers/common.rb +0 -8
  45. data/lib/legion/transport/consumers/marchhare.rb +0 -11
  46. data/lib/legion/transport/exchanges/bunny.rb +0 -28
  47. data/lib/legion/transport/exchanges/common.rb +0 -32
  48. data/lib/legion/transport/exchanges/marchhare.rb +0 -17
  49. data/lib/legion/transport/messages/base.rb +0 -22
  50. data/lib/legion/transport/messages/node_status.rb +0 -49
  51. data/lib/legion/transport/messages/task_check_subtask.rb +0 -35
  52. data/lib/legion/transport/messages/task_subtask.rb +0 -45
  53. data/lib/legion/transport/queues/bunny.rb +0 -26
  54. data/lib/legion/transport/queues/common.rb +0 -45
  55. data/lib/legion/transport/queues/marchhare.rb +0 -26
@@ -1,13 +1,70 @@
1
1
  module Legion
2
2
  module Transport
3
- if RUBY_ENGINE == 'jruby'
4
- require 'legion/transport/queues/marchhare'
5
- class Queue < Legion::Transport::Queues::Marchhare
3
+ class Queue < Legion::Transport::CONNECTOR::Queue
4
+ include Legion::Transport::Common
5
+
6
+ def initialize(queue = queue_name, options = {})
7
+ retries ||= 0
8
+ @options = options
9
+ super(channel, queue, options_builder(default_options, queue_options, options))
10
+ rescue ::Bunny::PreconditionFailed
11
+ retries.zero? ? retries = 1 : raise
12
+ recreate_queue(channel, queue)
13
+ retry
6
14
  end
7
- else
8
- require 'legion/transport/queues/bunny'
9
- class Queue < Legion::Transport::Queues::Bunny
15
+
16
+ def recreate_queue(channel, queue)
17
+ Legion::Logging.warn "Queue:#{queue} exists with wrong parameters, deleting and creating"
18
+ queue = ::Bunny::Queue.new(channel, queue, no_declare: true, passive: true)
19
+ queue.delete(if_empty: true)
20
+ end
21
+
22
+ def default_options
23
+ hash = {}
24
+ hash[:manual_ack] = true
25
+ hash[:durable] = true
26
+ hash[:exclusive] = false
27
+ hash[:block] = false
28
+ hash[:auto_delete] = false
29
+ hash[:arguments] = { 'x-max-priority': 255,
30
+ 'x-overflow': 'reject-publish',
31
+ 'x-dead-letter-exchange': "#{self.class.ancestors.first.to_s.split('::')[2].downcase}.dlx" }
32
+ hash
33
+ end
34
+
35
+ def queue_options
36
+ {}
37
+ end
38
+
39
+ def queue_name
40
+ ancestor = self.class.ancestors.first.to_s.split('::')
41
+ name = if ancestor[5].scan(/[A-Z]/).length > 1
42
+ ancestor[5].gsub!(/(.)([A-Z])/, '\1_\2').downcase!
43
+ else
44
+ ancestor[5].downcase!
45
+ end
46
+ "#{ancestor[2].downcase}.#{name}"
47
+ end
48
+
49
+ def delete(options = { if_unused: true, if_empty: true })
50
+ super(options)
51
+ true
52
+ rescue ::Bunny::PreconditionFailed
53
+ false
54
+ end
55
+
56
+ def acknowledge(delivery_tag)
57
+ channel.acknowledge(delivery_tag)
58
+ end
59
+
60
+ def reject(delivery_tag, requeue = false)
61
+ channel.reject(delivery_tag, requeue)
10
62
  end
11
63
  end
12
64
  end
13
65
  end
66
+
67
+ require_relative 'queues/node'
68
+ require_relative 'queues/node_status'
69
+ require_relative 'queues/task_log'
70
+ require_relative 'queues/task_update'
@@ -0,0 +1,15 @@
1
+ module Legion
2
+ module Transport
3
+ module Queues
4
+ class Node < Legion::Transport::Queue
5
+ def queue_name
6
+ "node.#{Legion::Settings['client']['name']}"
7
+ end
8
+
9
+ def queue_options
10
+ { durable: false, auto_delete: true, arguments: { 'x-dead-letter-exchange': 'node.dlx' } }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -12,7 +12,7 @@ module Legion
12
12
  hash[:durable] = true
13
13
  hash[:exclusive] = false
14
14
  hash[:block] = false
15
- hash[:arguments] = {}
15
+ hash[:arguments] = { 'x-dead-letter-exchange': 'node.dlx' }
16
16
  hash
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Legion
12
12
  hash[:durable] = true
13
13
  hash[:exclusive] = false
14
14
  hash[:block] = false
15
- hash[:arguments] = { 'x-max-priority': 255 }
15
+ hash[:arguments] = { 'x-max-priority': 255, 'x-dead-letter-exchange': 'task.dlx' }
16
16
  hash
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Legion
12
12
  hash[:durable] = true
13
13
  hash[:exclusive] = false
14
14
  hash[:block] = false
15
- hash[:arguments] = { 'x-max-priority': 252, 'x-dead-letter-exchange': 'task.dlx' }
15
+ hash[:arguments] = { 'x-dead-letter-exchange': 'task.dlx' }
16
16
  hash
17
17
  end
18
18
  end
@@ -0,0 +1,64 @@
1
+ module Legion
2
+ module Transport
3
+ module Settings
4
+ # Legion::Settings.merge_settings('transport', default) if Legion::Settings.method_defined? :merge_settings
5
+ def self.connection
6
+ {
7
+ read_timeout: 1,
8
+ heartbeat: 1,
9
+ automatically_recover: true,
10
+ continuation_timeout: 4000,
11
+ network_recovery_interval: 1,
12
+ connection_timeout: 1,
13
+ user: 'guest',
14
+ password: 'guest',
15
+ host: '127.0.0.1',
16
+ port: '5672',
17
+ vhost: 'legion',
18
+ recovery_attempts: 0,
19
+ logger_level: 'info'
20
+ }.merge(grab_vault_creds)
21
+ end
22
+
23
+ def self.grab_vault_creds
24
+ {} unless Legion::Settings[:vault][:connected]
25
+ lease = Legion::Crypt.read('rabbitmq/creds/legion')
26
+ { user: lease[:username], password: lease[:password] }
27
+ rescue StandardError
28
+ {}
29
+ end
30
+
31
+ def self.default
32
+ {
33
+ type: 'rabbitmq',
34
+ connected: false,
35
+ logger_level: 'info',
36
+ messages: {
37
+ encrypt: false,
38
+ ttl: nil,
39
+ priority: 0
40
+ },
41
+ exchanges: {
42
+ type: 'topic',
43
+ arguments: {},
44
+ auto_delete: false,
45
+ durable: true,
46
+ internal: false
47
+ },
48
+ queues: {
49
+ manual_ack: true,
50
+ durable: true,
51
+ exclusive: false,
52
+ block: false,
53
+ auto_delete: false,
54
+ arguments: { 'x-max-priority': 255, 'x-overflow': 'reject-publish' }
55
+ },
56
+ prefetch: 2,
57
+ connection: connection
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ Legion::Settings.merge_settings('transport', Legion::Transport::Settings.default) if Legion.const_defined?('Settings')
@@ -1,5 +1,5 @@
1
1
  module Legion
2
2
  module Transport
3
- VERSION = '0.1.0'.freeze
3
+ VERSION = '1.0.0'.freeze
4
4
  end
5
5
  end
@@ -1 +1,9 @@
1
- {}
1
+ {"transport": {
2
+ "rabbitmq": {
3
+ "host": "localhost",
4
+ "vhost": "legion",
5
+ "user": "guest",
6
+ "password": "guest"
7
+ }
8
+ }
9
+ }
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-08 00:00:00.000000000 Z
11
+ date: 2020-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: codecov
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +94,62 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: concurrent-ruby
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: concurrent-ruby-ext
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
97
139
  - !ruby/object:Gem::Dependency
98
140
  name: legion-settings
99
141
  requirement: !ruby/object:Gem::Requirement
100
142
  requirements:
101
- - - "~>"
143
+ - - ">="
102
144
  - !ruby/object:Gem::Version
103
- version: '0.1'
145
+ version: '0'
104
146
  type: :development
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
- - - "~>"
150
+ - - ">="
109
151
  - !ruby/object:Gem::Version
110
- version: '0.1'
152
+ version: '0'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: bunny
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -126,16 +168,16 @@ dependencies:
126
168
  name: legion-logging
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
- - - "~>"
171
+ - - ">="
130
172
  - !ruby/object:Gem::Version
131
- version: '0.1'
173
+ version: '0'
132
174
  type: :development
133
175
  prerelease: false
134
176
  version_requirements: !ruby/object:Gem::Requirement
135
177
  requirements:
136
- - - "~>"
178
+ - - ">="
137
179
  - !ruby/object:Gem::Version
138
- version: '0.1'
180
+ version: '0'
139
181
  description: The Legion transport gem
140
182
  email:
141
183
  - matthewdiverson@gmail.com
@@ -145,8 +187,17 @@ extra_rdoc_files: []
145
187
  files:
146
188
  - ".circleci/config.yml"
147
189
  - ".gitignore"
190
+ - ".idea/.rakeTasks"
191
+ - ".idea/legion-transport.iml"
192
+ - ".idea/misc.xml"
193
+ - ".idea/modules.xml"
194
+ - ".idea/vagrant.xml"
195
+ - ".idea/workspace.xml"
196
+ - ".rspec"
148
197
  - ".rubocop.yml"
198
+ - CHANGELOG.md
149
199
  - Gemfile
200
+ - README.md
150
201
  - Rakefile
151
202
  - bin/console
152
203
  - bin/setup
@@ -155,38 +206,36 @@ files:
155
206
  - lib/legion/transport.rb
156
207
  - lib/legion/transport/common.rb
157
208
  - lib/legion/transport/connection.rb
158
- - lib/legion/transport/connections/bunny.rb
159
- - lib/legion/transport/connections/common.rb
160
- - lib/legion/transport/connections/marchhare.rb
161
209
  - lib/legion/transport/consumer.rb
162
- - lib/legion/transport/consumers/bunny.rb
163
- - lib/legion/transport/consumers/common.rb
164
- - lib/legion/transport/consumers/marchhare.rb
165
210
  - lib/legion/transport/exchange.rb
166
- - lib/legion/transport/exchanges/bunny.rb
167
- - lib/legion/transport/exchanges/common.rb
211
+ - lib/legion/transport/exchanges/crypt.rb
168
212
  - lib/legion/transport/exchanges/lex.rb
169
- - lib/legion/transport/exchanges/marchhare.rb
213
+ - lib/legion/transport/exchanges/node.rb
170
214
  - lib/legion/transport/exchanges/task.rb
171
215
  - lib/legion/transport/message.rb
172
- - lib/legion/transport/messages/base.rb
216
+ - lib/legion/transport/messages/check_subtask.rb
217
+ - lib/legion/transport/messages/dynamic.rb
173
218
  - lib/legion/transport/messages/lex_register.rb
174
- - lib/legion/transport/messages/node_status.rb
175
- - lib/legion/transport/messages/task_check_subtask.rb
176
- - lib/legion/transport/messages/task_subtask.rb
219
+ - lib/legion/transport/messages/node_health.rb
220
+ - lib/legion/transport/messages/request_cluster_secret.rb
221
+ - lib/legion/transport/messages/subtask.rb
222
+ - lib/legion/transport/messages/task_log.rb
177
223
  - lib/legion/transport/messages/task_update.rb
178
224
  - lib/legion/transport/queue.rb
179
- - lib/legion/transport/queues/bunny.rb
180
- - lib/legion/transport/queues/common.rb
181
- - lib/legion/transport/queues/marchhare.rb
225
+ - lib/legion/transport/queues/node.rb
182
226
  - lib/legion/transport/queues/node_status.rb
183
227
  - lib/legion/transport/queues/task_log.rb
184
228
  - lib/legion/transport/queues/task_update.rb
229
+ - lib/legion/transport/settings.rb
185
230
  - lib/legion/transport/version.rb
186
231
  - settings/transport.json
187
232
  homepage: https://bitbucket.org/legion-io/legion-transport
188
233
  licenses: []
189
- metadata: {}
234
+ metadata:
235
+ bug_tracker_uri: https://legionio.atlassian.net/projects/TRANSPORT/issues
236
+ changelog_uri: https://bitbucket.org/legion-io/legion-transport/src/master/CHANGELOG.md
237
+ homepage_uri: https://bitbucket.org/legion-io/legion-transport
238
+ wiki_uri: https://bitbucket.org/legion-io/legion-transport/wiki/Home
190
239
  post_install_message:
191
240
  rdoc_options: []
192
241
  require_paths:
@@ -202,8 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
251
  - !ruby/object:Gem::Version
203
252
  version: '0'
204
253
  requirements: []
205
- rubyforge_project:
206
- rubygems_version: 2.7.8
254
+ rubygems_version: 3.0.8
207
255
  signing_key:
208
256
  specification_version: 4
209
257
  summary: Used by Legion to connect with RabbitMQ
@@ -1,53 +0,0 @@
1
- require 'legion/transport/connections/common'
2
-
3
- module Legion
4
- module Transport
5
- module Connections
6
- module Bunny
7
- @@session = nil # rubocop:disable Style/ClassVars
8
- include Legion::Transport::Connections::Common
9
- attr_accessor :session, :channel
10
-
11
- def initialize(options = {})
12
- options = options_builder(options)
13
- create_session(options)
14
- @channel = @session.create_channel
15
- Legion::Settings[:transport][:rabbitmq][:connected] = true
16
- end
17
-
18
- def create_session(options = {})
19
- Legion::Logging.debug 'Creating Legion::Transport session'
20
- if options[:create_new_session]
21
- @session = ::Bunny.new(options)
22
- @session.start
23
- elsif @@session.nil? || @@session.closed?
24
- @@session = ::Bunny.new(options) # rubocop:disable Style/ClassVars
25
- @@session.start
26
- @session = @@session
27
- else
28
- Legion::Logging.debug "Using session:#{@@session.channel_id_allocator} from @@session"
29
- @session = @@session
30
- end
31
- rescue NameError
32
- Legion::Logging.debug 'Legion::Transport::Connection doesn\'t have a class variable session'
33
- @session = ::Bunny.new(options)
34
- @session.start
35
- end
36
-
37
- def valid_session?(session = @session)
38
- false if session.nil? || session.empty?
39
- false unless session.is_a? Bunny::Session
40
- false if session.closed?
41
- true
42
- end
43
-
44
- def valid_channel?(channel = @channel)
45
- false if channel.nil? || session.empty?
46
- false unless channel.is_a? Bunny::Session
47
- false if channel.closed?
48
- true
49
- end
50
- end
51
- end
52
- end
53
- end