legion-transport 0.1.0 → 1.0.0

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